python学习10—迭代器、三元表达式与生成器
python学习10—迭代器、三元表达式与生成器
1. 迭代器协议
定义:对象必须提供一个next方法,执行该方法或者返回迭代中的下一项,或者返回一个StopIteration异常,以终止迭代(只能往后走不能往前退)
2. 可迭代对象
实现了迭代器协议的对象,对象内部定义一个__iter__()方法
3. for循环实现机制
字符串、列表,元组,字典,集合,文件等都不具有next方法,所以他们都不是可迭代对象(iterable object),但是为什么for循环可以进行呢?
原因:for循环首先调用了他们的内置方法__iter()__方法将其转换为可迭代对象,然后再调用这个转换后的可迭代对象的__next()__方法,进行迭代。
- l = [1,2,3]
- # iterable object
- iter_l = l.__iter__()
- print(iter_l.__next__())
字符串、列表、元组为有序序列,也可以通过索引取值,但是字典、集合、文件等非序列类型,不可以通过索引取值,所以出现了for循环,一个基于迭代器协议的统一的遍历方式。
4. 使用while循环实现for循环机制
- l = [1,2,3]
detail_l=l.__iter__()- while True:
- try:
- print(detail_l.__next__())
- except StopIteration:
- print('end of iteration')
- break
5. next()函数
python内置函数next()调用对象的__next()__方法,实现机制与__next()__相同。
- l = [1,2,3,5,6]
- l_iter = l.__iter__()
- print(l_iter.__next__()) #两行print()代码效果相同
- print(next(l_iter))
6. 三元表达式
如下代码,如果name == 'b'则返回a,如果name不等于'b'则返回c。
- name = 'b'
- result = 'a' if name == 'b' else 'c'
相当于c++中的条件运算符(三目运算符)“?:”,都是对一个条件进行判断,满足条件与否分别返回一个值。
- #include<iostream>
- using namespace std;
- int main()
- {
- int a = ;
- int b = ;
- int c = a>b ? a : b;
- return ;
- }
7. 列表解析
利用三元表达式可以进行列表解析。
- egg = ['egg %s' %i for i in range(10) if i > 2]
返回:
- >>> ['egg 3', 'egg 4', 'egg 5', 'egg 6', 'egg 7', 'egg 8', 'egg 9']
8. 生成器
生成器作为一种数据类型,自动实现了迭代器协议,即可以直接调用生成器的__next__()方法,生成器就是可迭代对象。
8.1 生成器函数
生成器函数使用yield代替return,且可返回多个值,每次调用返回一个值。
- def f():
- yield 1
- yield 2
- yield 3
- yield 4
- yield 5
- iter_f = f()
- print(iter_f.__next__())
- print(iter_f.__next__())
- print(iter_f.__next__())
8.2 生成器表达式
将列表解析的[]替换为()即可获得生成器表达式。
- egger = ('egg %s' %i for i in range(10) if i > 2)
- print(egger)
- print(egger.__next__())
- print(egger.__next__())
- print(egger.__next__())
很多python内置函数如sum(),map(),reduce(),filter()等都是遵循迭代器协议的,故可利用生成器进行一些高级的操作。
- sum(x**2 for x in range(10))
注意:生成器只能遍历一次,遍历之后,生成器被释放。
python学习10—迭代器、三元表达式与生成器的更多相关文章
- python之旅:三元表达式、列表推导式、生成器表达式、函数递归、匿名函数、内置函数
三元表达式 #以下是比较大小,并返回值 def max2(x,y): if x > y: return x else: return y res=max2(10,11) print(res) # ...
- Python(迭代、三元表达式、列表生成、生成器、迭代器)
迭代 什么是迭代 1 重复 2 下次重复一定是基于上一次的结果而来 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). ...
- python学习-38迭代器和生成器
迭代器和生成器 ---- 迭代器协议和for循环工作机制 1.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个Stoplteration异常,以终止迭代(只能往 ...
- Python学习 :迭代器&生成器
列表生成式 列表生成式的操作顺序: 1.先依次来读取元素 for x 2.对元素进行操作 x*x 3.赋予变量 Eg.列表生成式方式一 a = [x*x for x in range(10)] pri ...
- python学习日记(迭代器、生成器)-乱七八糟
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...
- Python学习之迭代器和生成器
那么首先什么是迭代器和生成器呢? 迭代器即迭代的工具,那么什么又是迭代呢?所谓迭代:迭代是一个重复的过程,每次重读即一次迭代,并且每次迭代的结果都是下一次迭代的初始值.例: l=[1,2,3] cou ...
- python:列表生成式和三元表达式、匿名函数
一.列表生成式 1.列表生成式就是python内置的一种用来生成list的生成式. 比如下面这个例子: l=[] for i in range(10) list.append(i) 生成一个列表要用循 ...
- day19-1 迭代器,三元表达式,列表推导式,字典生成式,
目录 迭代器 可迭代对象 迭代器对象 总结 三元表达式(三目表达式) 列表推导式 字典生成式 迭代器 可迭代对象 拥有iter方法的对象就是可迭代对象 # 以下都是可迭代的对象 st = '123'. ...
- python学习道路(day5note)(列表生成式,生成器,装饰器,常用模块)
生成列表的方式 data = [1,2,3] 需求 每个数字加上1 # data = ( x*2 for x in range(5)) print(data) 列表生成式 后面的I赋予加1操 ...
随机推荐
- 推荐Windows下SVN服务器端和客户端工具软件
相信很多人使用过Windows下的SVN客户端软件TortoiseSVN或者也有过Linux下.MAC下的SVN命令行使用经验,另外MAC下还有以一款就做Vesions的SVN客户端软件,不过个人感觉 ...
- 转 python3 读取 ini配置文件
在代码中经常会通过ini文件来配置一些常修改的配置.下面通过一个实例来看下如何写入.读取ini配置文件. 需要的配置文件是: 1 [path] 2 back_dir = /Users/abc/Pych ...
- Python 常见报错类型
一.TypeError:类型错误,对象用来表示值的类型非预期类型时发生的错误 错误例子: age=18 print(‘我的年龄是’+age) 报错信息:TypeError: can only conc ...
- 33-python基础-python3-列表插入元素-insert()方法-append()方法-extend()方法
1-insert()方法 insert()方法可以在列表任意下标处插入一个值. insert()方法的第一个参数是新值的下标,第二个参数是要插入的新值. 2-append()方法 调用 append( ...
- CF1215D
CF1215D 两个整数的和是偶数,他们的差也是偶数 博弈好难啊qaq 我好zz啊qaq 如果M放最后一个M胜 现在和比较大的一边如果空位还多的话M胜 M可以通过在大的那边放9来消掉那边所有的空 由于 ...
- CentOS7 部署单节点 FastDFS
准备 环境 系统:CentOS7.5 软件即依赖 libfatscommon FastDFS分离出的一些公用函数包 FastDFS fastdfs-nginx-module FastDFS和nginx ...
- Python之字典中的键映射多个值
字典的键值是多个,那么就可以用列表,集合等来存储这些 键值 举例 print({"key":list()}) # {'key': []} print({"key" ...
- ARM 汇编与C之间 的调用
一. 汇编调用 C 1. 初始化栈 2. 初始化BSS段 (BSS 段是C语言存放未初始化的全局变量,或者初始化为0 的全局变量) 3 .使用 r0 ,r1, r2, r3 给函数传参,如果多于 4 ...
- 关于js中Ajax的同步、异步使用
下面一个简单的例子,说明前后端交互中,Ajax同步和异步的使用 1.设置简单的一个div,包含触发事件 CompanyType() <div> <input type="h ...
- 2019华工校赛 B - 修仙时在做什么?有没有空?可以来炼丹吗?
题目链接:https://ac.nowcoder.com/acm/contest/625/B 解法:这题其实就是求2^18个点内最近的两个点的距离.我们可以容易想到朴素解法:把每个点作为源点跑最短路取 ...