网上学习过程中整理的一个小结,非常零散,用来巩固一下记忆,以后的学习过程中再继续整理补充。
#-*-coding:utf-8 -*-,
把文件编码类型改为utf-8,这样代码中就可以有中文了,另外也支持Unicode字符串,使用 u'...'
Python内置的数据类型:list
list是一种有序集合,可以随时添加和删除其中的元素。
创建list: L=[ ]
可以按照索引访问list: L[0]
倒序访问:L[-1] //注意用索引访问不要越界!
添加新元素:
L.append() //将一个元素追加到list末尾
L.insert() //接受两个参数,第一个为索引号,第二个为待添加的新元素
删除元素:
L.pop() //参数为空时,删除最后一个元素;或者按照索引号删除。删除元素会引起元素索引号的变化。
tuple是另一种有序的列表,和list类似,但是创建之后就不可以修改。
t=( )
使用索引访问tuple: t=[0]
创建单元素tuple时要多加一个逗号,例如:t=(1,)
创建可变的tuple:t=(1,2,[1,2]) //在tuple中插入一个list元素
Python中的Dict:
dict可以表示键-值对,由于dict也是集合,len()方法可以计算任意集合的大小。
创建dict:d={
'a': 10,
'b': 20
} //一个key-value 算一个,所以d的大小为2
访问dict:
可以使用d[key],来访问key对应的value,如果key不存在会报错KeyError
可以使用d.get(key)方法,当key不存在时,返回一个None
dict的第一个特点是查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样。而list的查找速度随着元素增加而逐渐下降。
不过dict的查找速度快不是没有代价的,dict的缺点是占用内存大,还会浪费很多内容,list正好相反,占用内存小,但是查找速度慢。
由于dict是按 key 查找,所以,在一个dict中,key不能重复。
dict的第二个特点就是存储的key-value序对是没有顺序的!这和list不一样:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
当我们试图打印这个dict时:
>>> print d {'Lisa': 85, 'Adam': 95, 'Bart': 59}
打印的顺序不一定是我们创建时的顺序,而且,不同的机器打印的顺序都可能不同,这说明dict内部是无序的,不能用dict存储有序的集合。
dict的第三个特点是作为 key 的元素必须不可变,Python的基本类型如字符串、整数、浮点数都是不可变的,都可以作为 key。但是list是可变的,就不能作为 key。
不可变这个限制仅作用于key,value是否可变无所谓:
{ '123': [1, 2, 3], # key 是 str,value是list 123: '123', # key 是 int,value 是 str ('a', 'b'): True # key 是 tuple,并且tuple的每个元素都是不可变对象,value是 boolean }
最常用的key还是字符串,因为用起来最方便。
更新dict:用赋值语句 d[key]=value ,如果key已经存在,value会覆盖原值。
d.value() //把一个dict转换成一个包含value的list,这样就可以用for循环直接迭代value
d.items() //这个方法把dict转换成包含tuple的list,这样就可以同时迭代key和value
Python中的set:
set有一系列的元素,无序,并且不重复,这点和dict中的key很像。
创建set的方法是调用set()并传入一个list,list中的元素会作为set的元素。
s=set([1,2,3])
set的特点:
set的内部结构和dict很像,但没有value值,查找一个值是否在set中很快,set中的元素必须是不变元素,set储存的元素没有顺序。
更新set:
s.add() //添加元素
s.remove() //删除元素,如果删除的元素不在set中会报错 所以用add可以直接添加,而使用remove前需要判断。
Python中的函数可以返回多值: return x1,x2 实际上,返回值是一个tuple。
如果想让函数能接受任意个参数,可以定义一个可变参数:def f(*args) //可变参数的名字前有个 *
Python中对list进行切片:L[0:10] //表示从索引0开始,到索引10为止,但不包括索引10
L[:3] //如果第一个索引是0,还可以省略
L[:] //只用一个:表示从头到尾
L[::2] //切片中的第三个参数表示每N个取一个
可以倒序切片。
把list变成tuple,切片操作完全相同,只是切片的结果变成了tuple。
字符串'...'和Unicode字符串u'...'也可以看成一种list,也可以切片,操作结果仍为字符串。
在Python中,如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们成为迭代(Iteration)。
在Python中,迭代是通过 for ... in 来完成的,而很多语言比如C或者Java,迭代list是通过下标完成的,比如Java代码:
for (i=0; i<list.length; i++) { n = list[i]; }
可以看出,Python的for循环抽象程度要高于Java的for循环。
因为 Python 的 for循环不仅可以用在list或tuple上,还可以作用在其他任何可迭代对象上。
因此,迭代操作就是对于一个集合,无论该集合是有序还是无序,我们用 for 循环总是可以依次取出集合的每一个元素。
注意: 集合是指包含一组元素的数据结构,我们已经介绍的包括: 1. 有序集合:list,tuple,str和unicode; 2. 无序集合:set 3. 无序集合并且具有 key-value 对:dict
而迭代是一个动词,它指的是一种操作,在Python中,就是 for 循环。
迭代与按下标访问数组最大的不同是,后者是一种具体的迭代实现方式,而前者只关心迭代结果,根本不关心迭代内部是如何实现的。
在Python中,迭代永远是取出元素本身,而非元素的索引。对于有序集合,元素是有索引的,有的时候,想在for循环中拿到索引,可以使用enumerate()函数
方法是使用 enumerate() 函数:
>>> L = ['Adam', 'Lisa', 'Bart', 'Paul'] >>> for index, name in enumerate(L): ... print index, '-', name ... 0 - Adam 1 - Lisa 2 - Bart 3 - Paul
使用 enumerate() 函数,我们可以在for循环中同时绑定索引index和元素name。但是,这不是 enumerate() 的特殊语法。实际上,enumerate() 函数把:
['Adam', 'Lisa', 'Bart', 'Paul']
变成了类似:
[(0, 'Adam'), (1, 'Lisa'), (2, 'Bart'), (3, 'Paul')]
因此,迭代的每一个元素实际上是一个tuple:
for t in enumerate(L): index = t[0] name = t[1] print index, '-', name
如果我们知道每个tuple元素都包含两个元素,for循环又可以进一步简写为:
for index, name in enumerate(L): print index, '-', name
这样不但代码更简单,而且还少了两条赋值语句。
可见,索引迭代也不是真的按索引访问,而是由 enumerate() 函数自动把每个元素变成 (index, element) 这样的tuple,再迭代,就同时获得了索引和元素本身。
zip()函数可以把两个list变成一个list:
>> zip([10, 20, 30], ['A', 'B', 'C']) [(10, 'A'), (20, 'B'), (30, 'C')]
Python生成列表:
要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我们可以用range(1, 11):
>>> range(1, 11) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环:
>>> L = [] >>> for x in range(1, 11): ... L.append(x * x) ... >>> L [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:
>>> [x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
这种写法就是Python特有的列表生成式。利用列表生成式,可以以非常简洁的代码生成 list。
写列表生成式时,把要生成的元素 x * x 放到前面,后面跟 for 循环,就可以把list创建出来。
for循环后面还可以加上if判断,判断为True的时候,才把循环的当前元素加入到列表中。
for循环也可以嵌套。