首页 > 编程语言 >Python 迭代器和生成器

Python 迭代器和生成器

时间:2023-06-20 18:45:35浏览次数:41  
标签:gmkk 迭代 Python 生成器 next evescn print 包子

Python 迭代器和生成器

1、迭代器

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件

特点:

  • 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
  • 不能随机访问集合中的某个值 ,只能从头到尾依次访问
  • 访问到一半时不能往回退
  • 便于循环比较大的数据集合,节省内存

创建一个迭代器:

name = iter(['evescn', 'root', 'gmkk'])
 
print(name)
print(name.__next__())
print(name.__next__())
print(name.__next__())
 
print("-------------------")
 
# 如何迭代的读入文件
f = open("test.txt")
 
for line in f:
    print(line.strip())
 
# 输出结果
<list_iterator object at 0x00000000027CA8D0>
evescn
root
gmkk
--------------------
evescn
root
gmkk

2、生成器 generator

如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

g = (x * x for x in range(10))
 
for i in g:
    print(i)
 
# 输出结果
0
1
4
9
16
25
36
49
64
81

定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器

创建一个生成器:

def cash_money(amount):
    while amount > 0:
        amount -= 100
        print("又来取钱了")
        yield 100
        # print("又来取钱了")
 
 
atm = cash_money(500)
print(type(atm))
print("取走了", next(atm))
print("取走了", next(atm))
print("取走了", next(atm))
print("取走了", next(atm))
print("取走了", next(atm))
 
 
# 输出结果
<class 'generator'>
又来取钱了
取走了 100
又来取钱了
取走了 100
又来取钱了
取走了 100
又来取钱了
取走了 100
又来取钱了
取走了 100

yield的作用:可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,重新调用这个函数时,从上次yield(中断)的下一句开始执行。

3、yield 在单线程下实现并发运算的效果

import time
 
 
def consumer(name):
    print("%s准备吃包子了" %name)
    while True:
        baozi = yield
        print("第%s盘包子来了,包子被%s吃了" %(baozi, name))
 
 
def producer(name):
    c1 = consumer("evescn")
    c2 = consumer("gmkk")
    c1.__next__()
    c2.__next__()
 
    print("厨师开始做包子了")
    for i in range(10):
        time.sleep(1)
        print("做了2个包子")
        c1.send(i+1)
        c2.send(i+1)
 
producer("root")
 
 
# 输出结果
evescn准备吃包子了
gmkk准备吃包子了
厨师开始做包子了
做了2个包子
第1盘包子来了,包子被evescn吃了
第1盘包子来了,包子被gmkk吃了
做了2个包子
第2盘包子来了,包子被evescn吃了
第2盘包子来了,包子被gmkk吃了
做了2个包子
第3盘包子来了,包子被evescn吃了
第3盘包子来了,包子被gmkk吃了
做了2个包子
第4盘包子来了,包子被evescn吃了
第4盘包子来了,包子被gmkk吃了
做了2个包子
第5盘包子来了,包子被evescn吃了
第5盘包子来了,包子被gmkk吃了
做了2个包子
第6盘包子来了,包子被evescn吃了
第6盘包子来了,包子被gmkk吃了
做了2个包子
第7盘包子来了,包子被evescn吃了
第7盘包子来了,包子被gmkk吃了
做了2个包子
第8盘包子来了,包子被evescn吃了
第8盘包子来了,包子被gmkk吃了
做了2个包子
第9盘包子来了,包子被evescn吃了
第9盘包子来了,包子被gmkk吃了
做了2个包子
第10盘包子来了,包子被evescn吃了
第10盘包子来了,包子被gmkk吃了

标签:gmkk,迭代,Python,生成器,next,evescn,print,包子
From: https://www.cnblogs.com/evescn/p/17494419.html

相关文章

  • 【python】logging日志打印重复输出冗余日志
    https://blog.csdn.net/Moonlight_16/article/details/123334339?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-123334339-blog-96309743.235%5Ev38%5Epc_relevant_anti_t3_base&depth_1-utm_source=......
  • Python工具箱系列(三十六)
    基于Docker的数据库开发环境前文介绍了sqlite/mysql/mssql等数据库系统在ubuntu的安装与部署过程,相对是比较复杂的,需要耐心等待下载以及排除各种故障,对于开发人员来说是不太友好。在某些情况下,开发人员要测试在多个数据库环境下软件的正确性,需要部署多个数据库,为此可以使用Docker技......
  • 超级详细的python爬虫
    演示一个虎扑体育网站-NBA球员新手的话需要安装两个模块requests和lxmlrequests的作用:就是爬虫模块不断向浏览器发送请求lxml的作用:模块可以利用XPath规则语法,来快速的定位HTML\XML文档中特定元素以及获取节点信息1.mportrequests2.fromlxmlimportetree3.ur......
  • MongoDB批量导入Redis优化迭代笔记
    背景统计最近五天所有content信息的正文字节数(正文字段占用较多),然后根据这个大小,推送存在redis要配置多少的内存。统计方法1.在mongodb中查询db.content_.aggregate([{$match:{updatetime:{$gte:1686134400000,//对应日期"2023-06-07T00:00:00Z"的......
  • Python 强制杀死运行中的多进程脚本
    本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!Python强制杀死运行中的多进程脚本,实现完全停止环境win10Pytho3.9获取当前脚本的进程id#获取当前进程......
  • requests爬虫实践之安居客二手房屋数据(python实现)
    1.先从安居客官网上淘到如下数据(详细方法可见博主爬取爱彼迎那篇博客):2.源码(警告:若频繁爬取安居客官网数据,将被要求入网验证…)importrequestsfrombs4importBeautifulSoupheaders={'user-agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,l......
  • Python开发系列课程(2) - 语言元素
    语言元素指令和程序计算机的硬件系统通常由五大部件构成,包括:运算器、控制器、存储器、输入设备和输出设备。其中,运算器和控制器放在一起就是我们通常所说的中央处理器,它的功能是执行各种运算和控制指令以及处理计算机软件中的数据。我们通常所说的程序实际上就是指令的集合,我们写程......
  • python 星号(*) 还能这么用
    哈喽大家好,我是咸鱼今天跟大家介绍一下python当中星号(*)的一些用法首先大家最常见的就是在python中*是乘法运算符,实现乘法sum=5*5#25除此之外,还有一种常见的用法就是*号操作符在函数中的用法单星号(*)在函数中用法举个例子,你有一个函数,用来实现两个数求和def......
  • 强化学习从基础到进阶-常见问题和面试必知必答[2]:马尔科夫决策、贝尔曼方程、动态规划
    强化学习从基础到进阶-常见问题和面试必知必答[2]:马尔科夫决策、贝尔曼方程、动态规划、策略价值迭代1.马尔科夫决策核心词汇马尔可夫性质(Markovproperty,MP):如果某一个过程未来的状态与过去的状态无关,只由现在的状态决定,那么其具有马尔可夫性质。换句话说,一个状态的下一个状态......
  • 强化学习从基础到进阶-常见问题和面试必知必答[2]:马尔科夫决策、贝尔曼方程、动态规划
    强化学习从基础到进阶-常见问题和面试必知必答[2]:马尔科夫决策、贝尔曼方程、动态规划、策略价值迭代1.马尔科夫决策核心词汇马尔可夫性质(Markovproperty,MP):如果某一个过程未来的状态与过去的状态无关,只由现在的状态决定,那么其具有马尔可夫性质。换句话说,一个状态的下一个状态......