首页 > 编程语言 >python 生成器

python 生成器

时间:2023-07-13 18:45:08浏览次数:36  
标签:__ 10 python 生成器 yield next print

目录

python 生成器

推导式

通过列表生成式(列表推导式),我们可以直接创建一个列表
但是受到内存限制,列表容量是有限的
而且创建一个100万元素的列表,会占用很大的存储空
如果我们只需要访问前面几个元素,那后面大多数元素占用的空间就白白浪费了
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?
这样就不必创建完整的list,从而节省大量空间,在python中,这样一边循环一遍计算的机制,称为生成器,generator


#这是列表推导式
list=[x*3 for x in range(20)]
print (type(list))

#生成器把[]改成 ()就成了生成器,所以()是生成器,[]是列表推导式,{}是字典推导式
list1=(x*3 for x in range(20))
print (type(list1))
print (list1)

#推到式是一股脑的生成一列数据,而生成器可以根据你的动作得到你想要的数据
#成了生成器后,会有特定的函数,比如__next__,每次调用可以得到列表的下一个元素。这样只有调用才会占用内存,用到什么就调用什么,可以减少使用内存
#方式一
print (list1.__next__())
print (list1.__next__())
print (list1.__next__())

#方式二,使用next内置函数,next里面是生成器对象,每调用一个next就会产生一个元素,这里输出9
#当生成器next一直调用,range(10),超出10的时候再次调用会报错 StopIteration
print (next(list1))

示例

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# BY:wenchao.Li time: 2021/10/11

'''
条件:
1.定义一个函数,函数中有yield
2。调用函数,接收调用的结果
3.得到的结果就是生成器,
4.借助 __next__ 或者 next 得到元素
'''


def func():
    n=0
    while True:
       n+=1
       #下面不加yield,加一个print (n)就是一个死循环了,加上yeild就是一个生成器
       # print (n)
       #注意,只要函数中出现 yield就是生成器了,不是一个函数了
       yield n

g=func()
print (g)

#这里会输出1,2,从这里可以看出, yield相当于 return功能+ 暂停的效果,不会一直死循环。并输入结果
print (next(g))
print (next(g))

#在这里使用生成器计算斐波那契函数,
#菲波那切函数是从 0开始, 第三个数是第一个和第二个数相加。   第四个是第三个和第二个相加,以此类推


def fib(length):
    a,b=0,1
    n=0
    while n < length:
        yield b
        a,b=b,a+b
        n+=1
    return '没有更多的参数了'

result=next(fib(3))
print("斐波那契的第三个数是:{}".format(result))

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# BY:wenchao.Li time: 2021/10/11

def gen():
    i=0
    while i < 5:
        temp = yield i
        print ('temp',temp)
        i +=1
    return "没有更多的数据"

g=gen()

print (next(g))
print (next(g))
print (next(g))
#可以看到上面输出的是None,除了next和__next__还有send

print (g.send(None))
n1=g.send("嘻嘻")
print ('n1',n1)
n2=g.send("哈哈")
print ('n2',n2)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# BY:wenchao.Li time: 2021/10/11


#进程》线程》协程
#迅雷的协程底层就是拿生成器来写的
#一个100G电影,10个线程同时工作,分成10分,同时进行


#生成器多任务


def task1(n):
    for i in range(n):
        print ("正在搬第{}几块砖".format(i))

def task2(n):
    for i in range(n):
        print ("正在听第{}首歌".format(i))

#这样只能先搬完10块砖,才能听10首歌。那怎么才能并行呢,这时候生成器就可以了
task1(10)
task2(10)

####################################################################################分割线,下面的是加了生成器并行部分


def task1(n):
    for i in range(n):
        print ("正在搬第{}几块砖".format(i))
        yield None

def task2(n):
    for i in range(n):
        print ("正在听第{}首歌".format(i))
        yield None
#有了生成器,顺序就可以由自己决定了
g1=task1(5)
g2=task2(5)
while True:
    try:
        g1.__next__()
        g2.__next__()
    except:
        pass


###########上面可以控制打印任务交替了,但是并没有并发,接下来会涉及到协程的,后面会再讲,这里暂且停止了
#回顾知识点:
'''
生成器方式:
1.通过列表推导式子
    g=(x*3 for x in range(10))
2.函数列有 yield
    
产生元素:
1.next(generactor) 每次调用产生一个元素,元素产生完毕,再次调用就会异常
2.生成器自己的办法:
    g.__next__
    g.send(key)

标签:__,10,python,生成器,yield,next,print
From: https://www.cnblogs.com/liwenchao1995/p/17551794.html

相关文章

  • python 生成荣誉证书
    准备材料荣誉证书空白模板机构印章用户照片字体Xingkai.ttcSTHeitiMedium.ttcShiGongZiHei.otfpython代码importtimefromPILimportImage,ImageDraw,ImageFontfromdatetimeimportdatetimedefmake_badge(nickname,subject_name,id_no,dist,mark......
  • python之数据库: 约束条件
    约束条件"""约束条件的意思是,在数据类型的基础上再添加限制条件"""1.unsigned去除符号createtablet1(idintunsigned);2.zerofill3.notnull非空createtablet2(idint,namevarchar(16));以上例子15:#在mysql中,''和null不一样createtablet3(idi......
  • python 机器学习概述
    1.1人工智能概述1.2人工智能发展历程1.图灵测试2.达特矛斯会议(1956年,人工智能元年)1.3人工智能的主要分支1.人工智能、机器学习和深度学习的关系机器学习是人工智能的一个实现途径深度学习是机器学习的一个方法发展而来2.主要分支介绍......
  • C#开发中IronPython的使用
    目前的最新版本是:3.4.1安装Install-PackageIronPython如果需要使用标准库,则进行下面的安装Install-PackageIronPython.StdLib在C#程序中执行Python代码示例代码:vareng=IronPython.Hosting.Python.CreateEngine();varscope=eng.CreateScope();eng.Execute(@"......
  • 供应链产能受限型选址模型——Python实现
    选址问题是运筹学中非常经典的问题。选址问题是指在确定选址对象,选址目标区,成本函数以及存在何种约束条件的前提下,以总物流成本最低或总服务最优或社会效益最大化为总目标,以确定物流系统中物流节点的数量、位置,从而合理规划物流网络结构。设施选址问题(FacilityLocationProblem)自......
  • python 迭代器
    目录python迭代器迭代器python迭代器迭代器#迭代是访问集合元素的一种方式,迭代器是一个可以记住遍历位置的对象#迭代器从集合的第一个元素开始访问,直到所有的元素被访问结束#迭代器只能前进不能后退#可以被next()函数调用并不断返回下一值的对象称为迭代器Iterator......
  • 如何实现python直方图的具体操作步骤
    Python直方图直方图是数据可视化中常用的一种图形表示方式,它可以将数据按照一定的范围分成若干个区间,并统计每个区间内数据的个数。Python提供了多种库和函数来绘制直方图,使得数据分析和数据挖掘更加方便和直观。matplotlib库绘制直方图在Python中,最常用的绘图库之一就是matplot......
  • 解决python正则匹配以某汉字开头,以}结尾的具体操作步骤
    Python正则匹配以某汉字开头,以}结尾前言在文本处理过程中,我们经常需要使用正则表达式来进行模式匹配,以找到特定的文本。Python中的re模块提供了正则表达式的支持,可以应用于各种文本处理任务中。本文将介绍如何使用Python的正则表达式来匹配以某汉字开头,以}结尾的文本。正则表达......
  • python正则表达式中怎么引用变量 这个问题怎么解决?
    项目方案:使用Python正则表达式引用变量1.简介Python正则表达式是一种强大的文本处理工具,可以用于匹配、搜索、替换和验证字符串。在正则表达式中,有时候需要使用变量来引用匹配结果或者动态地构建正则表达式模式。本项目方案将介绍如何在Python正则表达式中引用变量,以及如何使用......
  • 解决python找色脚本的具体操作步骤
    Python找色脚本实现步骤作为一名经验丰富的开发者,很高兴能帮助你学习如何实现Python找色脚本。下面我将详细介绍整个实现过程,并提供相应的代码和注释。步骤一:导入必要的库在开始之前,我们需要导入一些必要的库,以便在脚本中使用它们。这些库包括:importcv2importnumpyasnp......