一、字符串格式化
1、字符串格式化使用字符串格式化操作符,即%来实现。在%的左侧放置一个字符串(格式化字符串),而右侧则放置希望格式化的值。可以使用一个值,如一个字符串或者数字,也可以使用多个值的元组或者字典。一般情况下使用元组:
>>> format = 'Hello, %s. %s enough for ya?' >>> values = ('world', 'Hot') >>> print format % values Hello, world. Hot enough for ya?
注:(1)如果使用列表或者其他序列代替元组,那么序列就会被解释成一个值。只有元组和字典可以格式化一个以上的值。
(2)如果要在格式化字符串里面包括百分号,那么必须使用%%,这样Python就不会将百分号误认为是转换说明符了。
>>> format = 'The rate is %s%, so low' >>> values = 31.0 >>> print format % values Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: not enough arguments for format string
>>> format = 'The rate is %s%%, so low' >>> values = 31.0 >>> print format % values The rate is 31.0%, so low
2、
Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法;
Python是完全面向对象的语言, 任何东西都是对象;
字符串的参数使用{NUM}进行表示,0, 表示第一个参数,1, 表示第二个参数, 以后顺次递加;
使用":", 指定代表元素需要的操作, 如":.3"小数点三位, ":8"占8个字符空间等;
还可以添加特定的字母, 如:
'b' - 二进制. 将数字以2为基数进行输出.
'c' - 字符. 在打印之前将整数转换成对应的Unicode字符串.
'd' - 十进制整数. 将数字以10为基数进行输出.
'o' - 八进制. 将数字以8为基数进行输出.
'x' - 十六进制. 将数字以16为基数进行输出, 9以上的位数用小写字母.
'e' - 幂符号. 用科学计数法打印数字, 用'e'表示幂.
'g' - 一般格式. 将数值以fixed-point格式输出. 当数值特别大的时候, 用幂形式打印.
'n' - 数字. 当值为整数时和'd'相同, 值为浮点数时和'g'相同. 不同的是它会根据区域设置插入数字分隔符.
'%' - 百分数. 将数值乘以100然后以fixed-point('f')格式打印, 值后面会有一个百分号.
数字(0, 1, ...)即代表format()里面的元素, 所以可以使用"."调用元素的方法;
代码如下:
age = 25 name = 'Caroline' print('{0} is {1} years old. '.format(name, age)) #输出参数 print('{0} is a girl. '.format(name)) print('{0:.3} is a decimal. '.format(1/3)) #小数点后三位 print('{0:_^11} is a 11 length. '.format(name)) #使用_补齐空位 print('{first} is as {second}. '.format(first=name, second='Wendy')) #别名替换 print('My name is {0.name}'.format(open('out.txt', 'w'))) #调用方法 print('My name is {0:8}.'.format('Fred')) #指定宽度
二、模块
在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来引入。在调用math模块中的函数时,必须这样引用:
模块名.函数名
为什么必须加上模块名这样调用呢?因为可能存在这样一种情况:在多个模块中含有相同名称的函数,此时如果只是通过函数名来调用,解释器无法知道到底要调用哪个函数。所以如果像上述这样引入模块的时候,调用函数必须加上模块名。
import math #这样会报错 print sqrt(2) #这样才能正确输出结果 print math.sqrt(2)
有时候我们只需要用到模块中的某个函数,只需要引入该函数即可,此时可以通过语句
from 模块名 import 函数名1,函数名2....
来实现,当然可以通过不仅仅可以引入函数,还可以引入一些常量。通过这种方式引入的时候,调用函数时只能给出函数名,不能给出模块名,但是当两个模块中含有相同名称函数的时候,后面一次引入会覆盖前一次引入。也就是说假如模块A中有函数function( ),在模块B中也有函数function( ),如果引入A中的function在先、B中的function在后,那么当调用function函数的时候,是去执行模块B中的function函数。
如果想一次性引入math中所有的东西,还可以通过from math import *来实现,但是不建议这么做。
定义自己的模块
在Python中,每个Python文件都可以作为
def add(a,b): return a+b
python常用模块
os模块: os.remove() 删除文件 os.unlink() 删除文件 os.rename() 重命名文件 os.listdir() 列出指定目录下所有文件 os.chdir() 改变当前工作目录 os.getcwd() 获取当前文件路径 os.mkdir() 新建目录 os.rmdir() 删除空目录(删除非空目录, 使用shutil.rmtree()) os.makedirs() 创建多级目录 os.removedirs() 删除多级目录 os.stat(file) 获取文件属性 os.chmod(file) 修改文件权限 os.utime(file) 修改文件时间戳 os.name(file) 获取操作系统标识 os.system() 执行操作系统命令 os.execvp() 启动一个新进程 os.fork() 获取父进程ID,在子进程返回中返回0 os.execvp() 执行外部程序脚本(Uinx) os.spawn() 执行外部程序脚本(Windows) os.access(path, mode) 判断文件权限(详细参考cnblogs) os.wait() 暂时未知 os.path模块: os.path.split(filename) 将文件路径和文件名分割(会将最后一个目录作为文件名而分离) os.path.splitext(filename) 将文件路径和文件扩展名分割成一个元组 os.path.dirname(filename) 返回文件路径的目录部分 os.path.basename(filename) 返回文件路径的文件名部分 os.path.join(dirname,basename) 将文件路径和文件名凑成完整文件路径 os.path.abspath(name) 获得绝对路径 os.path.splitunc(path) 把路径分割为挂载点和文件名 os.path.normpath(path) 规范path字符串形式 os.path.exists() 判断文件或目录是否存在 os.path.isabs() 如果path是绝对路径,返回True os.path.realpath(path) #返回path的真实路径 os.path.relpath(path[, start]) #从start开始计算相对路径 os.path.normcase(path) #转换path的大小写和斜杠 os.path.isdir() 判断name是不是一个目录,name不是目录就返回false os.path.isfile() 判断name是不是一个文件,不存在返回false os.path.islink() 判断文件是否连接文件,返回boolean os.path.ismount() 指定路径是否存在且为一个挂载点,返回boolean os.path.samefile() 是否相同路径的文件,返回boolean os.path.getatime() 返回最近访问时间 浮点型 os.path.getmtime() 返回上一次修改时间 浮点型 os.path.getctime() 返回文件创建时间 浮点型 os.path.getsize() 返回文件大小 字节单位 os.path.commonprefix(list) #返回list(多个路径)中,所有path共有的最长的路径 os.path.lexists #路径存在则返回True,路径损坏也返回True os.path.expanduser(path) #把path中包含的"~"和"~user"转换成用户目录 os.path.expandvars(path) #根据环境变量的值替换path中包含的”$name”和”${name}” os.path.sameopenfile(fp1, fp2) #判断fp1和fp2是否指向同一文件 os.path.samestat(stat1, stat2) #判断stat tuple stat1和stat2是否指向同一个文件 os.path.splitdrive(path) #一般用在windows下,返回驱动器名和路径组成的元组 os.path.walk(path, visit, arg) #遍历path,给每个path执行一个函数详细见手册 os.path.supports_unicode_filenames() 设置是否支持unicode路径名
sys模块: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.modules.keys() 返回所有已经导入的模块列表 sys.modules 返回系统导入的模块字段,key是模块名,value是模块 sys.exc_info() 获取当前正在处理的异常类,exc_type、exc_value、exc_traceback当前处理的异常详细信息 sys.exit(n) 退出程序,正常退出时exit(0) sys.hexversion 获取Python解释程序的版本值,16进制格式如:0x020403F0 sys.version 获取Python解释程序的版本信息 sys.platform 返回操作系统平台名称 sys.stdout 标准输出 sys.stdout.write('aaa') 标准输出内容 sys.stdout.writelines() 无换行输出 sys.stdin 标准输入 sys.stdin.read() 输入一行 sys.stderr 错误输出 sys.exc_clear() 用来清除当前线程所出现的当前的或最近的错误信息 sys.exec_prefix 返回平台独立的python文件安装的位置 sys.byteorder 本地字节规则的指示器,big-endian平台的值是'big',little-endian平台的值是'little' sys.copyright 记录python版权相关的东西 sys.api_version 解释器的C的API版本 sys.version_info 'final'表示最终,也有'candidate'表示候选,表示版本级别,是否有后继的发行 sys.getdefaultencoding() 返回当前你所用的默认的字符编码格式 sys.getfilesystemencoding() 返回将Unicode文件名转换成系统文件名的编码的名字 sys.builtin_module_names Python解释器导入的内建模块列表 sys.executable Python解释程序路径 sys.getwindowsversion() 获取Windows的版本 sys.stdin.readline() 从标准输入读一行,sys.stdout.write("a") 屏幕输出a sys.setdefaultencoding(name) 用来设置当前默认的字符编码(详细使用参考文档) sys.displayhook(value) 如果value非空,这个函数会把他输出到sys.stdout(详细使用参考文档)
datetime,date,time模块: datetime.date.today() 本地日期对象,(用str函数可得到它的字面表示(2014-03-24)) datetime.date.isoformat(obj) 当前[年-月-日]字符串表示(2014-03-24) datetime.date.fromtimestamp() 返回一个日期对象,参数是时间戳,返回 [年-月-日] datetime.date.weekday(obj) 返回一个日期对象的星期数,周一是0 datetime.date.isoweekday(obj) 返回一个日期对象的星期数,周一是1 datetime.date.isocalendar(obj) 把日期对象返回一个带有年月日的元组 datetime对象: datetime.datetime.today() 返回一个包含本地时间(含微秒数)的datetime对象 2014-03-24 23:31:50.419000 datetime.datetime.now([tz]) 返回指定时区的datetime对象 2014-03-24 23:31:50.419000 datetime.datetime.utcnow() 返回一个零时区的datetime对象 datetime.fromtimestamp(timestamp[,tz]) 按时间戳返回一个datetime对象,可指定时区,可用于strftime转换为日期表示 datetime.utcfromtimestamp(timestamp) 按时间戳返回一个UTC-datetime对象 datetime.datetime.strptime('2014-03-16 12:21:21',"%Y-%m-%d %H:%M:%S") 将字符串转为datetime对象 datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d %H%M%S') 将datetime对象转换为str表示形式 datetime.date.today().timetuple() 转换为时间戳datetime元组对象,可用于转换时间戳 datetime.datetime.now().timetuple() time.mktime(timetupleobj) 将datetime元组对象转为时间戳 time.time() 当前时间戳 time.localtime time.gmtime
hashlib,md5模块: hashlib.md5('md5_str').hexdigest() 对指定字符串md5加密 md5.md5('md5_str').hexdigest() 对指定字符串md5加密
random模块: random.random() 产生0-1的随机浮点数 random.uniform(a, b) 产生指定范围内的随机浮点数 random.randint(a, b) 产生指定范围内的随机整数 random.randrange([start], stop[, step]) 从一个指定步长的集合中产生随机数 random.choice(sequence) 从序列中产生一个随机数 random.shuffle(x[, random]) 将一个列表中的元素打乱 random.sample(sequence, k) 从序列中随机获取指定长度的片断
string模块: str.capitalize() 把字符串的第一个字符大写 str.center(width) 返回一个原字符串居中,并使用空格填充到width长度的新字符串 str.ljust(width) 返回一个原字符串左对齐,用空格填充到指定长度的新字符串 str.rjust(width) 返回一个原字符串右对齐,用空格填充到指定长度的新字符串 str.zfill(width) 返回字符串右对齐,前面用0填充到指定长度的新字符串 str.count(str,[beg,len]) 返回子字符串在原字符串出现次数,beg,len是范围 str.decode(encodeing[,replace]) 解码string,出错引发ValueError异常 str.encode(encodeing[,replace]) 解码string str.endswith(substr[,beg,end]) 字符串是否以substr结束,beg,end是范围 str.startswith(substr[,beg,end]) 字符串是否以substr开头,beg,end是范围 str.expandtabs(tabsize = 8) 把字符串的tab转为空格,默认为8个 str.find(str,[stat,end]) 查找子字符串在字符串第一次出现的位置,否则返回-1 str.index(str,[beg,end]) 查找子字符串在指定字符中的位置,不存在报异常 str.isalnum() 检查字符串是否以字母和数字组成,是返回true否则False str.isalpha() 检查字符串是否以纯字母组成,是返回true,否则false str.isdecimal() 检查字符串是否以纯十进制数字组成,返回布尔值 str.isdigit() 检查字符串是否以纯数字组成,返回布尔值 str.islower() 检查字符串是否全是小写,返回布尔值 str.isupper() 检查字符串是否全是大写,返回布尔值 str.isnumeric() 检查字符串是否只包含数字字符,返回布尔值 str.isspace() 如果str中只包含空格,则返回true,否则FALSE str.title() 返回标题化的字符串(所有单词首字母大写,其余小写) str.istitle() 如果字符串是标题化的(参见title())则返回true,否则false str.join(seq) 以str作为连接符,将一个序列中的元素连接成字符串 str.split(str='',num) 以str作为分隔符,将一个字符串分隔成一个序列,num是被分隔的字符串 str.splitlines(num) 以行分隔,返回各行内容作为元素的列表 str.lower() 将大写转为小写 str.upper() 转换字符串的小写为大写 str.swapcase() 翻换字符串的大小写 str.lstrip() 去掉字符左边的空格和回车换行符 str.rstrip() 去掉字符右边的空格和回车换行符 str.strip() 去掉字符两边的空格和回车换行符 str.partition(substr) 从substr出现的第一个位置起,将str分割成一个3元组。 str.replace(str1,str2,num) 查找str1替换成str2,num是替换次数 str.rfind(str[,beg,end]) 从右边开始查询子字符串 str.rindex(str,[beg,end]) 从右边开始查找子字符串位置 str.rpartition(str) 类似partition函数,不过从右边开始查找 str.translate(str,del='') 按str给出的表转换string的字符,del是要过虑的字符
三、生成器和迭代器
1迭代器
对于原生支持随机访问的数据结构(如tuple、list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值)。但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式。
另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件,或是斐波那契数列等等。
迭代器更大的功劳是提供了一个统一的访问集合的接口,只要定义了__iter__()方法对象,就可以使用迭代器访问。
迭代器有两个基本的方法
- next方法:返回迭代器的下一个元素
- __iter__方法:返回迭代器对象本身
class Fabs(object): def __init__(self,max): self.max = max self.n, self.a, self.b = 0, 0, 1 #特别指出:第0项是0,第1项是第一个1.整个数列从1开始 def __iter__(self): return self def next(self): if self.n < self.max: r = self.b self.a, self.b = self.b, self.a + self.b self.n = self.n + 1 return r raise StopIteration() print Fabs(5) for key in Fabs(5): print key
2、生成器
带有 yield 的函数在 Python 中被称之为 generator(生成器)
def fab(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n = 1
简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。
也可以手动调用 fab(5) 的 next() 方法(因为 fab(5) 是一个 generator 对象,该对象具有 next() 方法),这样我们就可以更清楚地看到 fab 的执行流程: