首页 > 编程语言 >Python-6生成器

Python-6生成器

时间:2023-05-10 15:44:20浏览次数:43  
标签:迭代 Python 生成器 yield next print gen

1.生成器:本质是一个迭代器,允许自定义逻辑的迭代器。

2.生成器和迭代器的区别:①迭代器本身是系统内置的,重写不了

              ②生成器是用户自定义,可以重写迭代逻辑

3.生成器可以两种方式创建:①生成器表达式(里面推导式,外面圆括号)

               ②生成器函数,里面由def 定义,里面有yield

4.生成器函数:①yield类似于return

         ②共同点:执行到这句话都能返回出去值。

         ③不同点:yield返回时,会记住上一次执行的位置,下次调用。而return直接终止函数,下一次重头调用。

         ④一般使用yield x,不加括号。

"""
-*- coding: utf-8 -*-
@FileName: 生成器.py
@Software: PyCharm
@Time    : 2023/5/9 16:54
@Author  : Panda
"""


gen = (i for i in range(10))
print(gen)

from collections import Iterable, Iterator
print(isinstance(gen, Iterator))
# Output:True

# 因为本质是迭代器,所以取值使用迭代器的取值方式
print(next(gen))

# 1.初步使用
def mygen():
    print("111")
    yield 1
    print("222")
    yield 2
    print("333")
    return 3

gen = mygen()
res = next(gen)
print(res)

res = next(gen)
print(res)

res = next(gen)
print(res)

def mygen1():
    for i in range(101):
        yield i

# 2.有多个值需要初始化生成器
gen = mygen1()
for i in range(30):
    num = next(gen)
    print(num)
# 会接着上一次暂停的位置再次读取
for i in range(20):
    num = next(gen)
    print(num)

# 3.send
"""
next和send的区别:
    next 只能取值
    send 不但能取值,还能发送值
send:
    第一个send不能给yield传值,默认只能写None
    最后一个yield接收不到send的发送值
"""
def mygen2():
    yield 1
    x = yield 2
    # print(x)
    yield x + 2
    yield "Done"


g = mygen2()

print(next(g))
# Output:1
print(next(g))
# Output:2
print(g.send(4))
# Output:6  在使用send的情况中,需要在第几次yield返回时,就在第几次传值
print(next(g))
# Output:Done

# 4.yield from 使用:可以将一个可迭代对象变成一个迭代器返回
def mygen4():
    ls = ["no1", "no2", "no3", "no4"]
    yield from ls


gen = mygen4()
print(gen.__next__())
# Output:no1
print(next(gen))
# Output:no2

# 5.斐波那契数列 每一个数的值都是前两个数的值的和
def mygen4(maxval):
    a, b = 0, 1
    i = 0
    while i < maxval:
        yield b  # 返回的时候,一定要注意
        a, b = b, a + b
        i += 1

gen = mygen4(20)

for i in range(5):
    print(next(gen))
# Output: 1 1 2 3 5

标签:迭代,Python,生成器,yield,next,print,gen
From: https://www.cnblogs.com/future-panda/p/17385933.html

相关文章

  • python 内存管理
    内存管理是指在程序运行期间,如何分配和释放计算机内存资源的过程。在Python中,内存管理是由Python解释器自动完成的,开发者不需要手动地进行内存分配和释放。Python解释器使用自动垃圾回收机制来管理内存,这个机制可以跟踪对象的引用计数,并且在对象不再被使用时将其自动释放。举例来......
  • python 多线程与队列
    多线程是指在一个程序中同时运行多个线程,每个线程都可以独立地执行特定的任务。在Python中,可以使用内置的threading模块来创建和管理线程。使用多线程的主要优点是能够提高程序的性能和响应速度,特别是在处理I/O操作时。通过将耗时的任务放入后台线程中,主线程可以继续执行其他任务......
  • python 自省
    数据在Python中是指程序中存储、操作和处理的信息。数据可以是数字、字符串、布尔值等不同类型,而且可以通过变量来进行标识。自省是一种特性,意味着能够访问和修改对象本身的属性和方法。在Python中,可以使用dir()函数查看一个对象具有哪些属性和方法,并使用type()函数查看对象类型......
  • Python程序执行的流程控制(选择和循环)
    选择结构单分支if条件:语句块(注意要打冒号冒号冒号,用缩进代替大括号的功能)双分支if条件:语句块1else:语句块2多分支if条件1:语句块1elif条件2:语句块2……else:语句块n若有多个条件都满足,只执行第一个被满足条件......
  • python---测试过程中增加进度条
    前言我们再执行自动化测试时,或者调试时,自动化测试用例数量过多,不清楚目前用例数执行了多少个了,还差多少个执行完成,这时候就会猜想,如果执行过程中存在进度条,就很清楚的了解到测试用例的执行情况,今天小编通过下面两种方法简单介绍如何在自动化测试时加入进度条pytest-sugarpytest......
  • 正则表达式语法及其在python的应用
    一、语法参考:https://www.liujiangblog.com/course/python/731、普通字符:正则表达式中的普通字符在进行匹配的时候只会匹配与自身相同的一个字符。2、元字符:.小数点;|逻辑或;[]匹配字符集中的一个字符;[^]对字符集求反;-定义字符集中的字符区间;\对紧跟其后的一个字符进行转义;()对表......
  • mac下 nvm 安装 node 版本报错 python: not found
    mac下nvminstallv12.22.12时,始终限制安装失败,解决方案,做好以下两件事:将镜像源更换位淘宝镜像源将终端app右键显示简介,勾选rosetta重启终端即可参考 https://blog.csdn.net/xinshou_caizhu/article/details/128889858https://www.jianshu.com/p/2b47107e188a?utm......
  • Python 密码破解指南:15~19
    协议:CCBY-NC-SA4.0译者:飞龙本文来自【OpenDocCN饱和式翻译计划】,采用译后编辑(MTPE)流程来尽可能提升效率。收割SB的人会被SB们封神,试图唤醒SB的人是SB眼中的SB。——SB第三定律十五、破解仿射密码原文:https://inventwithpython.com/cracking/chapter15.html......
  • 007 python3写一个http接口服务(get, post),给别人调用
    一、python3写一个http接口服务,给别人调用3这次选择fastapi,FastAPI是一个现代的、快速(高性能)的web框架,用于基于标准Python类型提示使用Python3.6+构建api。具有快速、快速编码、更少的错误、直观、简单、简便、健壮。简易而且本地win10能够跑起来二、FastAPI的get接口代码实现......
  • Python 密码破解指南:0~4
    协议:CCBY-NC-SA4.0译者:飞龙本文来自【OpenDocCN饱和式翻译计划】,采用译后编辑(MTPE)流程来尽可能提升效率。收割SB的人会被SB们封神,试图唤醒SB的人是SB眼中的SB。——SB第三定律零、简介原文:https://inventwithpython.com/cracking/chapter0.html“我是无意......