list & dict & strpython
这三种类型是python中最经常使用的几种数据类型。他们都是序列的一种api
■ 序列通用操做数据结构
1. 分片app
s[a:b] 返回序列s中从s[a]到s[b-1]的片断。注意s[0:0]是空集而不是s[0]函数
s[a:b:c] 加入第三个参数以设置取样步长。能够设置成负数来从右向左取样编码
2. 加减乘除spa
[None] *2 => [None,None] code
* 注意,这种列表直接乘以数字的作法是浅拷贝一个自身,而后再extend进去。因为是浅拷贝,因此存在着可变对象这样初始化可能会出现问题。好比:orm
a = [{}] * 3 这样初始化变量a后。表面上看a是一个由三个字典组成的列表,可是实际上,a[0]['key'] = 'value'以后,a的值会变成[{'key': 'value'},{'key': 'value'},{'key': 'value'}],即三个字典实际上指向的是同一个对象,致使变化始终同步。对象
3. 一些内建函数的操做
len(s),max(s),min(s)等
■ list
对于list类型,从数据结构层面上的分析记录在了“线性表的顺序表”中,在这不作展开。这里主要说明一下经常使用的list方法
对于列表ls
赋值 只要不越界,就能够进行分片的赋值
del del语句后面加的是list[index],不是值也不是索引
ls.append() 返回值是None
ls.count(...) 计某一值出现的次数
ls.extend(another_ls) 将两个列表合并
ls.index(value) 获取某个值的索引
ls.insert(index,value) 在某个地方插入值
ls.pop() 不加参数默认pop掉最后一个元素而且返回其值
ls.remove(..) 去除从左到右第一个匹配到的值,若是没找到报错
ls.reverse() 返回None,对ls自己反序
ls.sort() 返回None,对ls自己排序
//以上两个和sorted(ls),reversed(ls)区别,这两个是以ls为素材返回一个排序或者反序的迭代器。
//顺便,sorted和sort能够再传一个key做为参数,key是一个函数对象,意思是在进行排序时依据不是默认的东西,而是把各个遍历的项(对字典来讲就是键)做为参数传给key函数后通过处理后的返回值。好比想让一个字典的列表按照每一个字典中的某个键"dict_key"的值大小来排序就能够sorted(dict,key=lambda x:x.get("dict_key"))
■ dict
dict类型保存键值对,其键只能是str,tuple等不可变类型或者自定义的类型。假如是tuple之类组合对象的话tuple中的每个元素都还必须是不可变类型。字典类型能够容纳任意多的键值对,而且支持高效检索(从字典中存取数据所花平均时间是O(1)的,但最坏状况下有可能达到O(n)。)
对于字典d有如下方法
d.clear() 清空字典
d.copy() 深复制
d.get(...)
d.has_key(...) 判断字典是否含有某个键
d.items() 字典列表化,每一个元素是个元组,tuple[0]是key,tuple[1]是value
d.keys()
d.update(e) 用e更新d,对于d中没有的key则新建item,对于有的覆盖老的value
d.values()
■ str
对于字符串s
s.find(...) 返回子串的位置
'mark'.join(list) 将mark做为分隔符把一个list给合并成一个字符串
s.lower() 所有小写化
s.upper() 所有大写
s.title() 单词词首所有大写
s.capitalize() 字串串首大写
s.isupper() 判断是不是所有字符都是大写
s.islower()
s.istitle()
//以上这六七个对字符串的文字性的处理都是返回值,不改变字符串自己的
s.replace(a,b)
s.split()
s.strip()
s.format("a","b") 这是个比较重要且有用的方法。用"a","b"等给出的素材串替换s中的带大括号的部分,至关于%s % (...)的做用。s中能够写"{},{}",这样format函数的参数会依次填补这些大括号,若是想要手动指定顺序也能够"{1},{0}"。若是s中写的不是{0},{1}这种的话能够写{some_text},而后在format的参数里就要写some_text=...来指定替换的变量的名称(有点模板语言的意思).相比于%的格式化字符串的替换,这个能够不用写彻底一对一的个数。format的变量写法的话全部一样的变量都只要写一次就行了。*今天用这个format遇到一个坑:当你要替换的字符串里有正则指定模式重复多少遍的表达式(好比{12})这样的话format会报错,由于它把正则的{12}当成它要解析的第十二个变量了。解决方法是写两遍大括号来转义,即原文中的{12}若是要进行format就要写成{{12}}。
在要通过format处理的字符串中还能够有更加灵活的写法。上面说究竟是用format参数指定的值来替换一些字符串中的变量,但实际上,format的参数甚至能够是一个对象,而后在格式化字符串里面写上同名变量进行逻辑运算后再替换,好比能够经过下标或者访问属性的方法来取值:
#能够直接传一个列表对象 "{li[0]} and {li[1]} are two items".format(li=[1,2]) #在类中能够有相似如下的书写方法,至关于传一个自定义对象来取值格式化 "my name is {self.name} and my age is {self.age}".format(self=self)
关于格式化输出这方面,用%号格式化输出的规则和C语言相似,可是用format方法的话不太同样,其表现形式是在大括号中加上冒号,以及各类不一样的符号来表达格式化。好比<,^,>分别表示左对齐居中和右对齐,前面加上一个字符以表示填充符,后面加上一个数字表示宽度。"{var:0>8}".format(var="123") 获得"00000123"。"{:.2f}"则表示输出的数字要是float类型且保留两位小数,除了f表示float以外还能够有{:b}表示二进制,{:x}表示十六进制等,它们会自动对你传递进去的数字作进制转换再转化成字符串输出。类型提示必须放在位置提示后面好比"{var:0^20.2f}"这样。另外冒号后面加上一个逗号可让输出有千位分隔。好比"{:,}".format(123456789)获得"123,456,789"
另外,使用format的时候应该注意,调用它的对象和方法中的参数应尽可能作到类型一直,好比"".format("")或者u"".format(u"")。若是出现str.format(unicode)时python默认操做是用系统的默认编码格式(sys.getdefaultcoding那个)对unicode进行encode而后将其整合到相应str中去。相似的,若是是unicode.format(str)的话,那么就是拿系统默认编码对str进行decode以后再整合进unicode。
■ string模块
其实str类自己的一些方法还不够强大,因此有了专门的String模块来处理一些事情
string模块的成员变量们:
string.lowercase 指代全部小写字母,至关于"abcd....xyz"
string.uppercase
string.letters 全部字母,先大写再小写,至关于"abcd...xyzABC..XYZ"
string.whitespace 全部空白字符
string.punctuation 一些标点符号
string模块的方法:
capitlize(s) 返回S的首字母大写的串
capwords(s,sep) 用sep来split掉s,而后把split出来的每部分的首字母大写,再用sep把这些部分链接起来,sep默认为空格
center(s,width[,fllchar]) 把s放在width(一个int数)长的字符串郑重,两边用fillchar填充。能够用于生成文本文件中的分隔符之类的
count(s,sub[,start[,end]]) 返回在s[start:end]片断中sub子串出现的次数
swapcase(s) 切换大小写字母
zfill(s,width) 在s左侧添加0知道宽度达到width
上面曾经提到过s.format相似模板语言(好比velocity,python的jinja2模块等)的功能,其实这是基于string中的一些类。string中有个Template类可让用户手动地构造简单的模板:
from string import Template s = Template("Hello, ${name}") #变量用${...}的形式 s.substitute(name="Frank") #返回Hello, Frank s.safe_substitute(namae="Frank") #save_substitute()对找不到的变量不报错