Python提供了 with 语句的写法,既简单又安全。
文件操作的时候使用with语句可以自动调用关闭文件操作,即使出现异常也会自动关闭文件操作。
with open('1.txt', 'w') as f: f.write('hello world')
生成器的创建方式
生成器推导式
与列表推导式类似,只不过生成器推导式使用小括号 。
my_generator = (i * 2 for i in range(5)) print(my_generator) for value in my_generator: print(value)
next 函数获取生成器中的下一个值
for 循环遍历生成器中的每一个值
yield生成器
yield 关键字生成器的特征:在def函数中具有yield关键字
def generator(n): for i in range(n): print('开始生成...') yield i print('完成一次...') g = generator(5) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) -----> 正常 print(next(g)) -----> 报错 Traceback (most recent call last): File "/Users/cndws/PycharmProjects/pythonProject/demo.py", line 14, in <module> print(next(g)) StopIteration
def generator(n): for i in range(n): print('开始生成...') yield i print('完成一次...') g = generator(5) for i in g: print(i)
开始生成...
0
完成一次...
开始生成...
1
完成一次...
开始生成...
2
完成一次...
开始生成...
3
完成一次...
开始生成...
4
完成一次...
注意点:
① 代码执行到 yield 会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
② 生成器如果把数据生成完成,再次获取生成器中的下一个数据会抛出一个StopIteration 异常,表示停止迭代异常
③ while 循环内部没有处理异常操作,需要手动添加处理异常操作
④ for 循环内部自动处理了停止迭代异常
yield关键字和return关键字
如果不太好理解yield
,可以先把yield
当作return
,他们都在函数中使用,并履行着返回某种结果的职责。
这两者的区别是:
有return
的函数直接返回所有结果,程序终止不再运行,并销毁局部变量;
而有yield
的函数则返回一个可迭代的 generator(生成器)对象,可以使用for循环或者调用next()方法遍历生成器对象来提取结果。
def example(): x = 1 y = 10 while x < y: yield x x += 1 example = example() print(example)
yield与斐波那契数列
数学中有个著名的斐波拉契数列)
要求:数列中第一个数为0,第二个数为1,其后的每一个数都可由前两个数相加得到:
例子:1, 1, 2, 3, 5, 8, 13, 21, 34, ...
现在我们使用生成器来实现这个斐波那契数列,每次取值都通过算法来生成下一个数据,生成器每次调用只生成一个数据,可以节省大量的内存。
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b # 使用 yield a, b = b, a + b n = n + 1 for n in fib(5): print n
Python高级语法与正则表达式(二)+https://developer.aliyun.com/article/1543814?spm=a2c6h.13148508.setting.14.1fa24f0esUvLlh