字符串
一种常用的、不可变的序列
1.字符串的基本操作
序列的绝大部分基本操作对字符串同样适用(索引、分片、乘法、判断成员资格、求长度、取最小值和最大值)
但是字符串不可变,对字符串按索引赋值或者分片赋值都是不合法的
2.字符串格式化:精简版
字符串格式化操作符为'%'
格式: 格式化字符串 % 值
多个值时只能使用字典或者元组格式化(其他序列时会被解释为一个值)
举例1:
format ='hello %s. %s enouth for ya?'
values=('world','Hot')
print format % values
#格式化字符串中,%s标记了需要插入内容位置,s表示值会被格式化为字符串,不是字符串自动用函数str转换
#如果要在被格式化字符串使用百分号,使用'%%'
举例2:
'%s plus %s equals %s' % (1,1,2)
#当值为元组或者字典时,可以初始化多个元素,每个值对应一个转换说明符
#当值为元组,一定要加上'()'
模版字符串
string模版提供的另外一种格式化字符串方法,工作方式类似于UNIX Shell里的变量替换。
举例1:
from string import Template
s=Template('$x, glorious $x!')
#Tmpplate设置字符串
s.substitute(x='slurm')
#substitute用传递过来的关键字参数替换字符串中的‘$关键字',关键字可以自己设置
举例2:
s=Template("It's ${x}tastic! $$")
s.substitute(x='slurm')
#替换字段为单词的一部分时,用大括号'{}"括起来
#字符串中,可以采用$$插入美元符号
举例3:
s=Template('A $thing must never $action.')
d={}
d['thing']='gentleman'
d['action']='show his socks'
s.substitute(d)
#substitute参数亦可为字典
#safe_substitute不会因为缺少值或者不正确使用$字符而出错
3.字典格式化:完整版
基本的转换说明符包含以下5个部分,必须按照顺序书写
(1)%字符(必写)
(2)转换标志:
'-'表示左对齐
'+'表示在转换值之前加上正负号
' '(空白字符)表示在正书之前加上空格
'0'(数字)表示转换值若位数不够用0填充
(3)最小字段宽度:直接用数字表示,如果是'*',宽度会从值元组中读出
(4)精度值:'.数字'
如果是字符串需要时是实数,数字表示的是小数点后的位数;如果是字符串,数字表示的是最大字段宽度;
如果是'*',精度将从元组中读出
(5)转换类型
字段宽度和精度举例:
from math import pi
print'%10f' % pi #字段宽度为10
print'%10.2f' % pi #字段宽度为10 ,精度为2
print'%.2f' %pi #字段精度为2
print '%.*s' %(5,'Guido ban Rossum') #字段精度从元组中读出
4.字符串方法
字符串从string模块中‘继承’了很多方法
以下是一些常用的字符串常量:
string.digits:包含0-9的字符串
string.letters:包含所有字母的字符串(包含大小写)
string.lowercase:包含所有小写字母的字符串
string.printable:包含所有可打印字符的字符串
string.punctuation:包含所有标点的字符串
sting.uppercase:包含所有大写字母的字符串
(1)find:在一个字符串中查找子串,返回子串所在位置最左端索引,没找到则返回-1
(2)join:用来连接序列中的元素,split方法的逆方法
(3)lower:返回字符串的小写字母版
title方法会将字符串转换成标题(首字母大写,但是识别单词并不准确)
string模块的capwords函数可能比title方法好用,但是正确的标题可能还是需要手动输入:
(4)replace:返回字符串所有匹配值被替换后的字符串
(5)split:将字符串分割成序列,join的逆方法
(6)strip:返回去除两侧空格的字符串:
(7)translate:对字符串中的单个字符进行替换
对于某些非英语字符串无法用常规方法处理时,可以考虑Unicode或者locale模块
字典
字典是python唯一内建的映射(一种通过键引用值的数据结构)
键可以是数字、字符串、元素
字典中元素没有顺序
字典的键是唯一的,但是值不唯一
1.创建和引用
字典用大括号表示,由多个键-值(项)对组成,键和值用‘:’隔开;项之间用‘,’隔开,举例如下:
(1)phonebook={'Alice':'2341','Beth','9102'}
(2)dict()函数,可以通过其他映射(如果是字典,此时函数相当于copy())或者(键,值)对的序列建立字典
items=[('name','Gumby'),('age',42)]
d=dict(items)
(3)dict()函数,亦可通过关键字参数创建字典
d=dict(name='Gumby',age=42)
2.字典基本操作
以下操作方式与序列相同,参考前文:
求长度、按索引求值、赋值、删除、检查键的成员资格
字典和列表的区别:
(1)字典的键可以是任意不可变类型,如整数、浮点型(实型)、字符串或者元组
(2)字典的键可以动态添加;但是列表不调用append或者类似方法情况下,不可以将值关联到列表范围以外的索引上
(3)表达式k in d(字典)查找的是键,而不是值;但是k in l(列表)查找的是值,而不是索引
3.用字典格式化字符串
在转换说明符%的后面加上用圆括号括起来的键
举例1:
phonebook={'Cecil':'9102'}
'Cecil\'s phone number is %(Cecil)s.' %phonebook
举例2:
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
4.字典方法
(1)clear 清除字典中所有项
x.clear()
(2)copy 浅复制,返回一个相同字典
y=x.copy()
此时给y赋值时y的值改变x的值不改变;
但是由于是浅复制,对y调用append()、remove()等方法时,会改变x的值
此时,可以采用深复制解决这个问题:
from copy import deepcopy
d={}
dc=deepcopy(d)
(3)fromkeys 使用给定的键建立字典,每个键对应的默认值为None
{}.fromkeys(['age','name'])
#参数为一个序列
dict.fromkeys(['name','age'])
#不构造空字典,直接用dict调用(dict为所有字典的类型)
dict.fromkeys(['name','age'],'(unknown)')
#序列后接一个元组可以指定默认值
(4)get 宽松访问字典项的方法,项不存在时不会出错
d.get('name')
#返回该项的值,项不存在时返回None
d.get('name','N/A')
#返回该项的值,项不存在时返回‘N/A'
(5)has_key 检查字典中是否含有特定键
Python3.0中不包含该函数
d.has_key('name')
d.has_key(k)相当于表达式k in d,正确时返回True,错误返回False
(6)items 将字典里所有项以列表形式返回,每一项都是(键,值)的形式,没有次序
d.items()
iteritems方法大致相同,但是返回的是一个迭代器对象
it=d.iteritems()
list(it)
#多数情况下,iteritems会更加高效
(7)key 将字典中的键以列表形式返回
iterkeys返回关于键的迭代器
(8)pop 获得对应与给定键的值,然后将该项从字典中移除
d.pop('x')
(8)popitem 返回字典中任意一项,并从字典中移除该项
d.popitem()
(10)setdefault 类似于get方法,当该键存在时,返回该键对应的值;当该键不存在时,创建该键,并给出默认值
d.setdefault('name','N/A')
(11)update 利用一个字典更新另外一个字典
d.update(x)
#x中的不同键的新项将被添加到d中,x中同键的项将覆盖d中的项
(12)values 以列表的形式返回字典中的值
d.values()
itervalues 返回值的迭代器