python 生成式,迭代器,生成器

DAY 6. 生成式,迭代器,生成器

6.1 生成式

6.1.1 列表生成式

list = [index for index in range(10)]

6.1.2 字典生成式

dict = {'zhangsan': 10,'lisi': 12,'wangwu': 18
}
# 实现键值互换
dict = {k:v for v,k in dict.items() if k >= 12}

6.1.3 集合生成式

# 100以内的质数
set = {i for i in range(100) if i % 2 != 0}

6.2 生成器

生成式会创建一个列表(字典或集合),但无论是字典,列表还是集合,都不能保存一个无限长的序列,比如说全体自然数,当然我们一般不会用到这种序列,但哪怕是万位的序列,保存为列表或集合也是很占用空间的,加上一般情况下我们对一个序列的操作是一次性的,根本不需要保存,那有没有一种办法只有我们需要时才给我们数据,我们不需要时程序只保留“算法”呢?这就用到了生成器

创建生成器有两种办法,一种是类似于推导式,把列表推导式的中括号改为小括号就行,会返回一个生成器对象,可以使用next()或for循环遍历

t = (i for i in range(100) if i % 2 == 0)
for i in t:print(i)

举个栗子,斐波那契数列,每一项是前两项之和

一般情况

feibo = [1, 1]
for i in range(2,10000):feibo.append(feibo[i - 1] + feibo[i - 2])
print(feibo)

我们要做的只是要打印出来而已,没必要保存这么大的数组,这时我们可以用生成器

def feb(f, s, max):i = 0while i < max:f, s = s, f + si += 1yield sfor i in feb(1, 1, 100):print(i)

生成器长得和函数一样,只不过return 变成了yield ,每当运行到yield后,程序就会阻塞,只有在调用该生成器的next()方法时才会从上次暂停的地方继续

def Demo():print(1)yield 1print(2)yield 2print(3)yield 3demo = Demo()
next(demo)
next(demo)
next(demo)
next(demo)# 1
# 2
# 3
# Traceback (most recent call last):
#   File "E:/xxxx/DAY6_1.py", line 45, in <module>
#     next(demo)
# StopIteration

当超出生成器范围时会抛出StopIteration异常,我们一般也不会使用next,for就是捕捉StopIteration异常遍历生成器的

for i in Demo():i# 等价于while(True):try:next(demo)except StopIteration:break

6.3 迭代器

6.3.1 可迭代对象

可以直接作用于for循环的对象统称为可迭代对象:Iterable,主要有两类,列表,元组,字典,集合等数据类型和生成器,可以使用isinstance()判断一个对象是否是Iterable对象。

6.3.2 迭代器

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。可以使用isinstance()判断一个对象是否是Iterator对象

生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。把list、dict、str等Iterable变成Iterator可以使用iter()函数

你可能会问,为什么list、dict、str等数据类型不是Iterator?

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

6.4 总结

  • 生成式
生成式语法
列表生成式L = [i for i in range(100) if i % 2 ==0]
字典生成式k:v for k, v in dict.items() if k < 10
集合生成式S = {i for i in range(100) if i % 2 ==0}
  • 生成器

创建:
生成式方式和生成器函数
读取:
next()或for

  • 迭代器
可迭代对象能被for直接作用的对象
迭代器能用next()执行的可迭代对象

参考文章:

GitHub python面试题

廖雪峰的官方网站

python 生成器和迭代器有这篇就够了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell MAC 地址 校验

/**************************************************************************************** shell MAC 地址 校验* 说明&#xff1a;* 要对MAC地址进行校验&#xff0c;记录一下正则表达式写法&#xff0c;有些方法在PC上验证是可行的&…

移动端Web开发如何处理横竖屏

<!Doctype html> <html> <head> <meta charset"utf-8"> <meta id"viewport" name"viewport" content"widthdevice-width,initial-scale1.0;"> <title>横竖屏切换检测</title> <style ty…

恩智浦智能车大赛2020_内蒙古科技大学第九届智能车大赛校内公开赛总决赛

为了激发学生的创新意识&#xff0c;提高学生的动手能力&#xff0c;培养团队合作意识&#xff0c;秉承“实践源于真知&#xff0c;创新放飞梦想”的思想。2020年12月6日&#xff0c;内蒙古科技大学第九届智能车大赛总决赛如约而至。本次大赛有来自各院系的223支队伍报名参加了…

python格式化字符串的三种方法(%,format,f-string)

DAY 7. 格式化字符串 到目前为止&#xff0c;我所知道的&#xff0c;python格式化字符串有三种方法&#xff0c;第一是早期就有的%&#xff0c;其次是2.5之后的format(),还有就是3.6添加的f字符串调试 7.1 %格式化字符串 %格式化字符串是python最早的&#xff0c;也是能兼容…

Android App 优化之 ANR 详解

为了便于阅读, 应邀将Android App性能优化系列, 转移到掘金原创上来.掘金的新出的"收藏集"功能可以用来做系列文集了. 今天先来聊聊ANR. 1, 你碰到ANR了吗 在App使用过程中, 你可能遇到过这样的情况: 恭喜你, 这就是传说中的ANR. 1.1 何为ANR ANR全名Application Not…

微信高级群发接口正文乱码解决方案

content里面的内空如果含有html标签的话&#xff0c;需要对内容进行一下转义。如果里面含有style".."类似于这样的带""号的内容的话&#xff0c;就更需要注意了。 foreach ($news as &$item) {foreach ($item as $key > $val){if ($key content){$…

python *args和**kwargs以及序列解包

DAY 8. *args和**kwargs *args&#xff1a;多值元组&#xff0c;**kwargs多值字典&#xff0c;他们是python函数传参时两个特殊的参数&#xff0c;args和kwargs并不是强制的&#xff0c;但习惯使用这两个&#xff0c;如果在函数参数列表中声明了*args&#xff0c;则允许传递任…

解读直播连麦与点播加密

近年来&#xff0c;直播热潮持续升温。有需求就会有变革&#xff0c;直播的相关技术也在不断更新&#xff0c;为直播行业带来更好地服务。如&#xff1a;直播连麦与点播加密技术等。 直播连麦&#xff0c;即主播与连麦者通过互动直播中心进行实时互动&#xff0c;信息在云端混流…

血红蛋白判断access程序答案_普渡大学开发智能手机应用程序 帮助评估贫血症情况...

医生诊断贫血疾病的方法之一&#xff0c;就是通过观察患者的眼皮&#xff0c;判断眼皮是否发红&#xff0c;从而判断红细胞的数量。但对医生来说&#xff0c;面临的挑战是&#xff0c;这种简单的测试不够精确&#xff0c;无法不从患者身上抽取血样就能给出诊断。美国普渡大学的…

学习笔记:AC自动机

话说AC自动机有什么用......我想要自动AC机 AC自动机简介&#xff1a; 首先简要介绍一下AC自动机&#xff1a;Aho-Corasick automation&#xff0c;该算法在1975年产生于贝尔实验室&#xff0c;是著名的多模匹配算法之一。一个常见的例子就是给出n个单词&#xff0c;再给出一段…

python闭包和装饰器

DAY 9. 闭包和装饰器 9.1 闭包 闭包就是内部函数对外部函数作用域内变量的引用 可以看出 闭包是针对函数的&#xff0c;还有两个函数&#xff0c;内部函数和外部函数闭包是为了让内部函数引用外部函数作用域内的变量的 我们先写两个函数 def fun1():print("我是fun1&q…

学历是铜牌,能力是银牌,人脉是金牌,思维是王牌

有人工作&#xff0c;有人上学&#xff0c;大家千万不要错过这篇文章&#xff0c;能看到这篇文章也是一种幸运&#xff0c;真的受益匪浅&#xff0c;对我有很大启迪&#xff0c;这篇文章将会改变你我的一生&#xff0c;真的太好了&#xff0c;希望与有缘人分享&#xff0c;也希…

石头剪刀布python编程_《python核心编程第二版》练习题——游戏:石头剪刀布

习题里比较有意思的一个题目&#xff0c;实现石头剪刀布这个游戏&#xff0c;起初设计的时候走弯路了(主要时被习题里那个“尽量少用if判断”给整晕了)&#xff0c;想的太复杂&#xff0c;后来发现其实非常简单&#xff0c;完全可以不写if语句。还是枚举法&#xff1a;#! /usr/…

SpringMvc面试题

f-sm-1. 讲下SpringMvc和Struts1,Struts2的比较的优势 性能上Struts1>SpringMvc>Struts2 开发速度上SpringMvc和Struts2差不多,比Struts1要高f-sm-2. 讲下SpringMvc的核心入口类是什么,Struts1,Struts2的分别是什么 SpringMvc的是DispatchServlet,Struts1的是ActionServl…

python 鸭子类型

DAY 10. 鸭子类型 这个概念来源于美国印第安纳州的诗人詹姆斯惠特科姆莱利&#xff08;James Whitcomb Riley,1849-1916&#xff09;的诗句&#xff1a;”When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.”…

thinkphp一句话疑难解决笔记

URL_PATHINFO_DEPR, depr表示 网页路径"分隔符",用"-", 有利于seo,注意是从 sername/index.php(开始的)/home-user-login-var-value开始的,pathinfo也支持普通的参数传值(仅仅支持参数...). 在thinkphp中,有两个地方使用depr,另一个就是tpl的文件目录组织分…

python选取特定行_pandas.DataFrame选取/排除特定行的方法

pandas.DataFrame选取特定行使用Python进行数据分析时&#xff0c;经常要使用到的一个数据结构就是pandas的DataFrame&#xff0c;如果我们想要像Excel的筛选那样&#xff0c;只要其中的一行或某几行&#xff0c;可以使用isin()方法&#xff0c;将需要的行的值以列表方式传入&a…

学校选址_洛谷U3451_带权中位数

题目描述 在一条大路一旁有许多栋楼&#xff0c;每栋楼里有许多小学生&#xff08;哈哈哈一波小学生来袭&#xff01;&#xff09;。但是这条路上没有小学&#xff01;&#xff01;&#xff01;&#xff01;所以唯恐世界不乱的牛A打算在路上&#xff08;汽车什么的都不敢来这个…

python 重载的实现(single-dispatch generic function)

DAY 11. python 重载 函数重载是指允许定义参数数量或类型不同的同名函数&#xff0c;程序在运行时会根据所传递的参数类型选择应该调用的函数 &#xff0c;但在默认情况下&#xff0c;python是不支持函数重载的&#xff0c;定义同名函数会发生覆盖 def foo(a:int):print(fin…

SQL中的多表查询,以及JOIN的顺序重要么?

说法是&#xff0c;一般来说&#xff0c;JOIN的顺序不重要&#xff0c;除非你要自己定制driving table。 示例&#xff1a; SELECT a.account_id, c.fed_id, e.fname, e.lname-> FROM account AS a INNER JOIN customer AS c-> ON a.cust_id c.cust_id-> INNER JOIN …