迭代和解析

深入解析迭代器和生成器 声明一个迭代器很简单 生成器,还能玩什么花样? def generator(k): i = 1 while True: yield i ** k i += 1gen_1 = generator(1) gen_3 = generator(3) print(gen_1) 阅读详情

列表解析与map

map把一个函数映射遍一个序列;列表把一个表达式映射到一个序列:

>>> list(map(ord, 'spam'))
[115, 112, 97, 109]
>>> [ord(x) for  x in 'spam']
[115, 112, 97, 109]

增加测试和嵌套循环:

>>> [x for x in range(5) if x % 2 == 0]
[0, 2, 4]
>>> list(filter((lambda x: x%2 == 0), range(5)))
[0, 2, 4]
>>> list(map((lambda x: x**2), filter((lambda x: x%2 == 0), range(10))))
[0, 4, 16, 36, 64]
>>> 

你可以在一个列表解析中编写任意数量的嵌套的for循环,并且每一个都有可选的if测试:

[expression for target1 in iterable1 [if condition]

                   for target2 in iterable2 [if condition]

                      ... ...

                   for targetN in iterableN [if condition]

>>> [x+y for x in [1,2,3] for y in [100,200,300]]
[101, 201, 301, 102, 202, 302, 103, 203, 303]
>>> [(x,y) for x in range(5) if x%2 == 0 for y in range(5) if y%2 == 1]
[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]

 

列表解析和矩阵

Python编写矩阵(多维数组)的一个最基本的方法计算使用嵌套的列表结构:

>>> m1 = [[1,2,3],
      [4,5,6],
      [7,8,9]]
>>> m1[1]
[4, 5, 6]
>>> [row[1] for row in m1]
[2, 5, 8]

当前python的测试下,map调用比等效的for循环要快两倍,而列表解析往往比mao调用要稍快一些。速度差距来自底层实现,map和列表解析在解释器中以C语言的速度运行的,比python的for循环在PVM中运行要快得多。

 

实际应用,用列表解析和map去除文件换行:

>>> open('threenames.py').readlines()
["a = 'dude'\n", "b = 'parrot'\n", "c = 'sketch'\n", 'print(a,b,c)\n']
>>> [line.rstrip() for line in open('threenames.py').readlines()]
["a = 'dude'", "b = 'parrot'", "c = 'sketch'", 'print(a,b,c)']
>>> [line.rstrip() for line in open('threenames.py')]
["a = 'dude'", "b = 'parrot'", "c = 'sketch'", 'print(a,b,c)']
>>> list(map((lambda x: x.rstrip()), open('threenames.py')))
["a = 'dude'", "b = 'parrot'", "c = 'sketch'", 'print(a,b,c)']
>>> 

列表解析还能作为一种列选择操作来使用。python的标准SQL数据库API将返回查询结果保存为与下班类似的元组列表:列表就是表,而元组是行,元组中的元素就是列的值:

>>> listOfTuple = [('bob', 35, 'mgr'), ('mel', 40, 'dev')]
>>> [age for (name, age, job) in listOfTuple]
[35, 40]
>>> list(map((lambda row: row[1]), listOfTuple))
[35, 40]
>>> 

重访迭代器:生成器

生成器函数:编写为常规的def语句,都是使用yield语句一次返回一个结果,在每个结果之间挂起和继续它们的状态。

生成器表达式:类似于上一小节的列表解析,但是,他们返回按需产生结果的一个对象,而不是构建一个结果列表。

二者都不会一次性构建一个列表,节省了内存空间,并且允许计算时间分散到各个结果请求。

 

生成器函数: yield VS return

状态挂起:生成器函数和常规函数之间的主要的代码不同之处在于,生成器yield一个值,而不是返回一个值。yield语句挂起该函数并向调用者发送回一个值,但是,保留足够的状态使得函数能够从它离开的地方继续。当继续时,函数在上一个yield返回后立即继续执行。

迭代协议整合:

可迭代对象定义了一个__next__方法,它要么返回迭代中的下一项,或者引发一个特殊的StopIteration异常来终止迭代。

 

生成器函数应用:

>>> def gensquares(N):
	for i in range(N):
		yield i**2

		
>>> a = gensquares(6)    # 得到一个生成器对象,它支持迭代协议
>>> next(a)
0
>>> next(a)
1
>>> next(a)
4
>>> next(a)
9
>>> next(a)
16
>>> next(a)
25
>>> next(a)    # raise一个StopIteration
Traceback (most recent call last):
  File "<pyshell#123>", line 1, in <module>
    next(a)
StopIteration
>>> 

 

生成器表达式:迭代器遇到列表解析

生成器表达式就像一般的列表解析一样,但是他们是括 圆括号中而不是方括号中的。

>>> [x**2 for x in range(5)]    # list comprehension
[0, 1, 4, 9, 16]
>>> (x**2 for x in range(5))    # generator expression
<generator object <genexpr> at 0x000002993B3E7E60>

 

编写一个列表解析基本上等同于:在一个list内置调用中包含一个生成器表达式以迫使其一次生成列表中所有的结果。

>>> list(x**2 for x in range(5))
[0, 1, 4, 9, 16]

我们一般不会机械的使用next迭代器来操作生成器表达式,因为for循环会自动触发。

>>> for num in (x**2 for x in range(5)):
	print(num)

	
0
1
4
9
16

如果生成器表达式是在嵌套的括号之内,就像在那些函数调用中,生成器自身的括号就不是必须的了。如下,第二个sorted例外

>>> sum(x**2 for x in range(5))
30
>>> sorted(x **2 for x in range(5))
[0, 1, 4, 9, 16]
>>> sorted(x ** 2 for x in range(5), reverse=True)
SyntaxError: Generator expression must be parenthesized if not sole argument
>>> sorted((x ** 2 for x in range(5)), reverse=True)
[16, 9, 4, 1, 0]
>>> import math
>>> list(map(math.sqrt, (x**2 for x in range(5))))
[0.0, 1.0, 2.0, 3.0, 4.0]
>>> 

生成器表达式大体上可以认为是对内存空间的优化,它们不需要像方括号的列表解析一样,一次构造出整个结果列表。它们在实际中运行起来可能稍慢一些,所以它们可能只对于非常大的结果集合的运算来说是最优的选择。

 

生成器是单迭代器对象

生成器函数和生成器表达式自身都是迭代器,并由此只支持一次活跃迭代--不像一些内置类型。

>>> g = (c * 4 for c in 'spam')
>>> g1 = iter(g)
>>> next(g1)
'ssss'
>>> next(g1)
'pppp'
>>> g2 = iter(g)    # 手动使用迭代会指向相同的位置
>>> next(g2)
'aaaa'
>>> g is g1    
True
>>> g is g2
True
>>> g1 is g2
True
>>> ll = [1,2,3,4]
>>> l1, l2 = iter(ll), iter(ll)    # 这个不是一次性活跃迭代,指向不同位置
>>> l1 is l2
False
>>> 

 

 

除了列表解析和生成器, python3中可用的解析表达式活跃集合解析和字典解析。

集合: {1,3,2}等同于set([1,3,2]),而新的集合解析语法{f(x) for x in S if P(x)} 就像是生成器表达式set(f(x) for x in S if P(x))

字典:新的字典解析语法{key: val for (key, val) in zip(keys, vals)}像dict(zip(keys, vals))一样工作,并且{x :f(x) for x in items}就像生成器表达式dict((x, f(x)) for x in items)一样。

>>> [x * x for x in range(5)] # list comprehension
[0, 1, 4, 9, 16]
>>> (x * x for x in range(5))    # generator expression
<generator object <genexpr> at 0x000002993B3E7F68>
>>> {x * x for x in range(5)}    # set comprehension
{0, 1, 4, 9, 16}
>>> {x: x * x for x in range(5)}    # dictionary comprehension
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
>>> 

Learning Python, Fourth Edition, by Mark Lutz.

干货分享,python列表迭代和列表解析 列表迭代和解析 列表是一个序列,可以使用in测试,使用for迭代。 例如: 1 >>> L = ["a","b","c","d"] 2 >>> 'c' in L 3 True 4 5 >>> for i in L: 6 ... print(i) 7 ... 8 a 9 b 10 c 11 d 再说列表解析,它指的是对序列中(... 阅读详情

相关推荐

从寄存器配置到G值:一份给STM32开发者的SC7A20加速度数据换算保姆级指南

本文为STM32开发者提供SC7A20三轴加速度传感器的数据换算保姆级指南,详细解析从寄存器配置到G值转换的全过程。涵盖量程选择、输出值换算原理及优化代码实现,帮助开发者快速掌握加速度数据的物理意义转换技巧,提升运动感知系统开发效率。

weixin_29172963的博客 172

DNS递归解析和迭代解析的区别

11.3.7 DNS递归解析原理 “递归解析”(或叫“递归查询”,其实意思是一样的)是最常见,也是默认的解析方式。在这种解析方式中,如果客户端配置的本地名称服务器不能解析的话,则后面的查询全由本地名称服务器代替DNS客户端进行查询,直到本地名称服务器从权威名称服务器得到了正确的解析结果,然后由本地名称服务器告诉DNS客户端查询的结果。 1.DNS递归解析基本流程 在这个查...

a3192048的博客 2万+

感应加热电源设计避坑指南:半桥LC串联谐振的5个关键问题

本文深入解析半桥LC串联谐振在感应加热电源设计中的5个关键问题,包括均压电阻选型、功率管驱动时序、谐振频率补偿等实战经验。通过真实故障案例和解决方案,帮助工程师避开常见设计陷阱,提升电路稳定性和效率,特别适合从事桥感应加热电源开发的工程师参考。

weixin_27013291的博客 510

SyntaxError: Generator expression must be parenthesized解决方案

由于django 1.11版本和python3.7版本不兼容, 2.0版本以后的Django修复了这个问题 Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x7fa26be637b8> Traceback (most recent call last):...

Doctor_96的博客 6777

【VeriStand】从零构建HIL测试平台:核心概念、硬件选型与实战配置指南

本文详细介绍了如何从零构建HIL测试平台,涵盖核心概念、硬件选型与实战配置指南。重点解析了VeriStand生态系统的优势,包括开箱即用特性、与LabVIEW的黄金搭档配合及Python支持。通过实战案例和硬件选型建议,帮助工程师高效搭建可靠的HIL测试平台,提升测试效率与安全性。

weixin_29250573的博客 329

使用STARTER V5.6软件将项目文件下载到S120驱动器控制单元CF卡中的具体方法演示

使用STARTER V5.6软件将项目文件下载到S120驱动器控制单元CF卡中的具体方法演示

Robot_PLC_HMI_Automation 1914

Django框架使用报错SyntaxError: Generator expression must be parenthesized解决方案

一、报错SyntaxError: Generator expression must be parenthesized 二、问题分析及解决方案: 问题原因: django1.11版本在python3.7中运行还有点兼容性问题. 解决方案一: 升级Django:将Django升级到1.11.17+或2.0+版本 pip3 install django==1.11.17 解决方案二: ...

BJ1599449的博客 792

从零开始跑通3DGS教程:(四)修改(缩放、空间变换)colmap生成的sfm结果

通过colmap进行的sfm的普通方式会丢失场景的物理尺度信息,并且并不在符合一般认知的坐标系下,本文将读取colmap生成的点云和相机pose,将其进行空间变换和缩放之后,重新保存,新保存的结果仍然可以被colmap读取以及进行后续的稠密重建以及3dgs等工作

诺有缸的高飞鸟的博客 1424

python3.7环境下创建app、运行Django1.11版本项目报错Generator expression must be parenthesized...

有些同学喜欢追求新鲜感~但追求新鲜感终归是要付出一点点代价的 在编程领域有一句至理名言:用东西不要用最新的! 就像每次苹果系统的升级都会有相当一部分用户的手机成砖一样 下面我们就介绍一个因版本升级带来的小bug: 在python3.6版本下安装运行django 1.11版本正常运行 但python3.7版本下运行django1.11版本就报错。 报错信息如下: Gene...

weixin_30512043的博客 407

基于UC3842的反激电源的全面深入解析与MATLAB仿真

内置电流检测,可实现电流模式控制,提高系统的动态响应性。多种保护功能,如欠压锁定、过温保护、短路保护等,确保系统的安全可靠运行。宽工作电压范围,适应不同的电源设计需求。简单的外部元件配置,易于实现。UC3842的典型应用包括开关电源、DC-DC转换器和反激式电源等,其稳定性和可靠性在实际应用中得到了广泛验证。

qq_38334677的博客 1086

【现代控制理论期末考点】

现代控制理论期末考点,适用于 SEU Automation

【人工智障 | 计算鸡视觉 | 机器孩】 1445

【Django框架】启动报错:Generator expression must be parenthesized

在熟悉django框架的时候,初次尝试django.setup() 启动框架 发现如下报错: Traceback (most recent call last): File "manage.py", line 22, in <module> execute_from_command_line(sys.argv) File "/Users/xxx/PycharmProjects/xxx/venv/lib/python3.8/site-packages/django/core/

AllisonLiu的博客 1131

目标检测YOLO实战应用案例100讲-【目标检测】缺陷检测(二)

在工业生产中总是经常遇到裂痕、划痕等产品的表面缺陷问题,机器视觉行业对于表面检测相比前几年已经有很大的突破,对于产品表面的划伤、污迹等检测已经不再是难点。在金属、玻璃、手机屏幕、液晶板等行业表面检测上应用广泛。但由于该类缺陷形状不规则、深浅对比度低,而且往往会被产品表面的自然纹理或图案所干扰。因此,表面划痕缺陷检测对于正确打光、相机分辨率、被检测部件与工业相机的相对位置、复杂的机器视觉算法等要求非常高。

qq_36130719的博客 728

迭代器和解析

迭代器 for循环可以用于python中任何序列类型。包括列表、元组、字符串。 如: for循环甚至比这更为通用:可用于任何可迭代的对象。实际上,对python中所有会从左至右扫描对象的迭代工具而言都是如此,这些迭代工具包括了for循环、列表解析、in成员关系测试以及map的内置函数等。 ...

孤的博客 312

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

python 迭代详解_python中迭代和解析

1、迭代工具包括:for循环,列表解析,in成员关系测试,及(map内置函数,sorted,zip,enumerate,filter返回可迭代对象)2、文件迭代器里面有一个__next__方法,每次调用时会返回文件中的下一行,当遇到文件末尾时,会引发StopIteration异常,而不是返回空字符串f = open('script1.py)f.__next()__3、手动迭代:iter和nextp...

weixin_39669769的博客 593

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

解析法和迭代法

解析法和迭代法在解决数学问题时各有优缺点,并且在不同的情况下具有不同的意义和适用性。

chen的博客 1579

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

浅谈DNS递归解析和迭代解析之间的区别

递归解析”是最常见也是默认的一种解析方式。在这种解析方式中,如果客户端配置的本地域名服务器(Local DNS服务器)不能解析的话,则后面的查询过程全部由本地域名服务器代替DNS客户端进行查询,直到本地域名服务器从权威域名服务器得到了正确的解析结果,然后由本地域名服务器告诉DNS客户端查询的结果。在整个递归查询过程中,除一开始客户端向本地域名服务器发起查询请求外,其余各个环节均是以本地域名服务器为中心进行迭代查询,DNS客户端一直处于等待状态,直到本地域名服务器发回最终查询结果。

2401_84488537的博客 4005

Python基础教程:迭代和解析

Python中的迭代是指按照元素的顺序逐个调用的过程,迭代概念包括:迭代协议、可迭代对象和迭代器三个概念。 迭代协议是指有__next__()函数的对象会前进到下一个结果,而到达系列的末尾时,则会引发StopIteration异常。为了支持迭代协议,Python内置了两个函数:iter()和next()函数。iter()从可迭代对象中获得一个迭代器,迭代器含有next()函数。next()函数的作用就是调用对象的__next__()函数,从而递进进到下一项。 在Python中,任何支持迭代协议的对象都是可迭

Python热爱者的博客 967

python重构迭代_python中迭代和解析

1、迭代工具包括:for循环,列表解析,in成员关系测试,及(map内置函数,sorted,zip,enumerate,filter返回可迭代对象)2、文件迭代器里面有一个__next__方法,每次调用时会返回文件中的下一行,当遇到文件末尾时,会引发StopIteration异常,而不是返回空字符串f = open('script1.py)f.__next()__3、手动迭代:iter和nextp...

weixin_34961316的博客 198

Python解析和迭代器学习总结

1.解析 把原序列进行迭代 再根据条件进行筛选 列表解析[ ]

hyc457427412hychyc的博客 255

python字符串迭代_Python 学习 第六篇:迭代和解析

Python中的迭代是指按照元素的顺序逐个调用的过程,迭代概念包括:迭代协议、可迭代对象和迭代器三个概念。迭代协议是指有__next__()函数的对象会前进到下一个结果,而到达系列的末尾时,则会引发StopIteration异常。为了支持迭代协议,Python内置了两个函数:iter()和next()函数。iter()从可迭代对象中获得一个迭代器,迭代器含有next()函数。next()函数的作用...

weixin_39610594的博客 864

Python——迭代器和解析(1)

本文通过文件迭代器引出介绍了迭代协议,并且介绍了手动迭代的方法;另外介绍了其他的内置类型迭代器,比如遍历字典和enumerate工具;介绍了列表解析的基础语法,并且介绍了扩展的列表解析语法,包括嵌套for循环和带有if选择的列表解析,也介绍了类似的集合解析和字典解析;介绍了其他的迭代环境,包括in成员测试,map内置函数以及像sorted和zip调用这样的内置函数;最后介绍了多个迭代器和单个迭代器,比如range和list支持多个迭代器,而map,zip等只支持单个迭代器

Gavin 4949
上一篇: 函数的高级话题
下一篇: 模块:蓝图
thyme_C
博客等级 码龄8年 5粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值