写在前面
Python作为一门高级语言,代码不是越多越复杂越好,而是越少越简单越好。
基于这一思想,本节来介绍Python中非常有用的高级特性,1行代码能实现的功能,决不写5行代码。毕竟,代码越少,开发效率越高
- 列表生成器
- 生成器
- 迭代器
列表生成器
列表生成器在前一节已经出现过,形如
list(range(1,11))
[x for x in range(1, 11)]
[x*x for x in range(1, 11)]#平方
[m + n for m in 'ABC' for n in 'XYZ']#两层循环
[x * x for x in range(1, 11) if x % 2 == 0]#循环加判断
生成器
基本概念
列表生成式能够直接创建一个列表。但如果仅仅需要访问前面几个元素,使用列表生成式会白白浪费后面绝大多数元素占用的空间。
而在Python中,存在一种一边循环一边计算的机制,称为生成器:generator。即如果列表元素可以按照某种算法推算出来,就可在循环的过程中不断推算出后续的元素。
这样做的好处不必创建完整的list,从而节省大量的空间。
创建生成器
1、将列表生成式的[]改成(),next()函数获得generator的下一个返回值:
>>> g = (x * x for x in range(11))
>>> g
<generator object <genexpr> at 0x0000000004113F30>
也可以用for循环
for n in g:
print(n)
2.包含yield语句的函数
def fib(max):
n, a, b = 0, 0, 1#一次性多重赋值
while n < max:
print b
a, b = b, a + b
n = n + 1
将print b改为yield b就可以把fib函数变成generator,任何包含yield语句的函数称为生成器。含有yield语句的生成器调用方法与上述一样
*生成器与普通函数的区别
函数顺序执行,遇到return退出
生成器运行到yield点等待被重新唤醒,重新唤醒后就从停止的那点开始执行
o = fib(5)
next(o)
for n in fib(8):
print(n)
迭代器
迭代的意思是重复做一些事很多次
实现了iter方法的对象都可以进行迭代
class Fib(object):
def __init__(self):
self.a, self.b = 0, 1
def __iter__(self):
return self
def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a > 100000: # 退出循环的条件
raise StopIteration();
return self.a
——————————————
Python2.x的迭代器对象应该实现next方法
内建函数iter可以从可迭代的对象中获得迭代器
it = iter({1:2,3:3})
>>> next(it)
1
>>> next(it)
3
——————————————
Python2.x为it.next()