介绍

可迭代的:内部实现了__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基础_可迭代的/迭代器/生成器的更多相关文章

  1. 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】

    Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...

  2. 可迭代对象&迭代器&生成器

    在python中,可迭代对象&迭代器&生成器的关系如下图: 即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象. 可迭代对象 如上图,这里x是一个列表(可迭代对象),其实正如第 ...

  3. python基础_格式化输出(%用法和format用法)(转载)

    python基础_格式化输出(%用法和format用法) 目录 %用法 format用法 %用法 1.整数的输出 %o -- oct 八进制%d -- dec 十进制%x -- hex 十六进制 &g ...

  4. python开发函数进阶:可迭代的&迭代器&生成器

    一,可迭代的&可迭代对象 1.一个一个的取值就是可迭代的   iterable#str list tuple set dict#可迭代的 ——对应的标志 __iter__ 2.判断一个变量是不 ...

  5. python 可迭代对象 迭代器 生成器总结

    可迭代对象 只要有魔法方法__iter__的就是可迭代对象  list和tuple和dict都是可迭代对象 迭代器 只要有魔法方法__iter__和__next__的就是可迭代对象 生成器 只要含有y ...

  6. 2015/9/19 Python基础(15):变量作用域及生成器

    变量作用域标识符的作用域是定义为其声明的可应用范围,或者即是我们所说的变量可见性.也就是,我们可以在程序的那个部分去访问一个制定的标识符.全局变量与局部变量定义在函数内的变量有局部作用域,在一个模块中 ...

  7. Python基础_文件的的处理及异常处理

    今天主要讲讲文件读写及异常处理. 一.文件操作 1.1 文件的创建及读 打开文件 open 函数  open(file,[option]) file 是要打开的文件 option是可选择的参数文件的打 ...

  8. python当中的 可迭代对象 迭代器

    学习python有一段时间了,在学习过程中遇到很多难理解的东西,做一下总结,希望能对其他朋友有一些帮助. 完全是个人理解,难免有错,欢迎其他大神朋友们批评指正. 1 迭代 什么是迭代呢??我们可以这样 ...

  9. 第4章 基础知识进阶 第4.1节 Python基础概念之迭代、可迭代对象、迭代器

    第四章 基础知识进阶第十七节 迭代.可迭代对象.迭代器 一.    引言 本来计划讲完元组和字典后就讲列表解析和字典解析,但要理解列表解析和字典解析,就需要掌握Python的高级的类型迭代器,因此本节 ...

随机推荐

  1. TreeMap实现原理及源码分析之JDK8

    转载 Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例 一.TreeMap 简单介绍 什么是Map? 在数组中我们通过数组下标来对数组内容进行索引的,而在Map中我们通过对象来对 ...

  2. 垂直方向兼容显示的内容多少的情况样式Flex布局

    使用flex弹性布局,无论里面的元素显示几个,都会居中显示,父元素设置成如下样式 display: flex; flex-direction: column; justify-content: cen ...

  3. P2327 [SCOI2005]扫雷

    题目描述 输入输出格式 输入格式: 第一行为N,第二行有N个数,依次为第二列的格子中的数.(1<= N <= 10000) 输出格式: 一个数,即第一列中雷的摆放方案数. 输入输出样例 输 ...

  4. 【vue】如何在 Vue-cli 创建的项目中引入iView

    根据vue项目的搭建教程,一下记录下如何在Vue-cli创建的项目中引入iView. 1)安装iView,在项目下 cnpm install  iview  --save 2 ) 在 webpack ...

  5. Symbol 实现属性私有化的方式

    //一般通过私有变量来保存私有属性 通过原型方法(getSex)来访问该属性 实现该属性只能被访问无法直接改变属性值 const Person = (function(){ let _sex = &q ...

  6. 性能测试loadrunner安装

    把杀毒软件关闭 1. 点击 HP_LoadRunner_12.02_Community_Edition_T7177-15059.exe 完成后,点击下一步 接受协议 点击安装 点击完成 TOOLS - ...

  7. C语言学习记录_2019.02.05

    switch只能判断整数,而分段函数的判别是一个范围,我们无法用整数来表示范围 跟踪语句的方法: (1)debug调试 (2)printf( )语句跟踪 小套路:当循环次数很大时,可以先模拟较小次数的 ...

  8. 达梦数据库DM7小结

    除了很多主流的数据库,我们很熟悉之外,越来越多的国产数据库也涌现出来. 这次就小结一些有关武汉的达梦数据库7这个开发版数据库的有别或者需要注意的地方进行一个简单备注吧. 1.第一件大事就是下载.数据库 ...

  9. 大数据入门第四天——基础部分之轻量级RPC框架的开发

    一.概述 .掌握RPC原理 .掌握nio操作 .掌握netty简单的api .掌握自定义RPC框架 主要内容 1.RPC是什么 RPC(Remote Procedure Call)—远程过程调用,它是 ...

  10. CLR via C#读书笔记一:CLR的执行模型

    CLR(Common Language Runtime)公共语言进行时是一个可由多种编程语言使用的“进行时”. 将源代码编译成托管模块 可用支持CLR的任何语言创建源代码文件,然后用对应的编译器检查语 ...