Python基础_可迭代的/迭代器/生成器
介绍
可迭代的:内部实现了__iter__方法
迭代器:内部实现了__iter__,__next__方法
生成器:yield,yield from
使用
__iter__() __next__() __length_hint__() # 长度
都可以使用for循环
只有迭代器可以使用next()
l = [1,2,3,4]
l1 = [1,2,3,4].__iter__() for item in l:print(item)
#
#
#
#
for item in l1:print(item)
#
#
#
# l = [1,2,3,4]
l1 = [1,2,3,4].__iter__()
print(next(l1)) #
print(next(l1)) #
print(l1.__next__()) # print(next(l)) # 报错
都可以for循环,只有迭代器可以使用next()
判断迭代器和可迭代的方法
内部实现__iter__、__next__
# 判断内部是不是实现了__iter__和__next__方法
l = [1,2,3,4]
l1 = [1,2,3,4].__iter__() # 使用__iter__方法使其变成迭代器,可实现next()或__next__()方法 print("__iter__" in dir(l)) # True,可迭代的
print("__next__" in dir(l)) # False,非迭代器
print("__iter__" in dir(l1)) # True,可迭代的
print("__next__" in dir(l1)) # True,迭代器
内部实现__iter__、__next__
Iterable和Iterator
from collections import Iterable
from collections import Iterator l = [1,2,3,4]
print(isinstance(l,Iterable)) #isinstance判断类型的 # True
print(isinstance(l,Iterator)) # False
Iterable和Iterator
生成器
常规定义函数,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果。生成器的好处,就是一下子不会在内存中生成太多的数据
yield
def func(): #这是一个简单的函数
a=1
return a
print(func()) def func():
print('aaaaaaaaaaa')
a = 1
yield a # 返回第一个值
print('bbbbbb')
yield 12 # 返回第二个值 ret = func() # 得拿到一个生成器
# print(ret)#返回的是一个地址
print(next(ret))#取第一个值
print(next(ret))# 取第二个值
print(next(ret))# 取第三个值,会报错,因为没有yield第三个值
简单的生成器,yield
必须先用next再用send
def average():
total=0 #总数
day=0 #天数
average=0 #平均数
while True:
day_num = yield average #average=0,通过外部的send,把数据传给day_num,同时把average出去作为返回值。
total += day_num
day += 1
average = total/day
avg=average() #直接返回生成器
next(avg)#激活生成器,avg.send(),什么都不传的时候send和next的效果一样
print(avg.send(10))
print(avg.send(20))#send 1.传值 2.next
print(avg.send(30))
计算移动平均值
import time def tail(filename):
f = open(filename)
f.seek(0, 2) #从文件末尾算起
while True:
line = f.readline() # 读取文件中新的文本行
if not line:
time.sleep(0.1)
continue
yield line tail_g = tail('tmp')
for line in tail_g:
print(line)
生成器监听文件例子
由于需实现send的生成器需要先next一下进行初始化(如上面的例子),通过装饰器完成此步骤
让装饰器去激活
def wrapper(func):
def inner(*args,**kwargs):
ret = func(*args,**kwargs)
next(ret)
return ret
return inner @wrapper
def average():
total=0 #总数
day=0 #天数
average=0 #平均数
while True:
day_num = yield average #average=0
total += day_num
day += 1
average = total/day ret=average() #直接返回生成器
print(ret.send(10))
print(ret.send(20))#send 1.传一个值过去 2.让当前yield继续执行
print(ret.send(30))
带装饰器的计算移动平均值
yield from
def func():
# for i in 'AB':
# yield i
yield from 'AB' yield from 'AB'就相当于上面的for循环,吧循环简化了
yield from [1,2,3] g=func()
print(list(g))
# print(next(g))
# print(next(g))
yield from,相当于for 。。。yield
列表推导式和生成器表达式
# ======一层循环======
l = [i*i for i in range(1,10)]
print(l)
# 上面的列表推倒式就相当于下面的
l = []
for i in range(1,10):
l.append(i*i)
print(l)
l = [] # ======多层循环========
# 1.列表推倒式
l = [i*j for i in range(1,10) for j in range(1,10)]
print(l)
# 2.循环
l = []
for i in range(1,10):
for j in range(1,10):
s = i*j
l.append(s)
print(l)
列表推导式 []
l=[{'name':'v1','age':''},{'name':'v2'}]
name_list=(dic['name'] for dic in l)#吧列表生成器的[]改成()
print(name_list)#取出的是一个生成器,而不是要取得值,所以得加上next
print(next(name_list))
print(next(name_list))
# print(next(name_list))
生成器表达 () 实际上是把列表推导式的[]改为()
参考or转发
http://www.cnblogs.com/haiyan123/p/7275045.html
Python基础_可迭代的/迭代器/生成器的更多相关文章
- 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】
Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...
- 可迭代对象&迭代器&生成器
在python中,可迭代对象&迭代器&生成器的关系如下图: 即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象. 可迭代对象 如上图,这里x是一个列表(可迭代对象),其实正如第 ...
- python基础_格式化输出(%用法和format用法)(转载)
python基础_格式化输出(%用法和format用法) 目录 %用法 format用法 %用法 1.整数的输出 %o -- oct 八进制%d -- dec 十进制%x -- hex 十六进制 &g ...
- python开发函数进阶:可迭代的&迭代器&生成器
一,可迭代的&可迭代对象 1.一个一个的取值就是可迭代的 iterable#str list tuple set dict#可迭代的 ——对应的标志 __iter__ 2.判断一个变量是不 ...
- python 可迭代对象 迭代器 生成器总结
可迭代对象 只要有魔法方法__iter__的就是可迭代对象 list和tuple和dict都是可迭代对象 迭代器 只要有魔法方法__iter__和__next__的就是可迭代对象 生成器 只要含有y ...
- 2015/9/19 Python基础(15):变量作用域及生成器
变量作用域标识符的作用域是定义为其声明的可应用范围,或者即是我们所说的变量可见性.也就是,我们可以在程序的那个部分去访问一个制定的标识符.全局变量与局部变量定义在函数内的变量有局部作用域,在一个模块中 ...
- Python基础_文件的的处理及异常处理
今天主要讲讲文件读写及异常处理. 一.文件操作 1.1 文件的创建及读 打开文件 open 函数 open(file,[option]) file 是要打开的文件 option是可选择的参数文件的打 ...
- python当中的 可迭代对象 迭代器
学习python有一段时间了,在学习过程中遇到很多难理解的东西,做一下总结,希望能对其他朋友有一些帮助. 完全是个人理解,难免有错,欢迎其他大神朋友们批评指正. 1 迭代 什么是迭代呢??我们可以这样 ...
- 第4章 基础知识进阶 第4.1节 Python基础概念之迭代、可迭代对象、迭代器
第四章 基础知识进阶第十七节 迭代.可迭代对象.迭代器 一. 引言 本来计划讲完元组和字典后就讲列表解析和字典解析,但要理解列表解析和字典解析,就需要掌握Python的高级的类型迭代器,因此本节 ...
随机推荐
- java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'nick' at row 1
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'nick' at row 1 mysql报错 ...
- 关于2.4G芯片中 CC2500的相关资料
CC2500芯片,是TI(原Chipcon被TI收购)推出的一款超低功耗.低成本的无线收发模块,其载频范围在2.400GHz-2.483GHz内可调,可用来实现多信道通信.它支持多种调制方式,包括FS ...
- Intellij IDEA的激活(2100年你值得拥有)
下载ide官网地址:https://download.jetbrains.com/idea/ideaIU-2018.2.7.exe 安装下一步下一步:进入安装bin目录 首先下载需要破解的jar包链接 ...
- CentOS中用Nexus搭建maven私服,为Hadoop编译提供本地镜像
系统: CentOS release 6.6 (Final) Nexus:nexus-2.8.1-bundle.tar.gz,下载地址:https://sonatype-download.global ...
- 串口调试助手vc源程序及其详细编写过程
串口调试助手vc源程序及其详细编写过程 目次: 1.建立项目 2.在项目中插入MSComm控件 3.利用ClassWizard定义CMSComm类控制变量 4.在对话框中添加控件 5.添加串口事件 ...
- 使用JQ实现统计剩余字数
JQ实现统计文本框剩余字数 效果图: 代码如下,复制即可使用: <html lang="en"> <head> <meta charset=" ...
- Mac设置信认任意来源应用
升级了Mac 10.13.4 后应用软件各种不适配,最近更新了一个应用版本,在去安全设置里面 信任应用的时候,发现"任何来源"这个选项不见了!不见了!WTF! 接下来,我们就打开终 ...
- 尝试用docker上的jenkins
比起dockerfile的编写,我更习惯使用简单的docker-compose.yml.但是官方的docker-compose.yml并不是独立的.于是经过一番研究,暂时打造了自己的文件: docke ...
- Kotlin基础篇(一)
写在前面: 因为工作需要,目前转安卓开发,用的IDE是AS3.2版本,语言的话,用的是Kotlin.由于之前是做.NET的,没接触过这方面的东西,所以完全是小白一枚.所以想着开个博客,以此来记录自己的 ...
- Atom使用教程
1.Atom简介 2.安装 官网下载地址:https://atom.io/ 安装目录默认安装在 扩展包的位置 3.推荐扩展包 我的扩展包都是下载好的,直接放在packages文件夹下的 (1)simp ...