当前位置: 首页 > news >正文

Python高手之路【四】python函数装饰器,迭代器

def outer(func):
    def inner():
        print('hello')
        print('hello')
        print('hello')
        r = func()
        print('end')
        print('end')
        print('end')
    return inner
@outer
def f1():
    print("f1 called")
# 1:执行outer函数,并且将其下面的函数名(这里就是f1函数),当做参数传递给outer函数
# 2:将outer的返回值重新赋值给f1=outer的返回值
# 3:新f1函数 = inner
# 装饰器的本质就是将原函数封装到一个新函数里,让原函数执行新函数里的内容
f1()

输出结果为:

hello
hello
hello
f1 called
end
end
end

只要函数应用装饰器,那么函数就被重新定义,重新定义为装饰器的内层函数

装饰器含两个参数的函数:

def outer(func):
    def inner(a1,a2):
        print('123')
        ret = func(a1,a2)
        print('456')
        return ret
    return inner
@outer
def index(a1,a2):
    print('234')
    return a1+a2
index(1,2)

装饰器含N个参数的函数:

def outer(func):
    def inner(*arg,**kwargs):
        print('begin')
        ret = func(*arg,**kwargs)
        print('end')
        return ret
    return inner

多个装饰器装饰同一个函数:

def outer_0(func):
    def inner(*arg,**kwargs):
        print('top')
        ret = func(*arg,**kwargs)
        return ret
    return inner

def outer(func):
    def inner(*arg,**kwargs):
        print('begin')
        ret = func(*arg,**kwargs)
        print('end')
        return ret
    return inner

@outer_0
@outer
def index(a1,a2):
    print('index')
    return a1+a2
index(1,2)

迭代器

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件

特点:

  1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
  2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问
  3. 访问到一半时不能往回退
  4. 便于循环比较大的数据集合,节省内存

生成一个迭代器:

>>> a = iter([1,2,3,4,5])
>>> a
<list_iterator object at 0x101402630>
>>> a.__next__()
1
>>> a.__next__()
2
>>> a.__next__()
3
>>> a.__next__()
4
>>> a.__next__()
5
>>> a.__next__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

Repeated calls to the iterator’s __next__() method (or passing it to the built-in function next()) return successive items in the stream. When no more data are available a StopIteration exception is raised instead. At this point, the iterator object is exhausted and any further calls to its __next__() method just raise StopIteration again.

生成器generator

定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器 

代码:

def cash_out(amount):
    while amount >0:
        amount -= 1
        yield 1<br>        print("擦,又来取钱了。。。败家子!") 
ATM = cash_out(5) 
print("取到钱 %s 万" % ATM.__next__())
print("花掉花掉!")
print("取到钱 %s 万" % ATM.__next__())
print("取到钱 %s 万" % ATM.__next__())
print("花掉花掉!")
print("取到钱 %s 万" % ATM.__next__())
print("取到钱 %s 万" % ATM.__next__())
print("取到钱 %s 万" % ATM.__next__()) #到这时钱就取没了,再取就报错了
print("取到钱 %s 万" % ATM.__next__())

作用:

这个yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。

另外,还可通过yield实现在单线程的情况下实现并发运算的效果

import time
def consumer(name):
    print("%s 准备吃包子啦!" %name)
    while True:
       baozi = yield
 
       print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
 
def producer(name):
    c = consumer('A')
    c2 = consumer('B')
    c.__next__()
    c2.__next__()
    print("老子开始准备做包子啦!")
    for i in range(10):
        time.sleep(1)
        print("做了2个包子!")
        c.send(i)
        c2.send(i)
 
producer("alex")

 

转载于:https://www.cnblogs.com/ginvip/p/6253993.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 常用的获取随机字符串
  • Eclipse中web项目部署至Tomcat步骤
  • java面试基础题,学习笔记!
  • UWP 律师查询 MVVM
  • flex键盘监听事件
  • VMWare Tools 和 Shared folder(共享文件夹)
  • flex自定义右键
  • js script中引用其他script
  • flex鼠标移到某组件鼠标的形状变成手型
  • browser-sync
  • flex chart 坐标标签角度旋转
  • 神经网络-BackPropagation算法
  • java分页代码
  • java过滤http危险字符
  • iOS开发 - 网络数据安全加密(MD5)
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Angularjs之国际化
  • ECMAScript入门(七)--Module语法
  • Github访问慢解决办法
  • HTML中设置input等文本框为不可操作
  • java8-模拟hadoop
  • JavaScript 一些 DOM 的知识点
  • Java编程基础24——递归练习
  • Java小白进阶笔记(3)-初级面向对象
  • js操作时间(持续更新)
  • js对象的深浅拷贝
  • Js基础——数据类型之Null和Undefined
  • js正则,这点儿就够用了
  • mysql innodb 索引使用指南
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • mysql中InnoDB引擎中页的概念
  • Python学习笔记 字符串拼接
  • supervisor 永不挂掉的进程 安装以及使用
  • 编写高质量JavaScript代码之并发
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 关于extract.autodesk.io的一些说明
  • 后端_MYSQL
  • 排序算法之--选择排序
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 写给高年级小学生看的《Bash 指南》
  • AI算硅基生命吗,为什么?
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • PostgreSQL之连接数修改
  • 组复制官方翻译九、Group Replication Technical Details
  • # include “ “ 和 # include < >两者的区别
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (11)MATLAB PCA+SVM 人脸识别
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (算法)前K大的和
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)