认真是我们
参与这个社会的方式

Python高级特性

切片

用于取一个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。

注:生成器都是迭代器对象,列表、字典、字符创是可迭代对象,但是不是迭代器

没有故事 也没有酒

点也没用点也没用