切片
用于取一个list或tuple的部分元素
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] >>> L[0:3] #从索引0开始取,直到索引3为止,但不包括索引3 ['Michael', 'Sarah', 'Tracy'] >>> L[-2:] ['Bob', 'Jack'] >>> L[-2:-1] ['Bob']
玩儿法很多
迭代
如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。
列表生成式
生成[1×1, 2×2, 3×3, …, 10×10],方法一是循环:
>>> 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]
写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来
生成器
1.在Python中,这种一边循环一边计算的机制,称为生成器:generator。
2.要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator,如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值。
3.创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。
4.generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,但是疯狂调用next()是错误的,正确的方法是使用for循环,因为generator也是可迭代对象。
5.generator非常强大。如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。
6.著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:
def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a + b n = n + 1 return 'done'
里面的赋值语句
a, b = b, a + b
相当于
t = (b, a + b) # t是一个tuple a = t[0] b = t[1]
上述函数改成生成器只需
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done'
这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
7.这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
注:确实还没理解…
迭代器
1.我们已经知道,可以直接作用于for循环的数据类型有以下几种:
- 一类是集合数据类型,如list、tuple、dict、set、str等;
- 一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
2.可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
3.生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
注:生成器都是迭代器对象,列表、字典、字符创是可迭代对象,但是不是迭代器