对字符串做格式化操作
>>> import string>>> dir(string)['Formatter', 'Template', '_ChainMap', '_TemplateMetaclass', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']
1、string.capwords()
把字符串中所有单词的首字母均变成大写字母。看例子:
>>> a='Tom is a boy and Kate is a girl.'>>> import string>>> b=string.capwords(a)>>> b'Tom Is A Boy And Kate Is A Girl.'
2、string.ascii_letters
>>> string.ascii_letters 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
3、string.ascii_lowercase
26个小写英语字母
>>> string.ascii_lowercase'abcdefghijklmnopqrstuvwxyz'
4、string.ascii_uppercase
26个大写英语字母
>>> string.ascii_uppercase'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
5、string.digits
>>> string.digits '0123456789'
有人会问,0-9和大小写英语字母的用处是什么?网上找到一个特别好的示例:
比如需要随机生成8位码,里面有数字和大小写英语字母。
>>> import random >>> import string >>> def suijima(geshu,len=8): a=open('suijima.txt','w') for i in range(geshu): d='' c=string.ascii_letters+string.digits for i in range(8): b=random.choice(c) d=d+b a.write('{0}\n'.format(d)) a.close() >>> suijima(20)
自己的代码烂。分析一下:
5.1 def开头,没什么说的。函数名suijima,有2个参数:一个是输出随机码的个数,另一个是随机码位数(且这个参数有默认值8,意味着调用这个函数时不需要提供这个参数!)5.2 open 打开一个文件(后面有讲到,可以看进阶第十八课),命名suijima,‘w’是写模式。
5.3 既然要生成geshu个随机码,自然就要用到for循环,range的参数就是个数。
5.4 命名一个变量d,是空字符串,这就是最后的随机码。
5.5 把大小写英语字母和0-9以字符串的形式赋值给c。意味着c的值是:
>>> c=string.ascii_letters+string.digits>>> c'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
5.6 因为设定了随机码的位数,也就是8位,所以每一位都是从c中随机取值,再来一个for循环,range(8)。
5.7 执行字符串累加。最后等到1个8位随机码。
5.8 把生成的1个8位随机码写入suijima.txt,格式可参考str.format。
5.9 外层循环geshu次,每次生成一个8位随机码,每生成一个就完成一次写入.suijima.txt操作。
5.10 完成后,关闭suijima.txt。
调用函数:
>>> suijima(20)
这时去python.exe所在目录就能看到函数生成的suijima.txt文档,打开可以看到函数生成的20个8位随机码。
wD0BLC9ao3hcgkGK9eJfqrBcWh0npqk9KFozij0woNf5OBeNuJPseRXyplhc2suV03fcyfHTmIuFpmYusZOljZuMe4IHy66UYApsefoE2nc47nQ8Mzxiehm6Vt5HqVJUlWuW02HHi7RFehQ9zbxCE9NtugpBQmhT
如果要定制其他长度的随机码,可以吧函数中的参数默认值8去除,同时在倒数第三行把range(8)改为range(len)即可。
def randomcode(how_many,length): a=open('randomcode.txt','w') for i in range(how_many): ran_code='' b=string.ascii_letters+string.digits for j in range(length): c=random.choice(b) ran_code+=c a.write('{0}\n'.format(ran_code)) a.close()
只是调用这个函数时,必须要输入2个参数且位置不可调到,或者指定参数名就可以颠倒顺序。
在IDLE中的自定义函数,一旦IDLE关闭这个函数就消失了。可以做成一个自己的模块:
a)在IDLE中安Ctrl+N,打开一个新窗口
b)输入下列代码
c)Ctrl+S保存到默认目录并命名,比如randomcode200
import stringimport randomhow_many=int(input("需要多少个随机码:")) #input得到的是字符串,为了在下面的range()使用输入值,需要转换为整型length=int(input("每个随机码有多少位:")) #同上a=open('randomcode200.txt','w')for i in range(how_many): b='' c=string.ascii_letters+string.digits for j in range(length): d=random.choice(c) b=b+d a.write('{0}\n'.format(b))a.close()
d)回到IDLE,执行:
>>> import randomcode200需要多少个随机码:10每个随机码有多少位:50
e)去python.exe所在文件夹就能看到randomcode200.txt这个文件,打开可以看到10个50位的随机码。
6、string.hexdigits
十六进制数的数字
>>> string.hexdigits'0123456789abcdefABCDEF'
7、string.octdigits
八进制数的数字
>>> string.octdigits'01234567'
8、string.printable
>>> string.printable'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
9、string.punctuation
>>> string.punctuation'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
10、string.whitespace
>>> string.whitespace' \t\n\r\x0b\x0c'
2、Template
指定文档模板,把字符串按照指定模板的格式输出。
具体可以看这个链接的讲解:
https://www.cnblogs.com/subic/p/6552752.html
https://www.cnblogs.com/tiecheng/p/6018512.html
Template是string库中的一部分。
2.1Template的作用:
Template是含有占位符($)的字符串。
使用字典把值映射到模板中。
占位符后面跟着的变量名要符合Python变量名的命名规则。
格式:Template("$apple is my favorite $fruit"),当这个模板被调用并被打印时,就能打印出字典中键是‘apple’和'fruit'对应的值。
2.2 示例
>>> def super_market(): cart = [] cart.append(dict(item='coke',price=11,qty= 1)) cart.append(dict(item='cake',price=12,qty=6)) cart.append(dict(item='fish',price = 1,qty =4)) t = Template("$qty * $item = $price") total = 0 print(cart) print("Cart") for data in cart: print(t.substitute(data)) total += data["price"] print("Total: %s"%(total,)) >>> super_market()[{ 'item': 'coke', 'price': 11, 'qty': 1}, { 'item': 'cake', 'price': 12, 'qty': 6}, { 'item': 'fish', 'price': 1, 'qty': 4}]Cart1 * coke = 116 * cake = 124 * fish = 1Total: 24
f分析一下:
a)自定义函数super_market()。
b)建立空列表对象cart。
c)cart中添加3个字典对象,每个字典对象有3个键:值对儿。
d)新建Template模板t,格式为
Template("$qty * $item = $price"),注意这里的变量名要与上一步中的字典对象的键相同。
e)双引号中就是这个模板的格式,通过:print(模板.substitute(字典))就能打印出键的值。
print(t.substitute(data))