首页 > 编程语言 >Python 中 yeild 的用法

Python 中 yeild 的用法

时间:2023-06-06 17:55:39浏览次数:42  
标签:函数 nums Python 生成器 yield 用法 num yeild

本文包含以下四部分:

  1. yeild 介绍
  2. yeild 案例
  3. 简单的例子对比yeild和常规函数
  4. 复杂的例子说明yeild 与普通函数的差异

1. yeild 介绍

yield 是 Python 的一个关键字,用于从一个函数中返回一个生成器(generator)。生成器是一种特殊类型的迭代器,它允许你延迟计算结果,这在处理大数据或者创建复杂数据结构时特别有用,因为你不需要一次性将所有的数据都存储在内存中。

一个使用 yield 的函数会被称为生成器函数。这种函数并不直接返回一个值,而是生成一系列的值。每次调用这个生成器函数,它会从上次离开的地方继续执行,并且可以产生许多结果,而不是单个值。

2. yeild 案例

以下是一个简单的使用 yield 的例子

点击查看代码
def simple_generator():
    yield 1
    yield 2
    yield 3

> 使用生成器
for num in simple_generator():
    print(num)

输出:

点击查看代码
1
2
3

在上面的例子中,simple_generator 是一个生成器函数,它生成了三个值:1, 2, 和 3。在 for 循环中,每次迭代都会从生成器中获取一个新的值。

可以想象,每当 yield 被调用时,函数会生成一个新的值,然后暂停执行。当下一个值被请求时(例如,在 for 循环中的下一次迭代),函数会从上次离开的地方恢复执行,再次运行到 yield 语句,然后再次暂停。

这就是 yield 的基本用法。它在处理大数据集或创建复杂的数据结构时特别有用,因为它允许你按需生成和处理数据,而不是一次性生成所有数据并一次性处理所有数据,这样可以大大节省内存。

3. 简单的例子对比yeild和常规函数

当然,让我们通过一个简单的例子来展示 yield 的用法,以及与常规函数返回一个完整列表的区别。

首先,让我们创建一个常规的函数,该函数将返回一个列表,其中包含从0到n的所有数字:

点击查看代码
def create_numbers(n):
    num_list = []
    for i in range(n):
        num_list.append(i)
    return num_list

nums = create_numbers(5)
for num in nums:
    print(num)

此函数将创建一个包含所有数字的列表,然后返回这个列表。如果 n 非常大,那么列表将占用大量内存。

现在,我们使用 yield 关键字改写这个函数,使其成为一个生成器:

点击查看代码
def create_numbers(n):
    for i in range(n):
        yield i

nums = create_numbers(5)
for num in nums:
    print(num)

在这个版本的函数中,我们并没有一次性创建一个完整的列表。相反,我们使用 yield 关键字,在每次迭代时生成下一个数字。这种方法对内存的利用更高效,因为我们并不需要在内存中一次性存储所有的数字。无论 n 多大,这个生成器在任何时候都只会产生一个数字。

当你需要处理大量数据时,这种方式特别有用。它允许你创建一个不会因数据量太大而耗尽内存的数据流。这也是生成器与常规函数的主要区别。

4. 复杂的例子说明yeild 与普通函数的差异

下面让我们使用一个更复杂的例子来说明 yield 和普通函数之间的差异。

假设我们要生成一个斐波那契数列,其中每个数字都是前两个数字的和。假设我们要生成前 N 个斐波那契数。

以下是使用普通函数生成斐波那契数列的方法:

点击查看代码
def fibonacci(n):
    nums = []
    a, b = 0, 1
    while len(nums) < n:
        nums.append(b)
        a, b = b, a + b
    return nums

print(fibonacci(10))  # 输出: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

这个函数会一次性生成所有的斐波那契数,并将它们存储在一个列表中。这意味着所有的数都将同时存在于内存中。

现在,让我们尝试使用一个生成器来完成同样的任务:

点击查看代码
def fibonacci(n):
    yield 1
    if n > 1:
        a, b = 1, 1
        while n > 1:
            a, b = b, a + b
            yield a
            n -= 1

print(list(fibonacci(10)))  # 输出: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

这个生成器会一次生成一个斐波那契数,每次你从生成器请求一个数时,它都会计算出新的数并返回。这意味着在任何时候,只有一个斐波那契数存在于内存中。

如果你要生成的斐波那契数非常多(例如,几百万个),那么生成器版本的函数将大大节省内存。此外,如果你只需要迭代而不需要所有的斐波那契数,那么使用生成器可以让你的代码更加高效。

标签:函数,nums,Python,生成器,yield,用法,num,yeild
From: https://www.cnblogs.com/cxqiang/p/17461141.html

相关文章

  • CentOS 6.9 python3.10 numpy 安装使用 - gcc 升级
    踩坑记录程序写好了,使用了pandas,放在服务器上,运行报错:Originalerrorwas:/lib64/libgcc_s.so.1:version`GCC_4.8.0'notfound(requiredby/usr/local/lib/python3.10/site-packages/numpy/core/../../numpy.libs/libgfortran-040039e1.so.5.0.0)可以看到是导入numpy......
  • 原型模式的用法
    目录一、原型模式的用法1.1介绍1.2结构1.3原型模式类图1.4实现1.4.1克隆的分类1.4.2代码1.5"三好学生"奖状案例1.5.1"三好学生"奖状类图1.5.2代码1.6深、浅克隆的区分1.6.1浅克隆1.6.2深克隆一、原型模式的用法1.1介绍用一个已经创建的实例作为原型,通过复制该原型......
  • Linux 的 nohup 命令的用法
    nohup/root/test.php&1、使用nohup让程序在远程主机后台运行http://www.williamlong.info/archives/482.html......
  • Python Django Xadmin 的使用
    笔者Python版本为3.10.6,Django版本为4.2.2本项目代码已开源,可到GitHub仓库中查看本项目用到的xadmin、DjangoUeditor文件夹笔者已经按照Python3.10版本进行了修改,点击链接即可下载。但如果你使用的Python版本较低,可能会因此出现一些BUG,请到问题汇总查看,如果......
  • python切片详解
    索引的一般方式一个完整的切片是包含三个参数和两个冒号":",用于分隔三个参数(start_index、end_index、step)。当只有一个“:”时,默认第三个参数step=1;当一个“:”也没有时,start_index=end_index,表示切取start_index指定的那个元素。切片操作的基本表达式:object[start......
  • 【理论积累】Python中的Pandas库【一】
    Pandas库介绍Pandas是一个用于数据分析的Python第三方库,能够处理和分析不同格式的数据,例如:CSV、Excel、SQL数据库等。Pandas提供了两种数据结构,分别为Series和DataFrame,灵活而方便地进行数据分析和操作。以下是Pandas的核心概念和功能:Series:类似于NumPy的ndarra......
  • Python 多进程之间共享变量
    原文地址:https://blog.51cto.com/alwaysbeta/5162851Python多线程之间共享变量很简单,直接定义全局global变量即可。而多进程之间是相互独立的执行单元,这种方法就不可行了。不过Python标准库已经给我们提供了这样的能力,使用起来也很简单。但要分两种情况来看,一种是Process......
  • xades4j 苦苦寻找的是啥 (源码 == 找到了测试用例 == 找到了用法)
    <dependency><groupId>com.googlecode.xades4j</groupId><artifactId>xades4j</artifactId><version>1.3.2</version></dependency>https://github.com/luisgoncalves/xades4j源码和junit(大量的测试用例,告诉我们什么是xades......
  • Python tkinter 树形列表控件(Treeview)的使用简单举例,建立一个treeview
     importtkinterastkfromtkinter.ttkimportTreeview#创建tkinter应用程序窗口root=tk.Tk()#设置窗口大小和位置root.geometry('500x300+400+300')#不允许改变窗口大小root.resizable(False,False)#设置窗口标题root.title('通信录管理系统')#使用Tree......
  • 实验6 turtle绘图和Python库应用编程体验
    实验任务1task1_1.py源代码1fromturtleimport*23defmove(x,y):4penup()5goto(x,y)6pendown()78defdraw(n,size=100):9foriinrange(n):10fd(size)11left(360/n)1213defmain():14pensize(2)1......