首页 > 编程语言 >Python yield 使用浅析

Python yield 使用浅析

时间:2022-11-04 11:01:43浏览次数:44  
标签:函数 Python max yield print fab 执行 浅析


之前了解了生成器的概念,带有 yield 的函数在 Python 中被称之为 generator(生成器),那么应该什么时候使用呢?

举个例子:

简单输出斐波那契數列前 N 个数

def fab(max): 
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1

执行 ,我们可以得到如下输出:

Python yield 使用浅析_迭代

结果没有问题,但有直接在 fab 函数中用 print 打印数字会导致该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列。要提高 fab 函数的可复用性,最好不要直接打印出数列,而是返回一个 List。

如下:

def fab(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 n in fab(5):
print(n)

改写后的 fab 函数通过返回 List 能满足复用性的要求,但该函数在运行中占用的内存会随着参数 max 的增大而增大,如果要控制内存占用,最好不要用 List来保存中间结果,而是通过 iterable 对象来迭代。

如下:

for i in range(1000): 
pass

如果我们想要保持第一种 fab 函数的简洁性,同时又要获得 iterable 的效果,yield 就派上用场了:

def fab(max):
n, a, b = 0, 0, 1
while n < max:
yield b
# print(b)
a, b = b, a + b
n = n + 1
总结
  1. yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator
  2. 比如 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象。
  3. 在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。


标签:函数,Python,max,yield,print,fab,执行,浅析
From: https://blog.51cto.com/u_15861560/5822303

相关文章

  • python之sys模块
    python之sys模块详解之前用过sys模块的一种用法,今天总结一下。sys.argv功能:在外部向程序内部传递参数eg:#!/usr/bin/envpythonimportsysprint(sys.argv[0])print(sys.arg......
  • python画图 去除横纵坐标值;设置横纵坐标名称;设置坐标轴刻度大小
    1.去除横纵坐标值plt.xticks([])#去掉横坐标值plt.yticks([])#去掉纵坐标值2.设置横纵坐标名称ax1.set_xlabel('Outputclass',fontsize=24)#设置x轴名称a......
  • python 中将单条scaffold的碱基序列按照指定数目输出
      001\[root@pc1test3]#cata.fa>chr1cccccggggggggttttggcccgggggg>chr2uuuuutttttNNNNNddffffdddgggggggggggcccccccccc[root@pc1test3]#cattest.py#......
  • Python函数参数中的 : 以及 ->
    一些python函数中,参数后面有冒号,函数后面还有箭头,这是什么含义呢?函数参数中的冒号是参数的类型建议符,告诉函数调用者希望传入的实参的类型。函数后面跟着的箭头是函数返回......
  • ipython 的感叹号、问号的使用
    目录使用感叹号!运行Shell命令使用一个感叹号!运行赋值编码使用两个感叹号!!运行编码赋值注意使用问号?获取帮助使用一个问号?使用两个问号??使用*做模糊查询......
  • Python3爬虫豆瓣电影TOP250将电影名写入到EXCEL
    大家好,我是你们的老朋友泽哥,最近在学习Python3.6,于是兴起写了个小小的爬虫今天我们要爬取得页面是豆瓣电影TOP250,连接如下:​​http://movie.douban.com/top250?start=0&filt......
  • windows10安装dlib+python3.9
     1、whl安装注意,仅支持特定版本,请检查pip所支持的版本是否一致dlib-19.23.0-cp39-cp39-win_amd64.whlhttps://gitee.com/billyme/python-dlib/raw/master/dist/dlib-......
  • 3.9 使用Python操作Excel表格的样式1
    #获取表格单元格,修改字体样式修改字体样式 Font(name=字体名称,size=字体大小,bold=是否加粗,italic=是否斜体,color=字体颜色)获取表格中字体的样式cell.font.属性......
  • python 迭代器
    #迭代:当前执行依赖于上一次执行结果,可迭代对象内置了__iter__()方法的,就是可迭代对象基本数据类型中,属于可迭代对象的有:字典、列表、元组、集合、字符串、......
  • python描述 LeetCode 1486. 数组异或操作
    python描述LeetCode1486.数组异或操作  大家好,我是亓官劼(qíguānjié),在【亓官劼】公众号、GitHub、B站、华为开发者论坛等平台分享一些技术博文,主要包括前端开发、......