python的高阶特性,包含切片、列表生成式、生成器、迭代器。
切片
切片主要是序列的特性,序列(列表,元组,字符串)均可使用切片进行访问。
列表生成式
列表生成式是python内置的非常简单强大的可以用来创建list的生成式。
如:[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 'XYZ'] #全排列 import os [d for d in os.listdir('.')] #列出当前目录下的所有文件和目录 d = {'x':'A', 'y':'B', 'z':'C'} [k + '=' + v for k,v in d.items()] L = ['Hello', 'World', 'IBM', 'Apple'] [s.lower() for s in L]生成器
创建一个generator,
方法一:把一个列表生成式的[]改成(),就创建了一个generator。 如:g = (x * x for x in range(10)) generator保存的是算法,每次调用next(g),就计算出g的下一个元素值,直到计算到最后一个元素。 然而,正常情况下,不会使用next()函数,而是使用for循环,因为generator也是可迭代对象。 方法二:使用yield,如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数了,而是一个generator。 如:斐波那契函数 def fib(max): n,a,b = 0,0,1 while n < max: print(b) a, b = b, a+b n = n + 1 return 改变为一个生成器: def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a+b n = n + 1 return 难点:generator和函数的执行流程是不一样的。函数是顺序执行的,遇到return语句或者最后一行函数语句就返回。 而变成generator的函数之后,在每次调用next()的时候执行,遇到yield语句就返回,再次执行时从上次返回的yield语句处继续执行。 同样,把函数改为generator后,基本上从来不用next()来获取下一个返回值,而是直接使用for循环来迭代。 但是使用for循环调用generator之后,发现拿不到generator的return语句的返回值。如果想要获取返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中。 小结:generator是非常强大的工具,可以简单的把列表生成式改成generator,也可以通过函数来实现复杂逻辑的generator。 要理解generator的原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。 注意区分普通函数和generator函数,普通函数调用直接返回结果,generator函数的调用实际返回一个generator对象。