进阶第六课 Python模块之string

对字符串做格式化操作

>>> 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位随机码。

wD0BLC9a
o3hcgkGK
9eJfqrBc
Wh0npqk9
KFozij0w
oNf5OBeN
uJPseRXy
plhc2suV
03fcyfHT
mIuFpmYu
sZOljZuM
e4IHy66U
YApsefoE
2nc47nQ8
Mzxiehm6
Vt5HqVJU
lWuW02HH
i7RFehQ9
zbxCE9Nt
ugpBQmhT

如果要定制其他长度的随机码,可以吧函数中的参数默认值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 string
import random

how_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}]
Cart
1 * coke = 11
6 * cake = 12
4 * fish = 1
Total: 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))

 

posted @ 2018-03-30 19:32  驼背蜗牛  阅读(317)  评论(0编辑  收藏  举报