1、迭代器(iteration)

迭代器协议:提供next()方法,该方法要么返回迭代的下一项,要么异常。(只能往后走)

可迭代对象:实现迭代器协议的对象。

**字符串、列表、元祖、字典、集合、文件都不是可迭代对象,但在for循环中使用_iter_方法,可以变成可迭代对象。

**for循环可调用可迭代对象的_next_方法取值,且会捕捉异常

x = 'hello'
## 生成迭代器对象
iter_test = x.__iter__()
print(iter_test) ## <str_iterator object at 0x00419FB0>
## next()去列表的值,取不到以后,会报异常
print(iter_test.__next__()) ## h
print(iter_test.__next__()) ## e ## for
for i in x:
print(i)

  

x = ['aaa','bbb','ccc']
## 生成迭代器对象
iter_test = x.__iter__()
## next()方法就是调用_next_()方法
print(next(iter_test))

  

2、生成器(generator)

一种数据类型,是可迭代对象 

## 三元表达式
name = 'Amy'
res='yes' if name =='Amy' else 'no'
print(res) ## 如果true,返回yes,否则返回no

  

## 列表解析
li = []
for i in range(10):
li.append('嘟嘟%s'%i)
print(li) print(['嘟嘟%s'%i for i in range(10)]) print(['嘟嘟%s'%i for i in range(10) if i > 5 ])

  

(1)、生成器函数

yield返回结果,而不是return

## 生成器函数,可以返回多次
def test():
yield 1
yield 2 t = test()
print(t) ## <generator object test at 0x005D0EB0>
print(t.__next__()) ## 1
print(t.__next__()) ## 2

  

(2)、生成器表达式

把列表解析的[ ]  变成 ()

## 生成器表达式
s = ('嘟嘟%s'%i for i in range(10))
print(s) ## <generator object <genexpr> at 0x00400E70>
print(s.__next__()) ## 嘟嘟0
print(next(s)) ## 嘟嘟1

  

def eggs():
li = []
for i in range(100):
li.append('egg%s' %i)
return li print(eggs())
## 缺点:占空间大;效率低 ## 生成器 改进
def eggs():
for i in range(100):
yield 'egg%s' %i s = eggs()
print(next(s))
print(next(s))

  

生成器优点:

1、延迟计算,一次返回一个结果,不会一次生成所有结果,对于大数据处理非常有用;

— 列表解析:内存占用大,机器容易卡死

— 声称其表达式:几乎不占内存

2、提高代码可读性

## a.txt 内容
## {'name':'北京','population':13}
## {'name':'福建','population':1645}
## {'name':'安徽','population':642}
## {'name':'河南','population':146}
## {'name':'河北','population':435} def get_population():
ret = []
with open('a.txt','r',encoding='utf-8') as f:
for i in f:
yield i p = get_population()
print(eval(next(p))['name'])
print('总人口:',sum(eval(i)['population'] for i in p))

  

3、生产者消费者模型

send() 方法

# yield 3 — 相当于return  函数的返回值
# x = yield — 接收send传过来的值,赋值给yield
def test():
print('开始')
first = yield 1 ## return 1 first=None
print('第一次',first)
yield 2
print('第二次') t = test()
print(next(t)) ## 执行到 first = yield 1
# 开始
# 1
print(t.send(None)) ## 把None传给first,在执行到 yield 2
# 第一次 None
# 2

  

## 生产者消费者模型

import time
def producer():
ret = []
for i in range(10):
time.sleep(0.1)
ret.append('产品%s' %i)
return ret def consumer(res):
for index,product in enumerate(res):
print('第%s个顾客,购买%s' %(index,product)) res = producer()
consumer(res) ### 并发
def consumer(name):
print('我是【%s】,要购买产品' %name)
while True:
product = yield
print ('%s 购买了【%s】' %(name,product)) def producer():
c1 = consumer('Amy')
next(c1)
for i in range(10):
c1.send('产品%s' %i) producer()

  

python—迭代器、生成器的更多相关文章

  1. Python迭代器生成器与生成式

    Python迭代器生成器与生成式 什么是迭代 迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果.每一次对过程的重复称为一次"迭代",而每一次迭代得到的结果会作为下一次迭 ...

  2. Python 迭代器&生成器

    1.内置参数     Built-in Functions     abs() dict() help() min() setattr() all() dir() hex() next() slice ...

  3. python 迭代器 生成器

    迭代器 生成器 一 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  4. Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

  5. python迭代器,生成器,推导式

    可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: ...

  6. 4.python迭代器生成器装饰器

    容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元素存储在内存中 ...

  7. python迭代器生成器

    1.生成器和迭代器.含有yield的特殊函数为生成器.可以被for循环的称之为可以迭代的.而可以通过_next()_调用,并且可以不断返回值的称之为迭代器 2.yield简单的生成器 #迭代器简单的使 ...

  8. Python迭代器生成器,私有变量及列表字典集合推导式(二)

    1 python自省机制 这个是python一大特性,自省就是面向对象的语言所写的程序在运行时,能知道对象的类型,换句话说就是在运行时能获取对象的类型,比如通过 type(),dir(),getatt ...

  9. Python迭代器生成器,模块和包

      1.迭代器和生成器 2.模块和包 1.迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法.    其中__it ...

  10. python迭代器生成器-迭代器和list区别

    迭代 生成 for循环遍历的原理 for循环遍历的原理就是迭代,in后面必须是可迭代对象 为什么要有迭代器 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集 ...

随机推荐

  1. 基于Spring Security OAuth2搭建的Spring Cloud 认证中心

    Github传送门:https://github.com/13babybear/bounter-springcloud 实现功能有: 整合JWT 刷新Token 自定义客户端储存 自定义用户储存 资源 ...

  2. Niagara帮助文档资料整理

    1.任何软件额发布都会有说明文档,有的不会附具体实践的操作步骤,存在不懂得问题一般可以通过查看榜文文档解决问题 一些软件的帮助文档是一PDF格式存储在软件安装的目录下面,如Niagar workben ...

  3. Centos7源码安装mariadb

    mariadb官网:http://mirrors.opencas.cn/mariadb 安装开发工具: yum grouplist yum groupinstall "Development ...

  4. 2018-2019-2 网络对抗技术 20165206 Exp3 免杀原理与实践

    - 2018-2019-2 网络对抗技术 20165206 Exp3 免杀原理与实践 - 实验任务 1 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己 ...

  5. 末学者笔记--NTP服务和DNS服务

    NTP时间服务器 一.概念: 作用:ntp主要是用于对计算机的时间同步管理操作. 时间是对服务器来说是很重要的,一般很多网站都需要读取服务器时间来记录相关信息,如果时间不准,则可能造成很大的影响. 二 ...

  6. 2018-2019-2 20165328《网络对抗技术》Exp0 Kali安装week1

    1.下载Kaili安装资源并解压安装到虚拟机: 2.修改默认字体与共享文件设置: 3.更新软件源与下载中文输入法: 4.安装完成.

  7. mongodb将时间作为条件查询

    db.stock_signal_single.find({"createtime": { "$lt" : ISODate("2019-04-08T00 ...

  8. 快速从一个空虚拟机,空idea打通提交spark

    https://www.cnblogs.com/xxbbtt/p/8143593.html #!/bin/bash # Install Spark on CentOS 7 yum install ja ...

  9. jinja2

    本文转自:https://www.cnblogs.com/dachenzi/p/8242713.html 模板 要了解jinja2,那么需要先理解模板的概念.模板在Python的web开发中广泛使用, ...

  10. Linux内核优化

     相信做运维的同仁,进行运维环境初建时,必须要考虑到操作系统内核参数的优化问题,本人经历数次的运维环境重建后,决定要自行收集一份比较完善的系统内核参数优化说明文件出来,于是就有了下文,本文当前值是官方 ...