part2
迭代器
# 1. 什么是迭代器(what)
# 迭代指的是一个重复的过程,每一次重复都是基于上一次的结果而来的
# li=['a','b','c','d','e']
# li=('a','b','c','d','e')
# li='hello'
#
# i=0
# while i < len(li):
# print(li[i])
# i+=1
# 迭代器指的是迭代取值的工具,该工具的特点是可以不依赖于索引取值
# 2. 为何要用迭代器?(why)
# 为了找出一种通用的&可以不依赖于索引的迭代取值方式
#
# 3. 如何用迭代器?(how)
# 可迭代的对象:但凡内置有.__iter__方法的对象都称之为可迭代的对象
# str,list,tuple,dict,set,file
# 迭代器对象:既内置有__iter__方法,又内置有__next__方法
# file
# 关于__iter__方法:
# 调用可迭代对象的__iter__会的到一个迭代器对象
# 调用迭代器对象的__iter__会的到迭代器本身
#
"""
可迭代的对象——————》迭代器对象:
调用可迭代对象内置的.__iter__方法会有一个返回值,该返回值就是对应的迭代器对象
"""
# eg.1
# dic={'x':1,'y':2,'z':3}
# res1=dic.__iter__()
# print(res1)#res1 就是dic调用__iter__方法后的一个返回值,
# res2=res1.__next__()
# print(res2)#res2 就是既有__iter__方法,又有__next__方法的迭代器对象
# eg.2
# dic={'x':1,'y':2,'z':3}
# # dic=['a','b','c']
# iter_dic=dic.__iter__()
#
# iter_dic=open(r'文件名',mode='rt',encoding='utf-8')
#
# while True:
# try:
# print(iter_dic.__next__())
# except StopIteration:###这里是捕捉异常然后结束异常
# break
# for循环就是一个迭代器取值的过程,for循环的原理如下:
# 准确的说for循环应该就是迭代器循环,for循环的原理如下:
# 1.先调用for...in...中in后面的那个值的__iter__方法,并得到一个返回值(迭代器对象)
# 2.执行迭代器.__next__()方法得到的一个返回值,然后赋值给一个变量k,运行循环体代码
# 3.循环往复,知道迭代器取值完毕抛出异常然后捕捉异常自动结束循环。
# 生成器(‘人造迭代器’)
# yield关键字:只能用在函数内
#
# eg.1
# def my_range(start,stop,step=1):
# while start < stop:
# yield start
# start+=step
#
# res=my_range(1,5,2) # 1 3
#
# next(res)
# next(res)##这就是一个“人造的range()”功能
# for item in my_range(1,5,2):
# print(item)
#
#
#
# eg.2
# def func():
# print('this is the first time')
# yield 1
# print('this is the second time')
# yield 2
# print('this is the third time')
# yield 3
# print('this is the fourth time')
# print(func)##得到一个函数的内存地址
# g=func()
# res=g.__next__()
# print(res)##1
# res1=g.__next__()
# print(res1)##2
# 在函数内单反包括yield关键字,再去执行函数,就不会立刻运行代码了
# # 会得到一个返回值,该返回值就是生成器,生成器的本质就是迭代器。
# 总结yield:
# 1.提供一种自定义迭代器的解决方案
# 2.yield可用于返回值
# yield vs return
# 相同点:都可以用于返回值
# 不同点:yield是暂停函数,而return是直接结束函数