day13.装饰器进阶,迭代器
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.装饰器进阶,迭代器的更多相关文章
- day4之装饰器进阶、生成器迭代器
装饰器进阶 带参数的装饰器 # 某一种情况# 500个函数加装饰器, 加完后不想再加这个装饰器, 再过一个季度,又想加上去# 你可以设计你的装饰器,来确认是否执行 # 第一种情况 # 想要500个函数 ...
- Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle
目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...
- day13 装饰器与语法糖
day13 装饰器与语法糖 一.装饰器 1.什么是装饰器 装饰器就是装饰别人的工具,具体是指为被装饰者添加新功能 装饰器->函数 被装饰者->函数 2.为何要用装饰器 装饰器的核心思想:( ...
- 简学Python第四章__装饰器、迭代器、列表生成式
Python第四章__装饰器.迭代器 欢迎加入Linux_Python学习群 群号:478616847 目录: 列表生成式 生成器 迭代器 单层装饰器(无参) 多层装饰器(有参) 冒泡算法 代码开发 ...
- Python函数--装饰器进阶
开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新功能. 2.对修改是封 ...
- day 12 - 1 装饰器进阶
装饰器进阶 装饰器的简单回顾 装饰器开发原则:开放封闭原则装饰器的作用:在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质:闭包函数 装饰器的模式 def wrapper(func): ...
- Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器)
Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器) 1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数
- Python装饰器进阶
装饰器进阶 现在,我们已经明白了装饰器的原理.接下来,我们还有很多事情需要搞清楚.比如:装饰带参数的函数.多个装饰器同时装饰一个函数.带参数的装饰器和类装饰器. 装饰带参数函数 def foo(fun ...
- Python之装饰器、迭代器和生成器
在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思 ...
随机推荐
- P1033 自由落体
原题链接 https://www.luogu.org/problemnew/show/P1033 不得不说,这个题太坑了!!!主要是题目说得不明确...... 先来看图: 看一下用红圈圈起来的部分,就 ...
- 插入mysql失败,因为java数据类型是个实体类,加上.id就好了
错误信息: ### Error updating database. Cause: java.sql.SQLException: Incorrect string value: '\xAC\xED\x ...
- Docker:容器的四种网络类型 [十三]
一.None类型 简介:不为容器配置任何网络功能,--net=none 1.创建容器 docker run -it --network none busubox:latest 2.功能测试 [root ...
- Linux下 tftp 服务器的安装与使用
安装步骤: 1. 安装xinetd, tftp-hpa tftpd-hpa a. sudo apt-get install xinetd b. sudo apt-get install tftp- ...
- SpringBoot系列: 所有配置属性和官方文档
Spring Boot 通用配置参数https://docs.spring.io/spring-boot/docs/current/reference/html/common-application- ...
- Consequence of Point-by-Point Bounds
设 $X$ 是完备距离空间, $\scrF$ 是 $X$ 上的实连续函数族且具有性质: 对于每一 $x\in X$, 存在常数 $M_x>0$, 使得对于每一 $F\in\scrF$, $$\b ...
- ArcGis汇总篇
ArcGis-javascript-API下载 bigemap.太乐地图 可下载地图文件 用arcgis for js 可以河流流域水质图 ArcGis导出shp文件(dbf.prj.sbn.sbx. ...
- Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column
安装了mysql5.7.19后,执行语句中只要含有group by 就会报这个错 [Err] 1055 - Expression #1 of ORDER BY clause is not in GRO ...
- k64 datasheet学习笔记39---Programmable Delay Block (PDB)
0.前言 TODO 1.特性 TODO 4. 功能描述 4.1 PDB pre-trigger and trigger outputs PDB包含一个计数器,它的输出可以跟几个不同的数字值比较.如果P ...
- Revit手工创建族(转)
http://www.cnblogs.com/greatverve/p/revit-family.html 手工创建族 1.画两个参考平面. 图3001 2.点击族类型,添加参数. 图3002,300 ...