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. 如何用hugo 搭建博客

    1,Hugo 简介 搭建个人博客有很多开源的博客框架,我们要介绍的框架叫作Hugo.Hugo 是一个基于Go 语言的框架,可以快速方便的创建自己的博客. Hugo 支持Markdown 语法,我们可以 ...

  2. vscode快捷替换json格式

    i=json from=AUTO to=AUTO smartresult=dict client=fanyideskweb salt=1537359261311 sign=06b7d1398ebdc6 ...

  3. puppet报告系统Dashboard部署及配置详解

    Puppet Dasshboard是由支持Puppet开发的公司Puppetlabs创建的,是Ruby on Rails程序.可以作为一个ENC(外部节点分类器)以及一个报告工具,并且正在逐渐成为一个 ...

  4. VMware的安装与部署Linux系统

            首先我们需要准备好我们将会用到的东西:VMware12.RHEL7.0         网址我就不放了,大家自行百度哟. 一.安装VMware         我们需要安装VMware ...

  5. ubuntu16 安装redis

    ubuntu16 安装redis并开机自启 1.redis-3.2.5.tar.gz解压到/usr/local下 tar -xvf redis-3.2.5.tar.gz 2.进入源码包/usr/loc ...

  6. <学习笔记: Django之初见>

    Django 1. web框架介绍 具体介绍Django之前,必须先介绍WEB框架等概念. web框架: 别人已经设定好的一个web网站模板,你学习它的规则,然后“填空”或“修改”成你自己需要的样子. ...

  7. 首次使用AWS服务器EC2

    AWS有一年的免费套餐,这个便宜我得占. 申请的时候需要填写银行卡,AWS暂不支持储蓄卡,只好绑信用卡了. 创建EC2实例之后,下一个要解决的问题就是远程root访问. 1. 修改安全组设置 2. s ...

  8. uniapp滚动监听元素

    鸽了这么久,一晃2个月过去了.自考+上班没时间记录. 前不久看到移动官网上的时间轴效果,看起来不错,我也来试着做一下. 需要元素滚动到视野内加载动画. 插件地址 https://ext.dcloud. ...

  9. LeetCode--Jewels and Stones && Range Sum of BST (Easy)

    771. Jewels and Stones (Easy)# You're given strings J representing the types of stones that are jewe ...

  10. Coursera课程笔记----C程序设计进阶----Week 3

    函数的递归(Week 3) 什么是递归 引入 函数可以嵌套调用:无论嵌套多少层,原理都一样 函数不能嵌套定义:不能在一个函数里再定义另一个函数,因为所有函数一律平等 问题:一个函数能调用它自己吗? 举 ...