1.from functools import wraps

这个函数可以保留原来函数的属性

# from functools import wraps
def car_time(fun):
# @wraps(fun)
def inner(*args,**kwargs):
ret = fun(*args,**kwargs)
return ret
return inner @car_time
def car(some):
""" 这是一个函数car的注释"""
print(some)
print(car.__name__)
print(car.__doc__) car('hello')

hello
  inner
  None

在这是掉functools模块的调用以后,可以看出,我们调用的函数 car() 实际是闭包函数里面的inner()函数。如果加入functools模块呢

from functools import wraps
def car_time(fun):
@wraps(fun)
def inner(*args,**kwargs):
print('装饰前')
ret = fun(*args,**kwargs)
print('装饰后')
return ret
return inner @car_time
def car(some):
""" 这是一个函数car的注释"""
print(some)
print(car.__name__)
print(car.__doc__) car('hello')
装饰前
hello
car
这是一个函数car的注释
装饰后

亲爱的詹姆斯先生,神不知鬼不觉的给你加了个装饰器。没改变函数的任何属性,岂不是美滋滋?我们用了都说好

带参数的装饰器

在装饰器外面再加一层函数,三层函数调用。

def outer(形参):
def wrapper(func):
def inner(*args,**kwargs):
ret = func(*args,**kwargs) # func是被装饰的函数 在这里被调用
return ret
return inner
return wrapper @outer(实参)
def func():
pass

多个装饰器装饰一个函数

这个有空再补。。。

迭代器

小定义:只要含有 __iter__ 方法都是可迭代的,内部含有 __next__ 和 __iter__ 方法就是迭代器。

l1 = 'abc'
l2 = [1,2,3]
l3 = {}
print(l1.__iter__())
print(l2.__iter__())
print(l3.__iter__()) <str_iterator object at 0x000001B7BEF0BDA0>
<list_iterator object at 0x000001B7BEF0BE80>
<dict_keyiterator object at 0x000001B7BD2487C8>

这些可迭代的字符串,列表,字典等,执行了 __iter__() 方法,就是一个迭代器

l2 = [1,2,3,4,5]
l3 = l2.__iter__()
print(l3.__next__())
print(l3.__next__())
print(l3.__next__())
print(l3.__next__())
print(l3.__next__())
1
2
3
4
5

对迭代器执行__next__()方法,便可以取出迭代器的一个一个的值

from collections import Iterable
from collections import Iterator
class ABC:
def __iter__(self):pass
def __next__(self):pass a = ABC()
print(isinstance(a,Iterable))
print(isinstance(a,Iterator))
True
True

此处我们定义一个类,给他__iter__() 和  __next__()  方法。isinstance()函数判断已知函数是否是已知的类型

简单的小结一下:

# 迭代器协议和可迭代协议
# 可以被for循环的都是可迭代的
# 可迭代的内部都有__iter__方法
# 只要是迭代器 一定可迭代
# 可迭代的.__iter__()方法就可以得到一个迭代器
# 迭代器中的__next__()方法可以一个一个的获取值

# for循环就是在使用迭代器

day13.装饰器进阶,迭代器的更多相关文章

  1. day4之装饰器进阶、生成器迭代器

    装饰器进阶 带参数的装饰器 # 某一种情况# 500个函数加装饰器, 加完后不想再加这个装饰器, 再过一个季度,又想加上去# 你可以设计你的装饰器,来确认是否执行 # 第一种情况 # 想要500个函数 ...

  2. Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle

    目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...

  3. day13 装饰器与语法糖

    day13 装饰器与语法糖 一.装饰器 1.什么是装饰器 装饰器就是装饰别人的工具,具体是指为被装饰者添加新功能 装饰器->函数 被装饰者->函数 2.为何要用装饰器 装饰器的核心思想:( ...

  4. 简学Python第四章__装饰器、迭代器、列表生成式

    Python第四章__装饰器.迭代器 欢迎加入Linux_Python学习群  群号:478616847 目录: 列表生成式 生成器 迭代器 单层装饰器(无参) 多层装饰器(有参) 冒泡算法 代码开发 ...

  5. Python函数--装饰器进阶

    开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新功能. 2.对修改是封 ...

  6. day 12 - 1 装饰器进阶

    装饰器进阶 装饰器的简单回顾 装饰器开发原则:开放封闭原则装饰器的作用:在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质:闭包函数 装饰器的模式 def wrapper(func): ...

  7. Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器)

    Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器) 1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数

  8. Python装饰器进阶

    装饰器进阶 现在,我们已经明白了装饰器的原理.接下来,我们还有很多事情需要搞清楚.比如:装饰带参数的函数.多个装饰器同时装饰一个函数.带参数的装饰器和类装饰器. 装饰带参数函数 def foo(fun ...

  9. Python之装饰器、迭代器和生成器

    在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思 ...

随机推荐

  1. 为 Java 程序员准备的 Go 入门 PPT

    为 Java 程序员准备的 Go 入门 PPT 这是 Google 的 Go 团队技术主管经理 Sameer Ajmani 分享的 PPT,为 Java 程序员快速入门 Go 而准备的. 视频 这个 ...

  2. CF5E Bindian Signalizing

    题目 这题目是真的很水,洛谷给他紫题也差不多算恶意评分了吧233 这种一眼切的题改了很长时间,不是什么n-1搞错,就是什么and打成or,所以写这篇博客给自己长个记性QWQ 题意:n座山组成一个环,相 ...

  3. CF1059C Sequence Transformation

    原题链接 题目大意 读入一个正整数\(n\).你有一个长度为\(n\)的排列.对于一次操作,我们需要做一下几步: 1.将目前序列内所有数的\(gcd\)加入答案中 2.将序列内随意删除一个数 3.如果 ...

  4. FreeNAS-9.10虚拟机测试安装

     虚拟机安装NreeNAS-9.10步骤 需求:网络监控磁盘要扩容 测试环境: CPU 内存 系统盘 共享盘 网卡 2核 2G 20G 20G 桥接 系统版本:FreeNAS-9.10 一.配置虚拟机 ...

  5. Spotlight--你不得不用的Mac查询利器

    世界上有两种Mac用户:一种是经常使用Spotlight的,另一种是忽略Spotlight的.如果你是第二种用户,那么你需要改变.Mac所有方面的使用场景,都会随着Spotlight而变得更快.你只需 ...

  6. Springboot配置多数据源(Mysql和Orcale)--(Idea Maven JDBCTemplate支持下的)

    1.配置 orcale jdbc 对于一个Maven项目,使用Mysql时,可直接添加如下依赖: <dependency> <groupId>mysql</groupId ...

  7. Docker:dockerfile自动构建镜像 [六]

    一.手动docker镜像的缺点 相对于手动制作的docker镜像,使用dockerfile构建的镜像有以下优点: 1.dockerfile只有几kb,便于传输 2.使用dockerfile构建出来的镜 ...

  8. checkbox,三种状态设置

    多选按钮的  选中.未选中.半选中(常用于子项有选中,未全选) <input id="ckeckbox" type="checkbox"> $('# ...

  9. sublime text3格式化html,css,js代码

    需要安装HTML/CSS/JS prettify插件. 安装步骤:首选项 -> Package Control -> Install Package -> HTML-CSS-JS P ...

  10. Mongodb注入

    0x01 Brief Description 作为nosql(not only sql)数据库的一种,mongodb很强大,很多企业也在用到.相对于sql数据库,nosql数据库有以下优点:简单便捷. ...