1可迭代对象与迭代器
- 什么是迭代器
迭代就是更新换代
1.1. 迭代器指的是迭代取值的工具
1.2. 迭代是一重复的过程,每一次重复都是基于上一次的结果而来
比如:爹生了儿子,儿子生了孙子
1.第一次开发的项目,互联网公司
前面实现基本功能,保证用户量
后面可以慢慢改,提升品质
2.老师第一次上课,紧张,技术难点,第一次不可能
讲的完美,但是慢慢提升,也是一个迭代的过程
3.同学们有一个知识点没懂,比如装饰器
完美没必要放弃,掌握@+装饰器名字就ok
学习也是一个迭代的过程,它是基于上次学习的结果的
一次理解了60%,下次看看变成80%,运用了100%。
4.第一次恋爱,也不可能完美,也是慢慢提升的过程 - 为何要用迭代器
器是工具
迭代器提供了一种通用的且不依赖于索引的迭代取值方式的功能 - 如何用迭代器
1.2. 迭代是一重复的过程,每一次重复都是基于上一次的结果而来
l = ['a','b','c']
#0 1 2
i = 0
while i < len(l):
print(l[i])
i += 1
需要迭代取值的数据有:
字符串、列表、元组、字典、集合、文件等等
可迭代对象iterable
但凡内置有".iter()"方法的对象都称之为克迭代对象
a=[1,2,3]
iter_a = a.__iter__() #生成迭代器
iter_a .__next__() # next不依赖索引取值的方法
可迭代对象与迭代器
可迭代对象
只有__iter__方法,没有__next__方法
迭代器
1. 既内置有__next__方法的对象,执行迭代器__next__方法可以不依赖索引取值
2. 又内置有__iter__方法的对象,执行迭代器__iter__方法得到的仍然是迭代器本身
可跌单对象生成迭代器
dic={'x':1,'y':2,'z':3}
#底层的
iter_dic=dic.__iter__()
next_dic =iter_dic.__next__()
#内置的方法
iter_dic1 = iter(dic)
next_dic1 = next(iter_dic1)
迭代器总结
优点:
- 提供一种通用的且不依赖于索引的迭代取值方式
- 同一时刻在内存中只存在一个值,更节省内存
缺点:
- 取值不如按照索引的方式灵活,(不能取指定的某一个值,而且只能往后取)
- 无法预测迭代器的长度
2生成器
大前提:生成器就是一种自定义的迭代器,本质就是迭代器
但凡函数内包含yield关键字,调用函数不会执行函数体代码
会得到一个返回值,该返回值就是生成器对象
def func():
print('======1')
yield 1 # 每次__next__() 走到暂停
print('======2')
yield 2 # 每次__next__() 走到暂停
g=func()
print(g.__next__())
print(g.__next__())
总结yield:只能在函数内使用
- yield提供了一种自定义迭代器的解决方案
- yield可以保存函数的暂停的状态
- yield对比return
- 相同点:都可以返回值,值的类型与个数都没有限制
- 不同点:yield可以返回多次值(暂停),而return只能返回一次值函数就结束了(结束)
定义一个生成器,这个生成器可以生成10位斐波拉契数列,得到斐波拉契数列
(斐波那契数列:数列中每一个数的值都等于前两个数相加的值 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55…])
def run(n):
i , a, b = 0,1,1
while i < n:
yield a# # a 第一是a 1 b 1 第二次 a 1 b 2 第三次 a 2 b 3 第四次 a 3 b 5 第五次 a 5 b 8
a , b = b ,a+b
i+=1
my_run=run(10)
print(my_run)
print(list(my_run))
print('自定义迭代器(生成器)的for循环')# 1 开始 4开始 老母鸡
for i in my_run:
print(i)
print('自定义迭代器(生成器)的for循环')# 1 开始 4开始 老母鸡
for i in my_run:
print(i)
3生成器计算阶层
用生成器来计算1!+2!+3!+4!+…10!的和
阶层
1! = 1
2! = 2X1
3! = 3X2X1
4! = 4X3X2X1
计数变量i
阶层j
def func(n): # n 的阶层
i = 1# 计数的变量 第一次 i 1
j = 1
while i <= n:
yield j# 第一次 j 1
i += 1# 计数自增1 第二次 i 2 第三次 i 3 第四次 i 4 第5 次 i 5
j = j * i# 第二次 j 2 第三次 j 1*2 * 3 = 6 第四次 j 1 *2 * 3 * 4 = 24 第5 次 1 *2 * 3 * 4 * 5
a=func(10)