码迷,mamicode.com
首页 > 编程语言 > 详细

Python之路(六):迭代器,装饰器,生成器

时间:2018-11-16 12:18:49      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:保留   body   暂停   访问   bottom   tps   12px   range   www   

python基础之迭代器和生成器

 

迭代器

  迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stoplteration异常,以终止迭代(只能往后走不能往前退)

  实现了迭代器协议的对象(对象内部定义了一个__iter__()方法)

  python中的内部工具(如for循环,sum,min,max函数等)基于迭代器协议访问对象。

技术分享图片
技术分享图片
 1 #基于迭代器协议
 2 li = [1,2,3]
 3 diedai_l = li.__iter__()
 4 print(diedai_l.__next__())
 5 print(diedai_l.__next__())
 6 print(diedai_l.__next__())
 7 # print(diedai_l.__next__())  # 超出边界报错
 8 
 9 #下标
10 print(li[0])
11 print(li[1])
12 print(li[2])
13 # print(li[3]) # 超出边境报错
14 
15 # 用while循环模拟for循环机制
16 diedai_l = li.__iter__()
17 while True:
18     try:
19         print(diedai_l.__next__())
20     except StopIteration:
21         print("迭代完毕,循环终止")
22         break
23 
24 # for循环访问方式
25 # for循环本质就是遵循迭代器协议的访问方式,先调用diedai_l=li.__iter__方法
26 # 或者直接diedai_l=iter(l),然后依次执行diedai_l.__next__(),直到捕捉到
27 # StopItearation终止循环
28 # for循环所有的对象的本质都是一样的原理
技术分享图片

生成器

  可以理解为一种数据类型,自动实现迭代器协议

  在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行next()方法时从当前位置继续运行

  表现形式

    1、生成器函数  带yield的函数(1、返回值 2、保留函数的运行状态)    

      next(t)  t.__next__  t.send(可以给上一层的yield传值)

技术分享图片
# 用生成器函数
# yield 相当于return控制的是函数的返回值
# x=yield的另外一个特性,接收send传过来的值,赋值给x
def test():
    print("开始啦")
    first = yield # return 1   first = None
    print("第一次",first)
    yield 2
    print("第二次")
t = test()
print(test().__next__())
res = t.__next__() # next(t)
print(res)
res = t.send("函数停留在first那个位置,我就是给first赋值的")
print(res)

输出结果
开始啦
None
开始啦
None
第一次 函数停留在first那个位置,我就是给first赋值的
2
技术分享图片

    2、生成器表达式  

print(sum(i for i in range(10000)))       # 表达式一般用for循环 (i for i in range(10000))

# 作用 节省内存,在内部已经实现了__iter__的方法

列表解析(生成了一个列表)

1 print([i for i in range(10)])  # 生成一个列表

三元表达式(没有四元表达式,可以有二元)

1
2
3
4
5
6
7
name = "alex"
print("sb" if name == "alex" else "帅哥")
 
# if name == "alex"为一元 "sb" 为二元 else "帅哥"为三元
 
输出
sb

python基础之迭代器和生成器

 

迭代器

  迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stoplteration异常,以终止迭代(只能往后走不能往前退)

  实现了迭代器协议的对象(对象内部定义了一个__iter__()方法)

  python中的内部工具(如for循环,sum,min,max函数等)基于迭代器协议访问对象。

技术分享图片
技术分享图片
 1 #基于迭代器协议
 2 li = [1,2,3]
 3 diedai_l = li.__iter__()
 4 print(diedai_l.__next__())
 5 print(diedai_l.__next__())
 6 print(diedai_l.__next__())
 7 # print(diedai_l.__next__())  # 超出边界报错
 8 
 9 #下标
10 print(li[0])
11 print(li[1])
12 print(li[2])
13 # print(li[3]) # 超出边境报错
14 
15 # 用while循环模拟for循环机制
16 diedai_l = li.__iter__()
17 while True:
18     try:
19         print(diedai_l.__next__())
20     except StopIteration:
21         print("迭代完毕,循环终止")
22         break
23 
24 # for循环访问方式
25 # for循环本质就是遵循迭代器协议的访问方式,先调用diedai_l=li.__iter__方法
26 # 或者直接diedai_l=iter(l),然后依次执行diedai_l.__next__(),直到捕捉到
27 # StopItearation终止循环
28 # for循环所有的对象的本质都是一样的原理
技术分享图片

生成器

  可以理解为一种数据类型,自动实现迭代器协议

  在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行next()方法时从当前位置继续运行

  表现形式

    1、生成器函数  带yield的函数(1、返回值 2、保留函数的运行状态)    

      next(t)  t.__next__  t.send(可以给上一层的yield传值)

技术分享图片
# 用生成器函数
# yield 相当于return控制的是函数的返回值
# x=yield的另外一个特性,接收send传过来的值,赋值给x
def test():
    print("开始啦")
    first = yield # return 1   first = None
    print("第一次",first)
    yield 2
    print("第二次")
t = test()
print(test().__next__())
res = t.__next__() # next(t)
print(res)
res = t.send("函数停留在first那个位置,我就是给first赋值的")
print(res)

输出结果
开始啦
None
开始啦
None
第一次 函数停留在first那个位置,我就是给first赋值的
2
技术分享图片

    2、生成器表达式  

print(sum(i for i in range(10000)))       # 表达式一般用for循环 (i for i in range(10000))

# 作用 节省内存,在内部已经实现了__iter__的方法

列表解析(生成了一个列表)

1 print([i for i in range(10)])  # 生成一个列表

三元表达式(没有四元表达式,可以有二元)

1
2
3
4
5
6
7
name = "alex"
print("sb" if name == "alex" else "帅哥")
 
# if name == "alex"为一元 "sb" 为二元 else "帅哥"为三元
 
输出
sb

python基础之迭代器和生成器

 

迭代器

  迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stoplteration异常,以终止迭代(只能往后走不能往前退)

  实现了迭代器协议的对象(对象内部定义了一个__iter__()方法)

  python中的内部工具(如for循环,sum,min,max函数等)基于迭代器协议访问对象。

技术分享图片
技术分享图片
 1 #基于迭代器协议
 2 li = [1,2,3]
 3 diedai_l = li.__iter__()
 4 print(diedai_l.__next__())
 5 print(diedai_l.__next__())
 6 print(diedai_l.__next__())
 7 # print(diedai_l.__next__())  # 超出边界报错
 8 
 9 #下标
10 print(li[0])
11 print(li[1])
12 print(li[2])
13 # print(li[3]) # 超出边境报错
14 
15 # 用while循环模拟for循环机制
16 diedai_l = li.__iter__()
17 while True:
18     try:
19         print(diedai_l.__next__())
20     except StopIteration:
21         print("迭代完毕,循环终止")
22         break
23 
24 # for循环访问方式
25 # for循环本质就是遵循迭代器协议的访问方式,先调用diedai_l=li.__iter__方法
26 # 或者直接diedai_l=iter(l),然后依次执行diedai_l.__next__(),直到捕捉到
27 # StopItearation终止循环
28 # for循环所有的对象的本质都是一样的原理
技术分享图片

生成器

  可以理解为一种数据类型,自动实现迭代器协议

  在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行next()方法时从当前位置继续运行

  表现形式

    1、生成器函数  带yield的函数(1、返回值 2、保留函数的运行状态)    

      next(t)  t.__next__  t.send(可以给上一层的yield传值)

技术分享图片
# 用生成器函数
# yield 相当于return控制的是函数的返回值
# x=yield的另外一个特性,接收send传过来的值,赋值给x
def test():
    print("开始啦")
    first = yield # return 1   first = None
    print("第一次",first)
    yield 2
    print("第二次")
t = test()
print(test().__next__())
res = t.__next__() # next(t)
print(res)
res = t.send("函数停留在first那个位置,我就是给first赋值的")
print(res)

输出结果
开始啦
None
开始啦
None
第一次 函数停留在first那个位置,我就是给first赋值的
2
技术分享图片

    2、生成器表达式  

print(sum(i for i in range(10000)))       # 表达式一般用for循环 (i for i in range(10000))

# 作用 节省内存,在内部已经实现了__iter__的方法

列表解析(生成了一个列表)

1 print([i for i in range(10)])  # 生成一个列表

三元表达式(没有四元表达式,可以有二元)

1
2
3
4
5
6
7
name = "alex"
print("sb" if name == "alex" else "帅哥")
 
# if name == "alex"为一元 "sb" 为二元 else "帅哥"为三元
 
输出
sb

Python之路(六):迭代器,装饰器,生成器

标签:保留   body   暂停   访问   bottom   tps   12px   range   www   

原文地址:https://www.cnblogs.com/Miracle-boy/p/9968441.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!