Python之路-迭代器 生成器 推导式
迭代器
可迭代对象
print(list.__iter__([1,2,3]))
print(dict.__iter__({1:2,3:4}))
print(tuple.__iter__((1,2,3,4)))
print(range.__iter__(range(10)))
运行结果
<list_iterator object at 0x0000023C28DE8710>
<dict_keyiterator object at 0x0000023C28DC6868>
<tuple_iterator object at 0x0000023C28DE8710>
<range_iterator object at 0x00000109ABB3BF30>
迭代器
lst = [1,2,3,4] l1 = lst.__iter__() #转换成迭代器 print(l1.__next__()) #执行迭代器 print(l1.__next__()) print(l1.__next__()) print(l1.__next__()) 运行结果: 1 2 3 4
lst = [1,2,3,4]
count = 0
l = lst.__iter__()
while count < len(lst):
print(l.__next__())
count += 1
运行结果: #这就是for循环的运行结果
1
2
3
4
lst = [1,2,3,4]
l1 = lst.__iter__() #转换成迭代器
print(l1.__next__()) #执行迭代器
print(l1.__next__())
print(l1.__next__())
print(l1.__next__())
print(l1.__next__())
print(l1.__next__())
lst共有4个元素,当我在执行的时候多加了几个,它就会报错,那既然for循环也是这样的机制为啥它不报错呢?,这里用到一个知识点,叫捕捉错误
while True:
try:
lst = [1,2,3,4]
l1 = lst.__iter__() #转换成迭代器
print(l1.__next__()) #执行迭代器
print(l1.__next__())
print(l1.__next__())
print(l1.__next__())
print(l1.__next__())
print(l1.__next__())
except StopIteration: #如果知道是什么类型的错误,可以添加
break
from collections import Iterable,Iterator
lst = [1,2,3,4]
print(isinstance(lst,Iterable))
print(isinstance(lst,Iterator))
print(isinstance(lst.__iter__(),Iterable))
print(isinstance(lst.__iter__(),Iterator))
print(isinstance({1:2,3:4,5:6},Iterable))
print(isinstance({1:2,3:4,5:6},Iterator))
返回结果:
True
False
True
True
True
False
生成器
(结果 for 变量量 in 可迭代对象 if 条件筛选)
生成器的执行顺序
def func(): #第1步定义名称
print(1) #第5步 执行生成器
yield 4 #第6步 返回执行结果并打印出来,执行到这里停止
print(2)#第8步 执行生成器
yield 5 #第9步 返回结果并打印出来
g = func() #第2步,执行,当方向代码块中有yield时,识别为生成器,
执行第3步 g = func()赋给变量g
print(g.__next__())#第4步第一次调用生成器
print(g.__next__())#第7步第二次调用生成器
运行结果:
1
4
2
5
def gen():
li = []
for i in range(10):
yield i
g = gen()
print(g.__next__())#这样是不是很麻烦
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
def gen():
li = []
for i in range(10):
yield i
g = gen()
for i in range(10):
print(g.__next__())#利用for 循环,很方便的执行
send()
def func():
print(44)
l = yield 5
print(55)
print(l)
yield 3
g = func()
print(g.__next__())
print(g.send('你好啊'))
#相对于 __next__ + 赋值(既能执行下一步操作,又能把值带进去
打印结果:
1
4
2
5
44
5
55
你好啊
3
def gen(x):
res = 0
for i in range(x):
res = yield res ** 2
g = gen(5)
g.send(None)
print(g.send(1))
print(g.send(2))
print(g.send(3))
print(g.send(4))
生成器总结
推导式
列表推导式
li = []
for i in range(10):
li.append(i)
print(li)
li = [i for i in range(10)] #列表推导式
print(li)
打印结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
列表筛选
li = [i for i in range(10)if i > 3] print(li) li = [i for i in range(10)if i % 2 == 0] print(li)
集合推导式
dic = {1:2,3:4}
se = {i for i in dic.items()}
print(se)
输出结果:
{(1, 2), (3, 4)}
推导过程
dic = {1:2,3:4}
se = set()
for i in dic.items():
se.add(i)
print(se)
打印结果:
{(1, 2), (3, 4)}
字典推导式
lst = [1,3]
lst1 = [2,4]
dic = {lst[i]:lst1[i] for i in range(2)}
print(dic)
输出结果:
{1: 2, 3: 4}
推导过程
lst = [1,3]
lst1 = [2,4]
dic = {}
for i in range(2):
dic[lst[i]] = lst1[i]
print(dic)
输出结果:
{1: 2, 3: 4}
生成器推导式
l = (i for i in range(100))
for i in range(10):
print(l.__next__())
推导过程
def func():
for i in range(10):
yield i
l = func()
for i in range(10):
print(l.__next__())
Python之路-迭代器 生成器 推导式的更多相关文章
- python之路---12 生成器 推导式
三十.函数进阶 1.生成器 函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器 一个一个的创建对象 节省内存 ①创建生成器 最后以yield结束 ...
- 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ
一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...
- python迭代器,生成器,推导式
可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: ...
- 12.Python略有小成(生成器,推导式,内置函数,闭包)
Python(生成器,推导式,内置函数,闭包) 一.生成器初始 生成器的本质就是迭代器,python社区中认为生成器与迭代器是一种 生成器与迭代器的唯一区别,生成器是我们自己用python代码构建成的 ...
- Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数
Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: 就是迭代器 生成器产生的方式: 1.生成器函数
- Python——生成器&推导式
生成器 生成器的本质就是迭代器,那么还为什么有生成器呢,两者唯一的不同就是迭代器都是Python给你提供能够的已经写好的工具或者通过数据转化得来的.而生成器是需要我们自己用Python代码构建的工具. ...
- Python函数04/生成器/推导式/内置函数
Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...
- Python之路迭代器协议、for循环机制、三元运算、列表解析式、生成器
Python之路迭代器协议.for循环机制.三元运算.列表解析式.生成器 一.迭代器协议 a迭代的含义 迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的 ...
- python 列表推导式,生成器推导式,集合推导式,字典推导式简介
1.列表推导式multiples = [i for i in range(30) if i % 2 is 0]names = [[],[]]multiples = [name for lst in n ...
随机推荐
- Qt 2D绘图之三:绘制文字、路径、图像、复合模式
一.绘制文字 除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::font ...
- bryce1010专题训练——CDQ分治
Bryce1010模板 CDQ分治 1.与普通分治的区别 普通分治中,每一个子问题只解决它本身(可以说是封闭的) 分治中,对于划分出来的两个子问题,前一个子问题用来解决后一个子问题而不是它本身 2.试 ...
- POJ - 3020 Antenna Placement 二分图最大匹配
http://poj.org/problem?id=3020 首先注意到,答案的最大值是'*'的个数,也就是相当于我每用一次那个技能,我只套一个'*',是等价的. 所以,每结合一对**,则可以减少一次 ...
- C#私有的构造函数的作用
C#私有的构造函数的作用:当类的构造函数是私有的时候,也已防止C1 c1=new C1();实例化类.常见的应用是工具类和单例模式. using System;using System.Collect ...
- 如何查看和分析IIS日志
日志的在IIS中是很重要的,但是很多人却忽略了,在这里说说,日志格式建议使用W3C扩充日志文件格式,这也是IIS 5.0默认的格式,可以指定每天记录客户IP地址.用户名.服务器端口.方法.URI资源. ...
- Django blog项目知识点总结
数据库操作部分 当我们在Django项目中的models.py下写好创建表的代码后.为了创建好这些数据库表,我们再一次请出我的工程管理助手 manage.py.激活虚拟环境,切换到 manage.py ...
- Kettle-Spoon入门示例
Spoon 是Kettle的设计调试工具 [Demo文档下载] https://files.cnblogs.com/files/shexunyu/Kettle-Spoon-Demo%E5%B8%AE% ...
- 导入动态Web项目到Eclipse中遇到的问题
问题一:创建动态网页项目时,项目报错而无文件报错 当时解决方法:直接右击项目->properties->project facets将jdk改为1.8版本即可 如图: 问题二:Tomcat ...
- python搭建ftp服务器
1 # coding: utf-8 import os from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handler ...
- CF1059B Forgery
思路: 若某个位置是‘.’,说明不能在周围的8个位置下笔.在所有可以下笔的位置填充一次,看能否“包含”需要的图案即可. 实现: #include <iostream> using name ...