首页 > 编程语言 >python基础-生成器

python基础-生成器

时间:2023-02-26 13:22:56浏览次数:41  
标签:__ python 生成器 基础 yield next lst print

# 生成器的本质就是迭代器,在python中有两种方式来获取生成器:
# 1.通过生成器函数
# 2.通过生成器表达式来实现生成器


def func():
    print("123")
    yield "你好!" # 该函数当中有yield,该函数就是一个生成器函数,yield也有返回的意思


gen = func() #生成器函数在被执行的时候,创建生成器
print(gen)
# <generator object func at 0x00000216F3854040>
# 生成器对象 func 在 0x00000216F3854040
ret = gen.__next__() # 可以让生成器函数执行到下一个yield
# 输出 123
print(ret)
# 输出 你好



# 在一个函数当中可以有多个yield
def func():
    print(11)
    yield "你好"
    print(22)
    yield "你不好"
    print(33)
    yield "你很好"


gen = func()
r = gen.__next__()
print("接受到的数据", r)

r2 = gen.__next__()
print("接受到的数据", r2)

r3 = gen.__next__()
print("接受到的数据", r3)

r4 = gen.__next__()
print("接受到的数据", r4)  # 当程序后面没有yield之后,此时会报错,StopIteration

"""
    生成器函数:
        1. 里面有yield
        2. 生成器函数在被执行的时候,实际是创建一个生成器函数出来
        3. 必须使用__next__()来执行一段代码,会自动执行到下一个yieldj结束
        4. yield也有返回的意思,可以让下一个函数分段执行
        5. 当后面没有yield之后,再次使用__next__()会报错StopIteration
"""


# 生成器函数的最大作用就是节省内存
# 举个例子
# 买一万件衣服
# 常规做法
def order():
    lst = []
    for i in range(10000): # 会比较消费内存
        lst.append(f"衣服{i}")
    return lst

lst =  order()
print(lst)


# 生成器,执行一次next就只会输出一次
def order():
    for i in range(10000):
        yield f"衣服{i}"

lst = order()
print(lst.__next__())

#
def order():
    lst = []
    for i in range(10000):
        lst.append(f"衣服{i}")
        if len(lst) == 50:
            yield lst
            lst = []


lst = order()
print(lst.__next__())


"""
__next__
send
        相同点:可以执行到下一个yield
        不同点:send可以给上一个yield位置传参
"""


def func():
    print("111")
    a = yield "你好"
    print("222", a)
    b = yield "我不好"
    print("333", b)
    c = yield "你也不好"
    yield "红烧"

g = func()
r1 = g.__next__()  # 第一次执行必须用next 不能使用send
print(r1)
r2 = g.send("呵呵") # send给上一个yield位置发送 “呵呵”
print(r2)

 

标签:__,python,生成器,基础,yield,next,lst,print
From: https://www.cnblogs.com/Wesuiliye/p/17156524.html

相关文章

  • 【Mybatis】【基础设施】【四】Mybatis源码解析-ResolverUtil解析工具
    1 前言上一节我们在解析别名的时候,会有个package的标签,会获取包名下的所有类的信息,就是用到了ResolverUtil这个工具去获取的,那么我们本节看下这个工具的真实面目。2 ......
  • python 的 Type Hint 类型标注学习笔记
    学习笔记,用于本人忘记知识点时回顾。int在变量后加int即可声明该变量为int类型,当调用该函数时,如果填入的参数不为int类型,则报错。函数名后加->int声明该函数......
  • 【Mybatis】【基础设施】【三】Mybatis源码解析-VFS虚拟文件系统
    1 前言这节我们介绍Mybatis又一个出现的基础设施VFS,他是干啥的呢,就是加载指定目录下的文件的。前置知识:java.net.URL这个类知道么,不要看名字把它觉得就是我们浏览器里......
  • python enumerate
    ​​enumerate​​(iterable, start=0)Returnanenumerateobject. iterable mustbeasequence,an ​​iterator​​​,orsomeotherobjectwhichsupportsiter......
  • Python 学习05 函数
    49、函数的定义50、函数的参数51、灵活地使用函数参数......
  • Django 框架基础9:视图(V)类视图、中间件
    1、类视图类视图是采用面向对象的思路定义类视图①继承自django.views的View。②不同的请求方式有不同的业务逻辑.类视图的方法就直接采用http请求名字作为函数名,如,ge......
  • Python笔记--练习题(都来瞧一瞧,看一看嘞)
    利用Python对文件进行操作重新写入的文件如下图所示:统计学生成绩文件的最高分最低分和平均分Python如何统计英文文章出现最多的单词Python统计目录下的文件大小......
  • 算法基础1.1.2归并排序
    前言归并排序的思路其实和快速排序的很像,都有递归的过程。但是区别是:快速排序是先处理好这一层,然后再进行传递,在传递到底后,其实排序就已经完成了。而归并排序是先直接一......
  • 数论基础笔记
    数论基础DanBoneh课程中数论基础笔记,该部分内容用于构建以下密码学相关部分:KeyExchangeProtocolsDigitalSignaturesPublic-KeyEncryption目录数论基础Notation......
  • python计算Friedman排名代码
    python计算Friedman排名代码首先先说输入数据,为了迅速处理,采用csv格式的表格,读者可以先理解这里提供的示例和代码,再自行调整下面是代码,代码会生成一个排名文件Rank.c......