1. 迭代器 

 1 """
2 iterator
3 迭代器协议: 对象必须提供一个next()方法,执行该方法要么返回迭代中的下一项,要么引起一个StopIteration异常,以终止迭代
4 可迭代对象: 实现可迭代协议的对象。(对象内部定义一个__iter__()方法)
5 访问方式:下标方式、迭代器协议、for循环
6 """
7
8
9 li = [1, 2, 3, 4, 5]
10 iter_li = li.__iter__() # 通过__iter__()方法生成可迭代对象
11 print(iter_li) # <list_iterator object at 0x000002565B5BD748>
12 # print(li[0])
13 print(iter_li.__next__()) # 1
14 print(next(iter_li)) # 2
15
16 # for 循环访问遵循迭代器访问方式
17 # for i in li:
18 # print(i)

2. 生成器

 1 """
2 generator
3 生成器函数: 定义函数,包换关键字 yield
4 生成器表达式: 三元表达式
5 send()
6 """
7
8
9 # 生成器函数
10 def generator_func():
11 yield 1
12 yield 2
13 yield 'louis'
14 yield 'scar'
15 yield 'rose'
16 x = yield
17 print('x=', x)
18 y = yield
19 print('y=', y)
20
21
22 gen = generator_func()
23 print(gen) # <generator object generator_func at 0x000001A5464A2F48>
24 print(gen.__next__())
25 print(gen.__next__())
26 print(gen.__next__())
27 print(gen.__next__())
28 print(gen.__next__())
29 print(gen.__next__()) # None
30 # 改变x的值并触发 __next()__
31 res = gen.send('init_')
32 print(res) # x= init_ None
33
34 # 生成器表达式
35 count1 = [x for x in range(10)] # 列表表达式
36 print(count1) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
37 count2 = (x for x in range(10) if x > 5) # 生成器表达式
38 print(count2) # <generator object <genexpr> at 0x000001E364E87840>
39 print(list(count2)) # [6, 7, 8, 9]
40
41
42 import time
43
44
45 # 生产者消费者模型
46 def consumer(name):
47 print('消费者[%s]开始下单' % name)
48 while True:
49 num = yield
50 time.sleep(0.5)
51 print('%s 第[%s]杯奶茶' % (name, num))
52
53
54 def producer():
55 c1 = consumer('louis')
56 c2 = consumer('scar')
57 next(c1)
58 next(c2)
59 for i in range(1, 10):
60 c1.send(i)
61 c2.send(i)
62
63
64 producer()

运行结果:
消费者[louis]开始下单
消费者[scar]开始下单
louis 第[1]杯奶茶
scar 第[1]杯奶茶
louis 第[2]杯奶茶
scar 第[2]杯奶茶
louis 第[3]杯奶茶
scar 第[3]杯奶茶
louis 第[4]杯奶茶
scar 第[4]杯奶茶
louis 第[5]杯奶茶
scar 第[5]杯奶茶
louis 第[6]杯奶茶
scar 第[6]杯奶茶
louis 第[7]杯奶茶
scar 第[7]杯奶茶
louis 第[8]杯奶茶
scar 第[8]杯奶茶
louis 第[9]杯奶茶
scar 第[9]杯奶茶

3 装饰器

  a. 装饰器实现日志操作(带参以及不带参的装饰器函数)

 1 """
2 装饰器:本质就是函数,功能就是为其它函数添加附加功能
3 使用场景: 插入日志、性能测试、事务处理、缓存、权限校验等
4 语法糖: @def_func(func)
5 装饰器 = 高阶函数 + 函数嵌套 + 闭包
6 高阶函数: 函数的接受的参数是一个函数,返回值也是一个函数
7 函数嵌套: 在函数里面执行其它函数
8 闭包: 主要看作用域范围
9 """
10 import functools
11
12
13 def func_logging(arg):
14 print(arg)
15 if callable(arg): # 如果装饰器不带参数
16 # @functools.wraps(arg)
17 def _deco(*args, **kwargs):
18 print('%s is running' % arg.__name__)
19 arg(*args, **kwargs)
20 return _deco
21 else: # 如果装饰器带参数
22 def _deco(func):
23 @functools.wraps(func)
24 def __deco(*args, **kwargs):
25 if arg == 'warn':
26 print('warn %s is running' % func.__name__)
27 return func(*args, **kwargs)
28 return __deco
29 return _deco
30
31
32 @func_logging # test1 = func_logging(test)
33 def test1():
34 print('this is test1')
35 print(test1.__name__)
36
37
38 @func_logging('warn') # 直接执行 func_logging() 返回装饰器函数 _deco()
39 def test2():
40 print('this is test2')
41 print(test2.__name__)
42
43
44 test1()
45 # <function test1 at 0x000002335B5A1EA0>
46 # test1 is running
47 # this is test1
48 # test1
49 # 函数名变为_deco而不是test1,这个情况在使用反射的特性的时候就会造成问题。因此引入了functools.wraps解决这个问题
50 test2()
51 # warn
52 # warn test2 is running
53 # this is test2
54 # test2

  b. 性能测试

 1 import time
2 import functools
3 # 性能测试
4 def timer(func):
5 @functools.wraps(func)
6 def warpper(*args, **kwargs):
7 print('%s is start running' % func.__name__)
8 start_time = time.time()
9 func(*args, **kwargs)
10 stop_time = time.time()
11 print('%s is stop running, cost %s s' % (func.__name__, stop_time - start_time))
12 return warpper
13
14
15 @timer
16 def test3():
17 time.sleep(1.0)
18 print(test3.__name__)
19
20
21 test3()
22 # test3 is start running
23 # test3
24 # test3 is stop running, cost 1.0015299320220947 s

Python中的迭代器、生成器、装饰器的更多相关文章

  1. python中的迭代器&&生成器&&装饰器

    迭代器iterator 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外, ...

  2. python中的迭代器 生成器 装饰器

    什么迭代器呢?它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了__iter__和__next__()(python2中实现next())方法的对象都是迭代器,_ ...

  3. Python基础-迭代器&生成器&装饰器

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 我现在有个需求,看 ...

  4. Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

  5. Day4 - Python基础4 迭代器、装饰器、软件开发规范

    Python之路,Day4 - Python基础4 (new版)   本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...

  6. Python基础4 迭代器、装饰器、软件开发规范

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  7. 迭代器/生成器/装饰器 /Json & pickle 数据序列化

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  8. python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

    生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...

  9. 4.python迭代器生成器装饰器

    容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元素存储在内存中 ...

  10. Python学习——迭代器&生成器&装饰器

    一.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素.迭代器仅 ...

随机推荐

  1. python学习之基础内容

    python基础内容① 什么是python? -一种计算机语言,计算机语言分为 -高级语言:python.java.Ruby.C#.C++...... -基础语言:C语言.汇编 -计算机可以直接执行基 ...

  2. Vue3手册译稿 - 深入组件 - 自定义事件

    本章节需要掌握组件基础 emit我译成发射,觉得发射这个词比较形象的形容将子组件事件发射出来的一个动作. 事件名 像组件和props,事件名也会进行自动转换,如果你在子组件里发射一个驼峰命名的事件,你 ...

  3. Ajax数据爬取--爬取微博

    Ajax Ajax,即异步的JaveScript和XML.它不是一门编程语言,而是利用JaveScript在保证页面不被刷新,页面链接不改变的情况下与服务器交换数据并更新部分网页的技术. 对于传统的网 ...

  4. cookie跨域那些事儿

    一个请求从发出到返回,需要浏览器和服务端的协调配合.浏览器要把自己的请求参数带给服务端,服务端校验参数之后,除了返回数据,也可能会顺便把请求是否缓存,cookie等信息告诉浏览器.当请求是跨域请求的时 ...

  5. [模拟]P1046 陶陶摘苹果

    陶陶摘苹果 ## 题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试 ...

  6. 使用 shell 做 tcp 协议模拟

    问题背景 公司有一套消息推送系统(简称GCM),由于人事变动接手了其中的客户端部分.看了一下文档,仅通讯协议部分有几页简单的说明,代码呢又多又乱,一时理不出一个头绪.由于消息是从后台推送到端的,所以使 ...

  7. Unity2D项目-平台、解谜、战斗! 1.3移动组件

    各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 在这一篇中,我们将会自顶向下地讨论本2D游戏中主角不可或缺的一个功能--移动控制. 首先我们简单分析一下2D游戏中主角与移动相 ...

  8. Linux 基础命令 命令进阶

    Linux命令格式:命令 选项 参数 (大部分命令是这个格式) 注意: 1.命令区分大小写 2.短选项可以合并   长选项不能合并 如 : 短选项 -l  -h 可以合并为 -lh 长选项  不能合并 ...

  9. HUAWEI AppGallery Connect翻译服务升级,方便应用出海本地化

    HUAWEI AppGallery Connect翻译服务全新升级,携手新宇智慧.语言桥等多家服务商为全球开发者提供优质的翻译服务,解决应用在全球分发时面临的多语言本地化问题,通过平台化与全环节的翻译 ...

  10. Mysql之Mycat读写分离及分库分表

    ## 什么是mycat ```basic 1.一个彻底开源的,面向企业应用开发的大数据库集群 2.支持事务.ACID.可以替代MySQL的加强版数据库 3.一个可以视为MySQL集群的企业级数据库,用 ...