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. (转)如何学好C语言

    原文:http://coolshell.cn/articles/4102.html    作者:陈皓 有人在酷壳的留言版上询问下面的问题 keep_walker : 今天晚上我看到这篇文章. http ...

  2. 通过transmittable-thread-local源码理解线程池线程本地变量传递的原理

    前提 最近一两个月花了很大的功夫做UCloud服务和中间件迁移到阿里云的工作,没什么空闲时间撸文.想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不能 ...

  3. 【Linux常见命令】mv命令

    mv - move (rename) files mv命令用来为文件或目录改名.或将文件或目录移入其它位置. 语法: mv [OPTION]... [-T] SOURCE DEST mv [OPTIO ...

  4. Waiting for another flutter command to release the startup lock...

    2019独角兽企业重金招聘Python工程师标准>>> rm ./flutter/bin/cache/lockfile info from 转载于:https://my.oschin ...

  5. NodeJs mysql 开启事务

    如题:node后台使用mysql数据库,并使用事务来管理数据库操作. 这里主要讲一个事务的封装并写了一个INSERT 插入操作. code: 基础code: db.config.js const my ...

  6. Jaba_Web--JDBC 删除记录操作模板

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  7. 2019 ICPC 银川网络赛 H. Fight Against Monsters

    It is my great honour to introduce myself to you here. My name is Aloysius Benjy Cobweb Dartagnan Eg ...

  8. java权限设计思考

    1.粗粒度权限设计与细粒度权限设计             粗粒度(Coarse-graind)        表示类别级,即仅考虑对象的类别(the   type   of   object),不考 ...

  9. 就没有我遇不到的报错!java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/filter/Filter

    本来准备用HBase的Bulkload将HDFS的HFile文件导入到HBase的myuser2表中,用的是yarn jar的命令 yarn jar /export/servers/hbase-1.2 ...

  10. Openwrt:mtd/mtd_write烧写固件

    文章目录 1 查看当前系统分区信息 2 备份固件firmware 3 恢复固件firmware 4 备份恢复Openwrt路由器配置 5 恢复Openwrt路由器默认设置 6 刷新路由器固件 比较简单 ...