8.迭代器与生成器

1可迭代对象与迭代器

  1. 什么是迭代器
    迭代就是更新换代
    1.1. 迭代器指的是迭代取值的工具
    1.2. 迭代是一重复的过程,每一次重复都是基于上一次的结果而来
    比如:爹生了儿子,儿子生了孙子
    1.第一次开发的项目,互联网公司
    前面实现基本功能,保证用户量
    后面可以慢慢改,提升品质
    2.老师第一次上课,紧张,技术难点,第一次不可能
    讲的完美,但是慢慢提升,也是一个迭代的过程
    3.同学们有一个知识点没懂,比如装饰器
    完美没必要放弃,掌握@+装饰器名字就ok
    学习也是一个迭代的过程,它是基于上次学习的结果的
    一次理解了60%,下次看看变成80%,运用了100%。
    4.第一次恋爱,也不可能完美,也是慢慢提升的过程
  2. 为何要用迭代器
    器是工具
    迭代器提供了一种通用的且不依赖于索引的迭代取值方式的功能
  3. 如何用迭代器

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)

迭代器总结
优点:

  1. 提供一种通用的且不依赖于索引的迭代取值方式
  2. 同一时刻在内存中只存在一个值,更节省内存

缺点:

  1. 取值不如按照索引的方式灵活,(不能取指定的某一个值,而且只能往后取)
  2. 无法预测迭代器的长度

2生成器

大前提:生成器就是一种自定义的迭代器,本质就是迭代器
但凡函数内包含yield关键字,调用函数不会执行函数体代码
会得到一个返回值,该返回值就是生成器对象

def func():
	print('======1')
	yield 1 # 每次__next__() 走到暂停
	print('======2')
	yield 2 # 每次__next__() 走到暂停
	
g=func()
print(g.__next__())
print(g.__next__())

总结yield:只能在函数内使用

  1. yield提供了一种自定义迭代器的解决方案
  2. yield可以保存函数的暂停的状态
  3. yield对比return
    1. 相同点:都可以返回值,值的类型与个数都没有限制
    2. 不同点: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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值