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

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

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

时间: 2024-08-04 03:04:59

Python之路(六):迭代器,装饰器,生成器的相关文章

python入门(六)装饰器的理解

装饰器用于拓展原有函数功能的一种函数比如: def helloWorld(fun) def out() print ("======start========") fun() print ("=====end======") return out @helloWorld def back () print ("let's go") back() 运行结果: ======start======== let's go =====end====== b

Python之路:迭代器和yield生成器

一.迭代器 对于Python 列表的 for 循环,他的内部原理:查看下一个元素是否存在,如果存在,则取出,如果不存在,则报异常 StopIteration.(python内部对异常已处理) 使用迭代器一个显而易见的好处就是:每次只从对象中读取一条数据,不会造成内存的过大开销. 比如要逐行读取一个文件的内容,利用readlines()方法,我们可以这么写: for line in open("test.txt").readlines():print line 这样虽然可以工作,但不是最

Python学习之三大名器-装饰器、迭代器、生成器

Python学习之三大名器-装饰器.迭代器.生成器 一.装饰器     装饰,顾名思义就是在原来的基础上进行美化及完善,器这里指函数,所以说装饰器就是装饰函数,也就是在不改变原来函数的代码及调用方式的前提下对原函数进行功能上的完善.其核心原理其实是利用闭包.     格式 @关键字+装饰函数          被装饰函数()      注意:@行必须顶头写而且是在被装饰函数的正上方     按照形式可以分为:无参装饰器和有参装饰器,有参装饰器即给装饰器加上参数     以下示例是一个无参装饰器,

Python学习之路-装饰器&生成器&正则表达式

装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(func):     def inner():         if USER_TEMP["status"] == False:             print("\033[31;1m用户未登录,请先登录\033[0m")             login_atm()

Python 3 学习笔记(六)----装饰器

一.定义 装饰器本质是函数,装饰其他函数,就是为其它函数添加附加功能 二.装饰器原则 1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 三.实现装饰器的必要知识 1.函数即是变量 1 # def foo(): 2 # print("in the foo") 3 # bar() #bar未定义 4 # foo() 5 6 7 # def bar(): 8 # print("int the bar") 9 # def foo(): 10 # prin

python之路4:各种器

装饰器 生成器 迭代器 一.装饰器 装饰器是函数,官方叫语法糖,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或类,使用装饰器可以在函数执行前和执行后添加相应操作. 语法: def wrapper(func): def result(): print('before') func() print('after') return result @wrapper def foo(): print('foo') 实例: #!/usr/bin/env python # -*- coding:utf-

Python基础(八)装饰器

今天我们来介绍一下可以提升python代码逼格的东西——装饰器.在学习装饰器之前我们先来复习一下函数的几个小点,方便更好的理解装饰器的含义. 一.知识点复习 1, 在函数中f1和f1()有什么不同,f1:表示的是将整个函数看作一个整体:f1():表示执行f1函数,下面通过一个例子来看一下: 1 2 3 4 5 def f1():     print('f1') f1                    #代表函数体本身,什么也不操作 f1()                  #代表执行函数

python中的无参装饰器和有参装饰器

python中的无参装饰器和有参装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 装饰器特点: 1>.开放封闭原则,即对扩展是开放的,对修改时封闭的: 2>.装饰器本质可以是任意可调用的对象,被装饰的对象也可以是任意可调用对象: 3>.装饰器的功能是在不修改被装饰器对象源代码以及被装饰器对象的调用方式的前提下为其扩展新功能: 4>.装饰器本质是函数,(即装饰其他函数)就是为其他函数添加附加功能. 一.典型装饰器案例 1 #!/usr/bin/env pyth

Python中,关于@property装饰器

1.为什么使用@property装饰器?br/>在类中,当我么不想在外界直接调用到类的属性,或者不想展示属性的真实内容时,可以用到@property.它规定了我们直接用 对象名.属性名 获取对象属性时并不会直接取得对象的属性,而是通过调用@property装饰过的属性函数来给调用者反馈. 2.我们为什么不使用特定的方法来进行上面的操作?原因是因为太繁琐.例: class Person: def __init__(self, username, password) -> None: self.u