字符串
字符串格式化
>>>format = "Pi with three decimals : %.3f"
>>>from math import pi
>>> print(format % pi)
Pi with three decimals : 3.142
%s —用str转换任意python对象—-让字符串更容易阅读
%r —用repr转换任意python对象—将字符串转换为合法的python表达式
转换说明符 —— % (可以包括字段宽度和精度,字段宽度是转换后的值所保留的最小字符个数,精度(对于数字转换来说)则是结果中应该包含的小数位数,或者(对于字符串来说)是转换后的值所能包含的最大字符个数。
>>> '%10f' % pi #字段宽度 10
' 3.141593'
>>> '%10.2f' % pi #字段宽度 10 精度 2
' 3.14'
>>> '%.2f' % pi
'3.14'
>>> '%.5s' % 'Guido van Rossum'
'Guido'
可以使用*作为字段宽度或精度,此时数值从元组的参数中读出
>>> '%.*s' % (5, 'Guido van Rossum')
'Guido'
代码举例
#格式化一张包含水果价格的表格,表格的总宽度由用书输入。因为是用户提供信息,
#所以就不能在转换说明符中将字段宽度硬编码,使用*号运算符就可以从转换元组中读出字段宽度
width = int(input("Please enter width: ")) #input返回的是字符串,不能用于与数字相减
price_width = 10
item_width = width - price_width
header_format = '%-*s%*s' #对表格头进行格式化,-表示左对齐 也就是把‘Item’左对齐
format = '%-*s%*.2f' #对价格要求保留两位小数,宽度选择从元组中获取
print ('='*width)
print (header_format % (item_width, 'Item', price_width, 'Price'))
print ('-'*width)
print (format % (item_width, 'Apples', price_width, 0.4))
print (format % (item_width, 'Pears', price_width, 0.5))
print (format % (item_width, 'Cantaloupes', price_width, 1.92))
print (format % (item_width, 'Dried Apricots(16 oz.)', price_width, 8))
print (format % (item_width, 'Prunes (4 lbs.)', price_width, 12))
-------------
Please enter width: 40
========================================
Item Price
----------------------------------------
Apples 0.40
Pears 0.50
Cantaloupes 1.92
Dried Apricots(16 oz.) 8.00
Prunes (4 lbs.)
字符串方法
1、join 用于连接序列中的元素
- 只能用于连接字符串元素
- A.join(B) A表示用什么连接符号, B 表示连接的序列
e.g.
>>> dirs = '', 'usr', 'bin', 'env'
>>>> '/'.join(dirs)
'/usr/bin/env'
>>> print('C:'+ '\\'.join(dirs))
C:\usr\bin\env
2、string.capwords(s[,sep]) — 用split函数分割字符串s(以sep为分隔符),使用capitalize函数将分割得到的各单词首字母大写,兵器使用join函数以sep为分隔符将各单词连接起来
>>> import string
>>> string.capwords("that's all, folks")
"That's All, Folks"
字典
一种通过名字来引用值的数据结构—-也叫映射(mapping)为了可以通过轻松查找某个特定的词语(键),从而找到它的意义(值)。
重点:电话号码(以及其他可能以0开头的数字)应该表示为数字字符串,而不是整数。—-若存为整数则可能被认为是8进制数。
定义:phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
如上名字是键,电话号码是值,两个组合称为项。字典中的键是唯一的(其他类型的映射也是如此),而值并不唯一。
创建字典的—dict函数
>>> items = [('name', 'Gumby'), ('age', 42)]
>>> d = dict(items)
>>> d
{'name': 'Gumby', 'age': 42}
>>> d['name']
'Gumby'
>>> d = dict(name='Gumby', age=42)
>>> d
{'name': 'Gumby', 'age': 42}
字典与序列
相似:
- len(d)返回d中项的数量;
- d[k]返回关联键k上的值;
- d[k]=v将值v关联到键k上;
- del d[k]删除键为k的项;
k in d检查d中是否有键为k的项;
区别:
键类型:字典的键可以是任意的不可变类型,比如浮点型(实型)、字符串或者元组
- 自动添加:即使键期初在字典中并不存在,也可以为它赋值,这样字典就会建立新的项,而列表不能给不存在的索引赋值
成员资格:在k in d(d为字典)查找的是键(键找到后就可以找到值了),而v in l(l为列表)查找的是值。并且在字典中查键的操作更加高效(数据量越大越有差距)
其实列表的索引可以理解为字典的键,都可以找到对应的值。
代码块
#一个简单的数据库
#字典使用人名作为键,每个人用另一个字典来表示,其键‘phone’和‘addr’分别表示他们的电话号码和地址
people = {
'Alice': {
'phone':'2341',
'addr':'Foo drive 23'
},
'Beth': {
'phone': '9102',
'addr': 'Bar street 42'
},
'Cecil': {
'phone': '3158',
'addr': 'Baz avenue 90'
}
}
#针对电话号码和地址使用的描述性标签,会在打印输出的时候好用
labels = {
'phone': 'phone number',
'addr': 'address'
}
name = input('Name:')
#查找电话号码还是地址?
request = input('Phone number(p) or address (a) ?')
#使用正确的键:
if request == 'p': key = 'phone'
if request == 'a': key = 'addr'
#如果名字是字典中的有效键才能打印信息:
if name in people:print(("%s's %s is %s")%(name, labels[key], people[name][key]))
============= RESTART: /Users/apple/Desktop/python/dictionary.py =============
Name:Beth
Phone number(p) or address (a) ?p
Beth's phone number is 9102
格式化字符串
在模板系统中非常有用
>>> template = '''<html>
<head><title>%(title)s</title></head>
<body>
<h1>%(title)s</h1>
<p>$(text)s</p>
</body>'''
>>> data = {'title': 'My home Page', 'text': 'Welcome to my home page!'}
>>> print(template % data)
<html>
<head><title>My home Page</title></head>
<body>
<h1>My home Page</h1>
<p>$(text)s</p>
</body>
浅复制 — copy 和深复制 — deepcopy
浅复制相当于复制后两个字典的值是共用的如果有修改则两个字典都会修改,除非整个替换
深复制就相当于将整个字典复制一个副本出来,两个字典的修改不会相互产生影响。