切片
- 前闭后开
取列表前三个元素
L[0:3]
从头开始时可以省略
L[:3]
切到末尾也能省略
L[2:]
- 可以使用负数索引
前后边界都为空时,表示不切片,复制一个列表
L[:]
传入三个参数时,末尾表示每几位分割后取首位
- 字符串可以使用切片操作
迭代
- 迭代是一种循环
- for作用于可迭代对象
- 作用于字典时
默认迭代的是key 迭代字典的vaule
for i in d.vaules()
同时迭代字典和key时
for m,n in d.items()
enumerate函数
可以把list变为(索引 元素),可用于迭代,索引可用于标志位for i,vaule in enurate(L)
列表生成
range(),返回的是一个可迭代对象,不是列表,list可将其转换为一个列表。或者使用中括号
list(range(5,10)) l = [range(5,10)]
列表生成式的本质含义是通过另一个可迭代对象生成列表
list(x + x for x in L) l = [x + x for x in L]
其它常见写法
list(m + n for m in La for n in Lb) l = [m + n for m in La for n in Lb]
通过字典的key-vaule时
list(k + v for k,v in d.items()) l = [k + v for k,v in d.items()]
可以添加if判断
list(x for x in range(10)if x > 5) l = [x for x in range(10)if x > 5]
本质,可迭代对象for前为生成规则,其后可加if条件
生成器
- 一边循环一边计算的列表生成,即不创建完整的list
最简单的生成器是将列表生成式中的[]换为()
l = (range(10))
此时返回的l为一个生成器对象
生成器对象可以使用next()方法,是可迭代对象,一般使用for迭代而不用next()
生成器的另一种构造方法,定义包含yield关键字的函数,此时其为一个生成器,返回一个生成器对象
1
2
3
4
5
6def square(max):
n = 1
while n < max:
n = n * n
yield n
return 0据上例,square()返回一个生成器对象,
- 变为生成器的函数在每次调用next()时执行,或者在迭代时执行,遇到yield返回,再次执行时从上次返回的yield语句继续执行,所以拿不到return语句的返回值,可以使用StopIteration捕获错误
迭代器
- 可被next()调用并返回下一个值的对象,生成器都是迭代器,但list,str等不是,因为Python的迭代器对象表示的是一个数据流,迭代器的计算是惰性的