介绍

可迭代的:内部实现了__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. python中numpy.sum()函数

    讲解清晰,转载自:https://blog.csdn.net/rifengxxc/article/details/75008427 众所周知,sum不传参的时候,是所有元素的总和.这里就不说了. 1 ...

  2. ios学习路线—Objective-C(新特性)

    1.方法顺序无关 Objective-C类由声明文件h和实现文件m组成,所有的public方法都在h文件中声明,private方法可以写在m文件中,但是在早期的编译环境中需要注意方法的顺序,例如下面的 ...

  3. dategate的用法

    菜鸟教程上的说法是这样: delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数. 使用 delegate() 方法的事件处理程序适 ...

  4. a simple game based on RT-Thread

    [作品名称] a simple game based on RT-Thread [背景描述] 学了一段时间的嵌入式操作系统RT-Thread,发现是真的好用.于是想做一个小作品来锻炼巩固自己学习的知识 ...

  5. 将CSV文件导入到hive数据库

    将csv文件导入hive后出现了所有的字段只显示在新建的表的第一个字段中,后面的字段全是null. 出现这种的原因是hive以行分隔数据,需要修改为按逗号'  ,  ‘ 进行分隔读取, 具体操作如下, ...

  6. 2017-2018-1 20155207&20155308《信息安全技术》实验四-木马及远程控制技术

    2017-2018-1 20155207&20155308<信息安全技术>实验四-木马及远程控制技术 实验目的 剖析网页木马的工作原理 理解木马的植入过程 学会编写简单的网页木马脚 ...

  7. JavaEE笔记(八)

    第一个Spring Student(学生) bean package com.my.bean; import java.io.Serializable; public class Student im ...

  8. 深度学习与计算机视觉(11)_基于deep learning的快速图像检索系统

    深度学习与计算机视觉(11)_基于deep learning的快速图像检索系统 作者:寒小阳 时间:2016年3月. 出处:http://blog.csdn.net/han_xiaoyang/arti ...

  9. 【转载】COM 组件设计与应用(十)——IDispatch 接口 for VC.NET

    原文:http://vckbase.com/index.php/wv/1225.html 一.前言 终于写到了第十回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常用 ...

  10. 19-[模块]-json/pickle、shelve

    1.序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes (1)把字典保存到文件 data = { 'roles': [ ...