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原理
  • epollLinux内核为处理大批量文件描述符而作了改进的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 基础四:生成器与迭代器的更多相关文章

  1. python基础编程:生成器、迭代器、time模块、序列化模块、反序列化模块、日志模块

    目录: 生成器 迭代器 模块 time 序列化 反序列化 日志 一.生成器 列表生成式: a = [1,2,3,3,4,5,6,7,8,9,10] a = [i+1 for i in a ] prin ...

  2. Python基础之生成器、迭代器

    一.字符串格式化进阶 Python的字符串格式化有两种方式: 百分号方式.format方式,由于百分号的方式相对来说比较老,在社区里讨论format方式有望取代百分号方式,下面我们分别介绍一下这两种方 ...

  3. Python开发【第一篇】Python基础之生成器和迭代器

    生成器和迭代器 1.生成器 一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator):如果函数中包含yield语法,那这个函数就会变成生成器: def func(): yield 1 ...

  4. (转)python基础学习-----生成器和迭代器

    在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了 ...

  5. python基础---列表生成器、迭代器等

    一.列表生成式 用来创建list的表达式,相当于for循环的简写形式 语法: [表达式 for循环 判断条件] ''' 普通写法 ''' def test(): l= [] for i in rang ...

  6. Day12 Python基础之生成器、迭代器(高级函数)(十)

    https://www.cnblogs.com/yuanchenqi/articles/5769491.html 1. 列表生成式 我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7 ...

  7. 11-Python3从入门到实战—基础之生成器和迭代器

    Python从入门到实战系列--目录 切片 Python提供切片(Slice)操作符用来获取列表.元组等数据中的部分元素:如,读取列表 list[m:n]:表示获取m-n区间的元素 list[m:n: ...

  8. python3.x 基础四:json与pickple

    每次打开一个文件,只dump1次 json.dump(dump的内容,文件句柄) json.load(文件句柄) json可以处理列表/字典/字符串等简单数据类型,但是不能处理复杂的数据类型,如函数的 ...

  9. python3.x 基础四:目录获取及目录规范

    1.获取目录 import os,sys print('程序文件运行相对位置>>',os.path.abspath(__file__)) print('程序文件上级绝对目录>> ...

随机推荐

  1. 基于NFS共享存储实现KVM虚拟机动态迁移

    基于NFS共享存储实现KVM虚拟机动态迁移 一:配置环境 二:安装相关的依赖包 三:实现NFS共享存储 四:KVM机配置相同的步骤 五:安装KVM01安装虚拟机 六:实现迁移  实验初始配置:所有主机 ...

  2. 【shell】Shell变量基础及深入

    1. 什么是变量 变量就是用一个固定的字符串(也可能是字符数字等的组合),替代更多更复杂的内容,这个内容里可能还会包含变量和路径,字符串等其他内容. 变量的定义是存在内存中. x=1 y=2 2. 变 ...

  3. Shoutem旨在成为React Native移动应用领域的WordPress

    近日,Shoutem推出了新的基于React Native的应用构建器,为开发人员提供了移动应用领域的WordPress. \\ Shoutem让开发人员可以使用一个可视化环境快速创建基于React ...

  4. C#读写ini

    using System; using System.IO; using System.Runtime.InteropServices; using System.Text;   namespace ...

  5. 谁需要GUI?快看Linux 终端生存之道

    完全在 Linux 终端中生存并不容易,但这绝对是可行的. 处理常见功能的最佳 Linux shell 应用 你是否曾想像过完完全全在 Linux 终端里生存?没有图形桌面,没有现代的 GUI 软件, ...

  6. 初见Ajax——javascript访问DOM的三种访问方式

    最近好啰嗦 最近在一间小公司实习,写一些小东西.小公司嘛,人们都说在小公司要什么都写的.果真是. 前端,后台,无论是HTML,CSS,JavaScript还是XML,Java,都要自己全包了.还好前台 ...

  7. RF(页面断言)

    一.RF中断言方式 title should be(断言title与预期指定的title内容相等) Open Browser https://www.baidu.com/ gc Title Shoul ...

  8. 24-Java-Spring框架(二)

    Spring框架的了解.SpringIOC的部分内容请阅读23-Java-Spring框架(二) 三.Spring Web MVC(Model View Controller) 1.SpringMVC ...

  9. 前端——Vue CLI 3.x搭建Vue项目

    一.Node安装 windows 1. Node.js (>=8.9, 推荐8.11.0+) Node官网下载 .msi 文件,按步骤下载安装即可. 安装完之后在cmd中输入 node -v,若 ...

  10. 用js写出一个漂亮的单选框选中效果

    一般的input框比较简单,我们可以用JavaScript配合css背景图片定位让我们模拟写出一个点击选中效果 首先需要有个图片素材,当页面加载的时候是背景图片定位到左图,当我们点击图片的时候,背景图 ...