十二、迭代器,生成器,for循环原理

    一.迭代器:                            
   迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果
    迭代器:迭代取值的工具
    迭代器给你提供了一种不依赖于索引取值的方式
    基本数据类型中可迭代对象的有:

        str list tuple dict set
        文件对象(执行内置的__iter__之后还是本身 没有任何变化):文件对象本身就是迭代器对象

  s = 'hello'
  l = [1,2,34,]
  t = (1,2,34)
  s1 = {1,2,3,4}
  d = {'name':'jason'}
  f1 = open('xxx.txt','w',encoding='utf-8')  # 文件类型不需要
  res1 =iter(s) # 变成迭代器对象
  res2 =iter(t) # 变成迭代器对象
  迭代器取值:
   print(res.__next__())  # 取值
   print(res.__next__())
   print(res.__next__())

    1.只能往后依次取 不能后退
   2.
    ps:迭代器一定是可迭代对象
    而可迭代对象不一定是迭代器对象

二、for循环的基本原理                          

 

   for循环内部本质:1.将in后面的对象调用__iter__转换成迭代对象

    2.调用__next__迭代取值

    3.内部有异常捕获Stopteration,当__next__报这个错,自动结束循环

 如:d = {"name":"jasoon","password":"123","hobby":"read"}

   for i in d :

    print(i)

for 循环后面的in跟一个可迭代对象,转换成迭代器对象,然后调用__next__取值,再捕获异常
三、生成器                              
# 1.生成器的定义:用户自定义的迭代器,本质就是迭代器。
# 2.函数内部有一个yield关键字,加括号执行函数并不会触发函数体代码的运行
# 3.yield可以返回一个和多个值,多个已元组方式返回
# 4.生成器初始化中,g=func(),函数变成迭代器,已一个yield为节点,依次迭代,执行第二次迭代器,运行第一个yield下面代码,到第二个yield结束
    # def func():
#     print('first')
#     yield  666 
#     print('second')
#     yield  777
#     print('third')
#     yield  888
#     print('forth')
#     yield
#     yield

# print(g)
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# 自定义一个range
def my_range(start,end,step=1):
    while start < end:
        yield start
        start += step


for j in my_range(1,100,2):
    print(j)

四、生成器的表达式                      

# res = (i for i in range(1,100000000) if i != 4)  # 生成器表达式
# print(list(res))
#
# """
# 生成器不会主动执行任何一行代码
# 必须通过__next__触发代码的运行
# """
# print(res.__next__())
# print(res.__next__())
# print(res.__next__())
# print(res.__next__())

五、内置函数


原文地址:https://www.cnblogs.com/wukai66/p/11190225.html