迭代器和生成器
1,迭代器
dict1 = {'name':'zhangsan'}
print(dir(dict1))
迭代:重复同一个动作
list1 = [1,2,3,4,5]
print(dir(list1))
for i in list1:
print(i)
index = 0
while index < len(list1):
print(list[index])
index += 1
从可迭代对象生成了一个迭代器
凡是有__iter__方法,是可迭代对象
可迭代对象包含了迭代器
a = iter(list1)
print(a) # 迭代器对象
print(dir(a))
for迭代原理:
try:
while True:
print(next(a))
except StopIteration:
pass
可迭代对象__iter__
迭代器对象__iter__ next
2,生成器函数
def func1:
yield 1
b = func1()
print(b) # generator生成器
print(next(b)) # 通过next激活yield的运行
def func2():
yield 1
yield 2
yield 3
yield 4
c = func2()
# 显式的迭代协议
print(next(c))
print(next(c))
# 隐式的迭代协议
dor i in c:
print('for')
print(i)
def func3():
print('一')
yield 1
print('二')
yield 2
print('三')
yield 3
d = func3()
print(next(d))
每次next取值,只激活一次yield
生成器函数和普通函数的区别和联系:
相同点:
1,定义格式相同,都是使用def语句
2,二者都可以有return语句,也可以没有
3,函数体格式相同
不同点:
1,生成器函数中主要是用yield返回数据,而函数主要使用return返回数据。二者返回值不同,函数可以根据需要返回任何类型,生成器函数执行返回。
2,函数调用会执行代码,生成器不会,等待next激活代码
斐波那契数列:数列当中每一个值都等于前面两个数相加的值
[1,1,2,3,5,7,13,21…]
def fibo(n):
i,a b = 0,1,1
while i < n:
yield a
a,b = b,a+b
i+=1
d = fibo(10)
for i in d:
print(i)
import time
print('hello')
time.sleep(3)
print('hello2')
import datetime
print(datetime.datetime.now())
from datetime import datetime # 导入部分模块
print(datetime.now())
from datetime import datetime as dt #别名
print(dt.now())
import test
test.a()
print(test.__name__) #文件名
if __name__ == '__main__':
print(__name__)