代码改变世界

4-3迭代器和生成器

2017-11-28 23:08  mmwss  阅读(102)  评论(0编辑  收藏  举报
#!/usr/bin/env python
# -*- coding:utf-8 -*-

#列表 有限列表 用不时占用内存
a=[1,2,3]
print(a)
#列表生成式 无限列表 边生成边计算 省内存空间
b=[i*2 for i in range(3)]
print(b)
#c=[ 函数(i) for i in range(20) ]
print('+ + + + + + +')

#列表生成式
# 生成器 只有在调用时才会生成相应的数据
# 只能往前生成,生成下个时,上个就扔。不能退后
# for调用 用的多 c.__next__()调用 用的少,只能调一个
c=(i*2 for i in range(7))
print(c) #值还没有生成 调用才生成
print(c.__next__()) #取第一个
print(c.__next__()) #取第二个
print('+_+')
for i in c: print('调用:',i); #调用就生成

print('+ + +')
# 函数做生成器
# 斐波拉契数列 除第一个和第二个数外,任意数是前两个数之和
# 1,1,2,3,5,8,13,21
def fib(max): #程序
n,a,b=0,0,1 #n循环数 a和b
while n < max: #max循环次数
#print(b) #循环显示
yield b #变成生成器
a,b=b,a + b
n = n + 1
return '程序异常时返回此:H级错误' #循环结束 返回值
g=fib(6)
while True:
try:
x = next(g)
print('g: ', x)
except StopIteration as e:
print('查到此问题: ', e.value)
break
print('* * * * * * *')
#print(f.__next__())

#生成器并行 单线程下的并行效果 协程
import time
def aaa(x):
print('[%s]开始上班了'%x)
while True:
ccc=yield
print('[%s]坑爹逗比,被[%s]送到天上了' %(ccc,x))

# zzz=aaa('阎王')
# zzz.__next__()
# b1='最强王者之'
# zzz.send(b1) #.send()给传值
# zzz.__next__()

def sss():
q1=aaa('黑无常')
q2=aaa('白无常')
q1.__next__()
q2.__next__()
print('本帅拉了一车逗比')
for i in range(3):
time.sleep(1)
print('+++有俩逗比刚下车+++')
q1.send(i)
q2.send(i)

print(sss())
print('- - - - - - - - -')
#迭代器
#直接作用于for循环的对象统称,被迭代的对象

print('#判断是否可迭代#')
from collections import Iterable
print('列表可迭代吗?',isinstance([],Iterable))
print('字符串可迭代吗?',isinstance('abc',Iterable))
print('字典可迭代吗?',isinstance({},Iterable))
print('数字可迭代吗?',isinstance(10,Iterable))
#用于for循环,可被next()函数调用返回下一个=迭代器
#查看调用方法 dir()
a=[7,8,9]
print('没有next,所以不是迭代器',dir(a)) #没有next 不是迭代器
#把列表list 字典dict 字符串str 变成迭代器用 iter()函数
b=iter(a) #a就是迭代器
print('迭代器第一个',b.__next__())
print('迭代器第二个',b.__next__())
print('迭代器第三个',b.__next__())

print('#迭代器表示数据流 是流')
print('#+++迭代器只有在返回下一个数据时才会计算 可以无限大的数据流+++')
print('range(10) 就是迭代器 0到9')
print('- - - - - - - - -')
s=[1,3,5]
a=iter(s) #把列表变成迭代器
while True:
for i in range(len(s)):
try:
x=next(a) #取迭代器的值给x
print('迭代器第%s个值:'%i,x) #显示取到的内容
except StopIteration: #迭代器值取完了 则:
break