Python yield 使用浅析
2017-10-23 09:14
211 查看
继Python迭代器和生成器,使用了yield函数,简单分析分析。
首先,带有 yield 的函数在 Python 中被称之为 generator(生成器),那么什么是生成器?
通过一个编程实例来展示yield的概念
执行程序,结果:
程序结果没有问题,但是有经验的开发者指出,直接在 fab 函数中用 print 打印数字会导致该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列。
要提高 fab 函数的可复用性,最好不要直接打印出数列,而是返回一个 List。
经过分析,输出斐波那契数列第二版:
执行程序,打印fb函数返回的List结果:
为了使代码简洁,同时又要获得 iterable 的效果,yield 就派上用场了:
输出结果一致
简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fb(10) 不会执行 fb 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fb 函数内部的代码,执行到 yield b 时,fb 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
首先,带有 yield 的函数在 Python 中被称之为 generator(生成器),那么什么是生成器?
通过一个编程实例来展示yield的概念
如何生成一个斐波那契数列
简单输出一个斐波那契数列:# -*-coding:utf-8-*- def fb(max): n, a, b = 0, 0, 1 while n < max: print(b, end=" ") a, b = b, a + b n = n + 1 fb(10)
执行程序,结果:
1 1 2 3 5 8 13 21 34 55
程序结果没有问题,但是有经验的开发者指出,直接在 fab 函数中用 print 打印数字会导致该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列。
要提高 fab 函数的可复用性,最好不要直接打印出数列,而是返回一个 List。
经过分析,输出斐波那契数列第二版:
# -*-coding:utf-8-*- def fb(max): n, a, b = 0, 0, 1 L = [] while n < max: L.append(b) a, b = b, a + b n = n + 1 return L for i in fb(10): print(i, end=" ")
执行程序,打印fb函数返回的List结果:
1 1 2 3 5 8 13 21 34 55
为了使代码简洁,同时又要获得 iterable 的效果,yield 就派上用场了:
# -*-coding:utf-8-*- def fb(max): n, a, b = 0, 0, 1 while (n<max): yield b a, b = b, a+b n = n + 1 for n in fb(10): print(n, end=" ")
输出结果一致
1 1 2 3 5 8 13 21 34 55
简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fb(10) 不会执行 fb 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fb 函数内部的代码,执行到 yield b 时,fb 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
结论:
一个带有yield的函数就是一个generator(生成器),它和普通函数不同,看起来像函数调用,但不会执行任何函数代码,直到对其调用next()才开始执行,for循环中会自动调用next(),虽然执行流程仍然按照函数的流程执行,但是每执行到一个yield语句就会中断,并返回一个迭代值,下次执行时从yield的下一个语句继续执行,看起来就好像一个函数在正常执行的过程中被yield中断了数次,每次中断都会通过yield返回当前的迭代值 yield的好处显而易见,能够将一个函数改写为一个generator而获得迭代能力。
相关文章推荐
- Python yield 使用浅析
- Python yield 使用浅析
- Python yield 使用浅析
- Python yield 使用浅析
- Python yield 使用浅析
- Python yield使用浅析
- 转:Python yield 使用浅析
- Python yield 使用浅析
- Python yield 使用浅析
- Python yield 使用浅析
- Python yield 使用浅析
- Python yield使用浅析(转)
- Python yield 使用浅析
- Python yield 使用浅析
- 【转】Python yield 使用浅析
- 转:Python yield 使用浅析
- Python yield使用浅析
- Python yield 使用浅析
- Python yield 使用浅析
- 转:Python yield 使用浅析