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('程序文件上级绝对目录>> ...
随机推荐
- 基于NFS共享存储实现KVM虚拟机动态迁移
基于NFS共享存储实现KVM虚拟机动态迁移 一:配置环境 二:安装相关的依赖包 三:实现NFS共享存储 四:KVM机配置相同的步骤 五:安装KVM01安装虚拟机 六:实现迁移 实验初始配置:所有主机 ...
- 【shell】Shell变量基础及深入
1. 什么是变量 变量就是用一个固定的字符串(也可能是字符数字等的组合),替代更多更复杂的内容,这个内容里可能还会包含变量和路径,字符串等其他内容. 变量的定义是存在内存中. x=1 y=2 2. 变 ...
- Shoutem旨在成为React Native移动应用领域的WordPress
近日,Shoutem推出了新的基于React Native的应用构建器,为开发人员提供了移动应用领域的WordPress. \\ Shoutem让开发人员可以使用一个可视化环境快速创建基于React ...
- C#读写ini
using System; using System.IO; using System.Runtime.InteropServices; using System.Text; namespace ...
- 谁需要GUI?快看Linux 终端生存之道
完全在 Linux 终端中生存并不容易,但这绝对是可行的. 处理常见功能的最佳 Linux shell 应用 你是否曾想像过完完全全在 Linux 终端里生存?没有图形桌面,没有现代的 GUI 软件, ...
- 初见Ajax——javascript访问DOM的三种访问方式
最近好啰嗦 最近在一间小公司实习,写一些小东西.小公司嘛,人们都说在小公司要什么都写的.果真是. 前端,后台,无论是HTML,CSS,JavaScript还是XML,Java,都要自己全包了.还好前台 ...
- RF(页面断言)
一.RF中断言方式 title should be(断言title与预期指定的title内容相等) Open Browser https://www.baidu.com/ gc Title Shoul ...
- 24-Java-Spring框架(二)
Spring框架的了解.SpringIOC的部分内容请阅读23-Java-Spring框架(二) 三.Spring Web MVC(Model View Controller) 1.SpringMVC ...
- 前端——Vue CLI 3.x搭建Vue项目
一.Node安装 windows 1. Node.js (>=8.9, 推荐8.11.0+) Node官网下载 .msi 文件,按步骤下载安装即可. 安装完之后在cmd中输入 node -v,若 ...
- 用js写出一个漂亮的单选框选中效果
一般的input框比较简单,我们可以用JavaScript配合css背景图片定位让我们模拟写出一个点击选中效果 首先需要有个图片素材,当页面加载的时候是背景图片定位到左图,当我们点击图片的时候,背景图 ...