Python中很多常见语法可以使程序更加简洁易读,这里我们介绍5个例子:切片、迭代、列表生成器、生成器、迭代器
1.切片(slice)
切片用于取list tuple中部分元素,通过下标索引,只需标出想得到的第一个元素下标和最后一个元素
- L[a:b] 从a开始取,到(b-1)为止,取(a-b)个元素
- 若a=0,则可以省略L[:b]
- 支持倒数切片。L[-a:-b],从倒数第a开始取,到倒输(b+1)为止,取(a-b)个元素; L[-a:], 从倒数第a开始取,到最后一个元素为止,取a个元素
- L[:]复制原list或tuple
- 支持跳着取元素,例如前10个数,每两个取一个:L[:10:2] ;所有数,每5个取一个:L[::5]
- 字符串可以看作是list,也支持切片
- tuple不可变,切片后得到类型仍是tuple,但是是一个新的tuple,原tuple不变
2.迭代
迭代指通过for ... in遍历整个list或tuple
- 任何可迭代对象都可以作用于
for
循环 - 可直接用for循环的有两类:一类是集合数据类型,如
list
、tuple
、dict
、set
、str
等; 一类是generator
,包括生成器和带yield的generator function - dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。
- 默认情况下,dict迭代的是key。 迭代value : for value in d.values() 同时迭代key和value : for k,v in d.items()
- list可以通过enumerate函数变成索引-函数对 for i, value in enumerate(['A', 'B', 'C'])
- 可以用collections模块的Iterable类型判断是否为可迭代对象 from collections import Iterable isinstance('abc' , Iterable)
- for 循环可以同时引用两个变量
3.列表生成器
- list( range(1,11) )
- [x*x for x in range (1,11)]
- [x*x for x in range (1,11) if x%2 ==0]
- [m+n for m in 'abc' for n in '123']
4.生成器(generator)
列表里的元素事先并不知道,需要通过循环不断推算出后一个元素
- 与列表生成式相同用法,只需要把[]改成()即可,就从list变成generator
- 生成器计算到最后一个元素,没有更多元素时抛出StopIneration错误
- 一般用for循环得到后面元素,但是算法复杂时也可以通过函数实现
- 函数定义中含有yield关键字即为generator
- generator函数遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行,即,generator函数一般在for循环中调用
- 如果想得到generator函数的返回值,,必须捕获
StopIteration
错误,返回值包含在StopIteration
的value
5.迭代器(Iterator)
Iterator对象可以被next()
函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration
错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()
函数实现按需计算下一个数据,
- 可以直接作用于
for
循环的对象统称为可迭代对象:Iterable
。可以使用isinstance()
判断一个对象是否是Iterable
对象 - 可以被
next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()
判断一个对象是否是Iterator
对象 - 生成器都是
Iterator
对象,但list
、dict
、str
虽然是Iterable
,却不是Iterator
。 - 把
list
、dict
、str
等Iterable
变成Iterator
可以使用iter()
函数