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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  一.迭代器:                               迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果
  迭代器:迭代取值的工具
  迭代器给你提供了一种不依赖于索引取值的方式
  基本数据类型中可迭代对象的有:
 
      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__())
复制代码

五、内置函数

 


posted @   凯帅  阅读(364)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示