python基础(9)-迭代器&生成器函数&生成器进阶&推导式
迭代器
可迭代协议和迭代器协议
可迭代协议
只要含有__iter__方法的对象都是可迭代的
迭代器协议
内部含有__next__和__iter__方法的就是迭代器
关系
1.可以被for循环的都是可迭代的
2.可迭代的内部都有__iter__函数
3.只要是迭代器,一定可迭代
4.可迭代的对象使用__iter__方法就可以得到一个迭代器
5.迭代器中的__next__方法可以一个一个的获取值
例子
判断是否是可迭代类型
可以被for循环的类型都有__iter__()函数
dir()函数可以返回类型里面所有函数名称
print('__iter__' in dir(int)) # result:False print('__iter__' in dir(bool)) # result:False print('__iter__' in dir(list)) # result:True print('__iter__' in dir(dict)) # result:True print('__iter__' in dir(set)) # result:True print('__iter__' in dir(tuple)) # result:True print('__iter__' in dir(enumerate([]))) # result:True print('__iter__' in dir(range(1))) # result:True
判断是否是迭代器
isinstance()函数可以判断一个对象是否是指定类型的实例
import collections print(isinstance([], collections.Iterator)) # result: False print(isinstance([], collections.Iterable)) # result: True print(isinstance([].__iter__(), collections.Iterator)) # result:True
通过__next__()函数取值
num_list = [1, 2, True, 5, 'hello'] print(type(num_list.__iter__())) # result:<class 'list_iterator'> iterator = num_list.__iter__() print(iterator.__next__()) # result:1 print(iterator.__next__()) # result:2 print(iterator.__next__()) # result:True print(iterator.__next__()) # result:5 print(iterator.__next__()) # result:hello print(iterator.__next__()) # 抛异常StopIteration
当迭代器的next()方法取不到值时会抛一个StopIteration异常
迭代器的好处
1.从容器类型对象中一个一个的取值,会把所有的值都取到
2.节省内存空间(迭代器并不会在内存中再占用一大块内存,而是随着循环 每次生成(next())一个)
生成器函数
定义
只要含有yield关键字的函数都是生成器函数
注:yield不能和return共用且需要写在函数内
例子
生成器函数的执行
执行之后会得到一个生成器作为返回值
import collections; def generator(): yield 'a' yield 'b' result = generator() print(type(result)) # <class 'generator'> print(isinstance(result, collections.Iterable)) # True print(isinstance(result, collections.Iterator)) # True print(result.__next__()) # a print(result.__next__()) # b通过第10行可以看出,生成器也是迭代器
监听文件输入
def listen(filename): f = open(filename, encoding='utf-8') while True: line = f.readline() if line.strip(): yield line.strip() listenr = listen('generator_file.txt') for line in listenr: print('your input:', line)

生成器进阶
send()函数使用
生成器中send()函数可以让上一个执行的yied接收一个值
def num_generator():
i = 1
num = yield i
i += num
yield i
generator = num_generator()
移动平均数例子
def avg_num():
sum = 0
count = 0
avg = 0
while True:
num = yield avg
sum += num
count += 1
avg = sum / count
ave_generator = avg_num()
ave_generator.__next__()
print(ave_generator.send(10)) # 10.0
print(ave_generator.send(20)) # 15.0
print(ave_generator.send(30)) # 20.0
print(ave_generator.send(60)) # 30.0
面试题
写出下面代码的输出内容
def add(n, i): return n + i def test(): for i in range(4): yield i g = test() for n in [1, 10]: g = (add(n, i) for i in g) print(list(g))
分析&结果
# 循环可拆成如下代码 n = 1 g = (add(n, i) for i in g) n = 10 # g = (add(n, i) for i in g(指向第3行的g)) # g = (add(n, i) for i in (add(n, i) for i in g(第三行的g指向test()))) g = (add(n, i) for i in (add(n, i) for i in test())) # 真正执行的时候 也就是list(g)的时候 n=10 将n替换为10结果如下: g = (add(10, i) for i in (add(10, i) for i in (0, 1, 2, 3))) g = (add(10, i) for i in (10, 11, 12, 13)) g = (20, 21, 22, 23) print(list(g))
推导式
列表
num_list = [1, 2, 3, 4]
str_list = ['数字{}'.format(i) for i in num_list]
print(str_list) # ['数字1', '数字2', '数字3', '数字4']
字典
反转dic的key和value的顺序
dic = {1: 'a', 2: 'b', 3: 'c'}
reverse_dic = {dic[key]: key for key in dic}
print(reverse_dic) # {'a': 1, 'b': 2, 'c': 3}
集合
输出集合中元组里面大于10的元素
num_set = {(3, 4, 1, 5, 77, 5), (2, 3, 4, 56, 77, 6, 34)};
result_set = {i for lst in num_set for i in lst if i > 10}
print(result_set) # {56, 34, 77}
python基础(9)-迭代器&生成器函数&生成器进阶&推导式的更多相关文章
- (转)python基础之迭代器协议和生成器(一)
一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...
- python基础之 迭代器回顾,生成器,推导式
1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...
- python基础知识15---三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数
阅读目录 一 三元表达式.列表推导式.生成器表达式 二 递归与二分法 三 匿名函数 四 内置函数 五 阶段性练习 一. 三元表达式.列表推导式.生成器表达式 1 三元表达式 name=input('姓 ...
- python基础之迭代器协议和生成器
迭代器和生成器补充:http://www.cnblogs.com/luchuangao/p/6847081.html 一 递归和迭代 略 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个ne ...
- python基础之迭代器协议和生成器(二)
一.什么是迭代器: 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器是一个可以记住遍历的位置的对象. 迭代器的 ...
- python基础之迭代器协议和生成器(一)
一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...
- python 生成器 和生成器函数 以及各种推导式
一.生成器 本质就是迭代器. 我们可以直接执⾏__next__()来执⾏ 以下⽣成器 一个一个的创建对象 创建生成器的方式: 1.生成器函数 2.通过生成器 表达式来获取生成器 3.类型转换(看 ...
- day 12 生成器和生成器函数以及各种推导式
一.生成器 本质就是迭代器. 我们可以直接执⾏__next__()来执⾏ 以下⽣成器 一个一个的创建对象 创建生成器的方式: 1.生成器函数 2.通过生成器 表达式来获取生成器 3.类型转换(看 ...
- python基础知识-8-三元和一行代码(推导式)
python其他知识目录 1.三元运算(三目运算) 三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值格式:[on_true] if [expression] else [on_false]re ...
- Python基础之列表深浅复制和列表推导式
一.列表深浅复制: 浅拷贝内存图如下: 深拷贝内存图如下: 二.列表推导式: 实例: """ 列表推导式 练习:exercise01 """ ...
随机推荐
- oracle 学习笔记(2)创建表空间及用户授权
原文:http://www.cnblogs.com/smartvessel/archive/2009/07/06/1517690.html Oracle安装完后,其中有一个缺省的数据库,除了这个缺省的 ...
- Nginx-设定允许的ip和要拒绝的ip
作用范围和配置的顺序有关系,先配置的优先级高,会覆盖和后一个配置重合的部分, 可以添加多个allow和多个deny: 1)这个配置127.0.0.1可以通过访问. allow 127.0.0.1; d ...
- JS 对象的深拷贝和浅拷贝
转载于原文:https://www.cnblogs.com/dabingqi/p/8502932.html 这篇文章是转载于上面的链接地址,觉得写的非常好,所以收藏了,感谢原创作者的分享. 浅拷贝和深 ...
- 使用 JdbcTemplate 查询数据时报错:列名无效(已解决)
又犯了一个错误. 争取没有下次了. 就算再犯,也要知道去哪找答案. 所以,记录一下,以示警戒. 报错 使用 JdbcTemplate 查询数据时,出现异常: PreparedStatementCall ...
- Android 安全机制
转:http://www.cnblogs.com/GnagWang/archive/2011/03/21/1990507.html 1 Android 安全机制概述 Android 是一个权限分离的系 ...
- chrome调试创建sq设备进行调试
工作中开发基于手机qq的webapp页面时,通常开发会对页面进行限制让用户通过手机qq访问,进行引导,如下图所示. 很多时候我们开发只是在手机展示,而在pc端进行调试,当开发加了这一层限制之后,就会导 ...
- 170823、SQL Update多表联合更新的方法
SQL Update多表联合更新的方法 (1) sqlite 多表更新方法 update t1 set col1=t2.col1 from table1 t1 inner join table2 t2 ...
- Flask web开发之路四
jinjia2模板 模板渲染和参数传递 项目结构如下: 主app文件代码: from flask import Flask,render_template app = Flask(__name__) ...
- ERP项目实施记录06
自上月20以后,因厂里赶货,办公室人员有空也要去车间帮手,ERP的事就没动静了. 2014年1月10日开了个小组会议,认为第三方不是专业做本行业的,开发风险大:因此希望先开发一个报价软件试试. 明天第 ...
- DB2 Version 10.5 补丁下载
DB2 Version 10.5 for Linux, UNIX, and Windows fix pack summary https://www.ibm.com/support/knowledge ...