python3.x 基础四:生成器与迭代器
1.预先存值到内存,调用之前已经占用了内存,不管用与不用,都占用内存
>>> a=[1,2,3,4,5]
>>> type(a)
<class 'list'>
>>> len(a)
5
>>> a = [ i for i in range(1,6)] #列表生成式,这里的i可以是一个函数
>>> type(a)
<class 'list'>
>>> len(a)
5
>>> a
[1, 2, 3, 4, 5] >>> a=[]
>>> for i in range(10):
... a.append(i)
...
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2.generateor 一边循环一边计算的机制,节省空间,只有在调用的时候才会生成对应的数据,可以用next访问
将列表生成式的中括号改成小括号,就变成生成器了
>>> [ i for i in range(1,6)]
[1, 2, 3, 4, 5]
>>> (i for i in range(1,6))
<generator object <genexpr> at 0x7f8747a69678>
>>> a=(i for i in range(1,6))
>>> type(a)
<class 'generator'>
>>> a.__next__()
1
>>> a.__next__()
2
>>> a.__next__()
3
>>> a.__next__()
4
>>> a.__next__()
5
>>> a.__next__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
3.斐波那契
def fib(max):
n,a,b=0,0,1
while n<max:
print(b)
a,b=b,a+b
n=n+1
return 'done'
fib(10)
4.将上面的print(b)改成生成式关键字 yield,就是生成器了
def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,a+b
n=n+1
return 'done'
gen=fib(10)
print(type(gen))
5.每次调用生成器的时候,遇到yield则返回本次值,然后跳出生成器,可执行其他指令,在下一次调用生成器的时候,将从上次结束的地方开始运行,直到yield跳出
def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,a+b
n=n+1
return 'done111'
gen=fib(5)
print(type(gen))
print(next(gen))
print('小明滚进来')
print(next(gen))
print('小明滚出去')
print(next(gen))
print('小明滚进来')
print(next(gen))
print('小明滚出去')
print(next(gen))
输出结果:
<class 'generator'>
1
小明滚进来
1
小明滚出去
2
小明滚进来
3
小明滚出去
5
6.处理异常try:处理内容 except:内容异常处理
def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,a+b
n=n+1
return 'done111'
gen=fib(5)
print(type(gen))
while True:
try:
val=next(gen)
print('fib value is',val)
except StopIteration as e:
print(e.value)
break
<class 'generator'>
fib value is 1
fib value is 1
fib value is 2
fib value is 3
fib value is 5
done111
7.生产者与消费者
- g.__next__遇到yield返回,下一次从yield开始,但是不会赋值
- g.send()遇到yield唤醒迭代器,赋值
- 进程-线程-携程,epoll异步IO原理
- epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了
#/usr/bin/env python
#-*- coding: utf-8 -*-
#Author:jenvid.yang
import time
def consumer(name):
print('%s is ready to have baozi!' %(name))
while True:
baozi = yield
print('baozi %s is coming,baozi was ate by %s' %(baozi,name))
c=consumer('alex')
# c.__next__()
# b1='baozi001'
# c.send(b1)
def producer():
c1=consumer('oldboy')
c2=consumer('alex')
c1.__next__()
c2.__next__()
print('i am going to make baozi!')
for i in ['韭菜馅','猪肉馅','白菜陷','玉米馅','萝卜馅']:
time.sleep(1)
print('finish 2 baozi')
c1.send(i)
c2.send(i)
producer()
8.迭代器
- 列表/元组/字典/集合/字符串/生成器,可以用于for循环的对象统称为可迭代对象:Iterable
- isinstance(),判断一个一个对象是否是Iterable对象
>>> from collections import Iterable
>>> isinstance([],Iterable)
True
>>> isinstance('',Iterable)
True
>>> isinstance({},Iterable)
True
>>> isinstance((),Iterable)
True- 能用next()函数调用并返回下一个值的对象成为迭代器,Iterator
>>> from collections import Iterator
>>> isinstance([],Iterator)
False
>>> isinstance('',Iterator)
False
>>> isinstance((),Iterator)
False
>>> isinstance((i for i in range(2)),Iterator)
True- 生成器是迭代器Iterator,但是Iterable不一定是Iterator,用iter()函数可以将迭代类型转成迭代器
>>> isinstance('',Iterator)
False
>>> isinstance(iter(''),Iterator)
True- 迭代:
- 迭代器不能预先知道循环的长度
- 只能通过next()取下一个
- 最后结果抛出StopIterator错误
- 可for循环取值的对象是可迭代类型Iterable
- 可next()取值的对象是迭代器Iterator
python3.x 基础四:生成器与迭代器的更多相关文章
- python基础编程:生成器、迭代器、time模块、序列化模块、反序列化模块、日志模块
目录: 生成器 迭代器 模块 time 序列化 反序列化 日志 一.生成器 列表生成式: a = [1,2,3,3,4,5,6,7,8,9,10] a = [i+1 for i in a ] prin ...
- Python基础之生成器、迭代器
一.字符串格式化进阶 Python的字符串格式化有两种方式: 百分号方式.format方式,由于百分号的方式相对来说比较老,在社区里讨论format方式有望取代百分号方式,下面我们分别介绍一下这两种方 ...
- Python开发【第一篇】Python基础之生成器和迭代器
生成器和迭代器 1.生成器 一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator):如果函数中包含yield语法,那这个函数就会变成生成器: def func(): yield 1 ...
- (转)python基础学习-----生成器和迭代器
在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了 ...
- python基础---列表生成器、迭代器等
一.列表生成式 用来创建list的表达式,相当于for循环的简写形式 语法: [表达式 for循环 判断条件] ''' 普通写法 ''' def test(): l= [] for i in rang ...
- Day12 Python基础之生成器、迭代器(高级函数)(十)
https://www.cnblogs.com/yuanchenqi/articles/5769491.html 1. 列表生成式 我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7 ...
- 11-Python3从入门到实战—基础之生成器和迭代器
Python从入门到实战系列--目录 切片 Python提供切片(Slice)操作符用来获取列表.元组等数据中的部分元素:如,读取列表 list[m:n]:表示获取m-n区间的元素 list[m:n: ...
- python3.x 基础四:json与pickple
每次打开一个文件,只dump1次 json.dump(dump的内容,文件句柄) json.load(文件句柄) json可以处理列表/字典/字符串等简单数据类型,但是不能处理复杂的数据类型,如函数的 ...
- python3.x 基础四:目录获取及目录规范
1.获取目录 import os,sys print('程序文件运行相对位置>>',os.path.abspath(__file__)) print('程序文件上级绝对目录>> ...
随机推荐
- Spring Boot 静态文件,请求不到,util文件夹
静态文件貌似对util文件夹有特殊处理static/js/test.js 可以请求到static/js/laydate/test.js 可以请求到static/js/util/test.js 请求不到
- 全栈必备Log日志
Log日志,不论对开发者自身,还是对软件系统乃至产品服务都是非常重要的事情.每个开发者都接触过日志,以至于每个人对日志的了解都会有所不同. 什么是日志 日志是什么呢?老码农看来,日志是带有明确时间标记 ...
- SAAS 何以“免费”实现盈利
本文讲的是SAAS 何以"免费"实现盈利,[IT168 资讯]"天下没有免费的午餐",然而众多厂商却恰恰打出了免费这张王牌,且做出了不小的成绩,淘宝就凭借免费淘 ...
- du命令、df命令、磁盘分区
df:汇报文件系统的磁盘使用空间[root@localhost ~]# df文件系统 1K-块 已用 可用 已用% 挂载点/dev/sda3 29140072 1022920 28117152 4% ...
- Bomb Enemy 炸弹人
Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...
- 数学--数论--POJ 1061青蛙的约会 (扩展欧几里得算法)
青蛙的约会 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问 ...
- Entity framework 加载多层相关实体数据
Entity framework有3种加载数据的方式:懒汉式(Lazy loading),饿汉式(Eager loading),显示加载(Explicit loading).3种加载方式有各自的优缺点 ...
- 编写简单的内核模块及内核源码下载,内核模块Makefile编写
CentOS的内核源码默认是没有下载的,需要自己下载,首先安装linux的时候就应该知道linux的版本,我装的是Centos7的 下面查一下内核的版本,使用下面的命令 [scut_lcw@local ...
- 设计模式(Java语言)- 原型模式
原型模式(Prototype Pattern)也有人将原型模式称为克隆模式,是属于创造型设计模式,用于创建重复的对象,提供了一种创建对象的最佳方式.原型模式需要实现Cloneable接口,来实现对象的 ...
- Java——Java中编码问题
在开发过程中经常会遇到一会乱码问题,不是什么大问题,但是也挺烦人的,今天来将我们开发总结的经验记录下来,希望可以给大家一些帮助. 一些概念: 字符:人们使用的记号,抽象意义上的一个符号.比如:‘1’, ...