python进阶-Python 进阶用法 (持续更新)

装饰器(Decorator)

Python 的装饰器是任何可调用对象(callable object),用于修改函数(Function)或类(Class)。按照用途可分为:

函数装饰器

类装饰器

装饰器的接口定义可概括为:

接收某个函数或类的引用作为参数;

修改该函数或类并返回。

简单函数装饰器示例

理解装饰器

def my_decorator(func):

def wrapped_func(arg):

print("Before calling " + func.__name__)

func(arg)

print("After calling " + func.__name__)

return wrapped_func

def foo(arg):

print("Hi, foo has been called with " + str(arg) )

print("We call foo BEFORE decoration:")

foo("no decoration"); print()

print("We NOW decorate foo with my_decorator... ")

foo = my_decorator(foo)

print("We call foo AFTER decoration:")

foo("decoration")

程序对应的输出为:

We call foo BEFORE decoration:

Hi, foo has been called with no decoration

We NOW decorate foo with my_decorator...

We call foo AFTER decoration:

Before calling foo

Hi, foo has been called with decoration

After calling foo

上述例子中的用法在实际开发中并不常用,我们更倾向于下面的写法。

语法糖写法

Python 提供一种更简洁、直观的装饰器写法。例如我们可以把上述例子写成更简便的形式:

def my_decorator(func):

def wrapped_func(arg):

print("Before calling " + func.__name__)

func(arg)

print("After calling " + func.__name__)

return wrapped_func

@my_decorator

def foo(arg):

print("Hi, foo has been called with " + str(arg) )

foo("decoration")

函数装饰器应用示例

统计函数调用次数

def call_counter(func):

def func_with_counts(arg):

func_with_counts.calls += 1

return func(arg)

func_with_counts.calls = 0

return wrapped_func

@call_counter

def foo(arg):

return "foo: " + str(arg)

print("foo has been called {} time(s)".format(foo.calls))

for i in range(0, 51, 10):

foo(i)

print("foo has been called {} time(s)".format(foo.calls))

程序对应的输出结果是:

foo has been calld 0 time(s)

foo: 0

foo: 10

foo: 20

foo: 30

foo: 40

foo: 50

foo has been calld 6 time(s)

用记忆表(Memoization1)优化 Fibonacci 数列算法

def memoize(func):

memo = {}

def memoized_func(arg):

if arg not in memo:

memo[arg] = func(arg)

return memo

return memoized_func

@memoize

def fib(n):

if n == 0:

return 0

elif n = 1:

return 1

else:

return fib(n-1) + fib(n-2)

for i in range(20):

print(fib(i), end=", ")

print(fib(20))

程序对应的输出结果是:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765

类装饰器

首先需要明确,Python 的装饰器是任何可调用对象而不仅限于函数。我们可以定义一个类并使其对象可调用。例如我们可以定义一个带缓存功能的类计算 Fibonacci:

class Fibonacci:

def __init__(self):

self.cache = {}

def __call__(self, n):

if n not in self.cache:

if n == 0:

self.cache[0] = 0

elif n == 1:

self.cache[1] = 1

else:

self.cache[n] = self.cache[n-1] + self.cache[n-2]

return cache[n]

fib = Fibonacci()

for i in range(20):

print(fib(i), end=", ")

print(fib(20))

程序对应的输出结果是:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765

因此,我们可以构建一个可调用对象并令其作为装饰器。

在下面的例子中,我们用类装饰器统计函数调用次数:

class CallCounter:

def __init__(self, func):

self.calls = 0

self.func = func

def __call__(self, arg):

self.calls += 1

return self.func(arg)

@CallCounter

def foo(arg):

return "foo: " + str(arg)

print("foo has been called {} time(s)".format(foo.calls))

for i in range(0, 51, 10):

foo(i)

print("foo has been called {} time(s)".format(foo.calls))

注意 Memoization 是专业术语,不是 Memorization。?

原文地址:https://www.cnblogs.com/LexLuc/p/10259110.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aws php mysql,AWS快速搭建nginx+php+mysql

yum -y install nginxyum -y install php71yum -y install php71-fpm php71-cli php71-common php71-gd php71-devel php71-pdo php71-mysql php71-mbstringyum -y install mysql-server mysql-develnginx php做服务,在高并发的时候会出现一些错误 connect() to…

python中的字典和集合_Python 字典和集合

字典的每个键值对用冒号分割,键值对之间用逗号分隔,所有键值对包括在{}中。d {key1 : value1, key2 : value2 }键必须是唯一的,值可以不唯一。值可以取任何数据类型,但键必须是不可变对象,如字符串,数字或…

centos 8 kubernetes安装详解_8方面图文详解,电气安装工程施工工艺!

八方面图文解读电气安装工艺控制标准1盘、台、开关柜安装2电缆桥架施工3电缆敷设及接线施工4架空线及设备跳线施工5电力变压器安装6电气母线安装7防火封堵施工8成品保护意识一、盘、台、开关柜安装工艺控制标准1.1按设计图纸并根据厂家资料、尺寸误差要求制作盘底座。1.2立盘的…

python与人工智能应用锁_linux应用锁的搜索结果-阿里云开发者社区

Linux中的spinlock和mutexLinux中的spinlock和mutex作者digoal日期2016-11-09标签PostgreSQL , Linux , spin lock , mutex , 自旋锁 , 抢占锁背景最近在压测PostgreSQL同步流复制时,遇到一个mutex锁的瓶颈问题。具体见 《PostgreSQL 同步流复制锁瓶颈分析》PG是以b…

hfss和matlab,hfss和MATLAB联合仿真

hfss中仿真太费时间,而且是在做优化,能否进行hfss和matlab联合仿真,利用模拟退火算法缩短仿真时间?可能我的问题描述的不是特别清楚,我不是想要具体的解决方案,只希望有相关资料的人能提供给小弟一点资料,…

c++代码健壮性_复活Navex-使用图查询进行代码分析(上)

从了解到修复 Navex, 其中花了一年多, 从对自动化代码审计一无所知到学习PL/Static Analysis, 翻阅十几年前的文档, 补全Gremlin Step, 理解AST, CFG, DDG, PDG, CPG, 也感谢z3r0yu师傅和Gaba哥的的交流指导.本文重点在于静态分析 Joern-图查询部分, 后面的动态分析自动生成EXP…

公文字体字号标准2020_一文了解公文格式规范,图文并茂(建议收藏备用)

本方法根据《党政机关公文格式国家标准》(GB/T9704-2012)制定。具体内容如下:一、办公软件要求适用于微软OFFICE—WORD文字处理软件。二、页面设置1.选择“文件”——“页面设置”选择“页边距”附签,上:3.7厘米,下:3.…

360浏览器卸载_无法卸载?Win10 强推新 Edge 浏览器,来教你如何干掉它

8月17日消息,相信不少更新了 Windows 10 v2004 版本的用户都已经发现,系统默认浏览器已经自动更新为基于 Chromium 打造的全新 Edge 浏览器,虽然该浏览器已经一跃成为全球第二大桌面浏览器,但却仍然有不少用户反馈不好用。撰文 | …

python gridsearch_python gridsearch中的内存错误

我需要应用网格搜索我有20000列和110000行的数据帧,我需要使用python的网格搜索模块调整我的参数#validation for svm#there are an error to check it ( grid search ne marche pas i will check why after)label df.Sentimenttrain df.drop(Sentiment, axis1)fro…

磁卡门锁怎么配卡_样式多的铜工艺品怎么设计请查看_江西南昌皇巢|铜门||别墅铜门|...

江西南昌皇巢|铜门||别墅铜门|专注FNbnWz样式多的铜工艺品怎么设计请查看,咨询更多详情!KLC欧式门锁室内门锁卧室房门锁黄古铜门锁实木门锁具执手锁¥,月销笔进店相关推荐词军升欧式门锁黄古铜田园室内门锁执手机械门锁卧室锁具防盗…

php怎么分割页面,用html如何把页面分割成多个文件,由多个文件拼接而成?

用html如何把页面分割成多个文件,由多个文件拼接而成?更新时间:2014-11-10 作者:久久经验网 来源:久久经验网 所属分类:Web前端摘要:静态html分割页面,达到类似php等动态页面的in…

python xml字符串_python -解析字符串,并返回xml格式字符串 急该如何解决

python --解析字符串&#xff0c;并返回xml格式字符串 急急急。str """Registrations:Call-ID: 8945da7a7f550c16NWRjZjdmMjhmNWQxYTZlOTJjMDY5YjhiN2RjMDViMWE.User: 1000192.168.1.111Contact: "1000" <1000>1000&g…

13寸笔记本电脑尺寸_如何判断行李箱的尺寸?标准行李箱尺寸对照表(13~32寸)

行李箱已经成为家庭必备的一件物品&#xff0c;很多时候都会用到行李箱&#xff0c;最晚就是大学时期&#xff0c;肯定会准备一个行李箱&#xff0c;有些人第一次买不知道如何判断行李箱的尺寸&#xff0c;今天小编就教大家怎么自己确定行李箱的尺寸。如何判断行李箱的尺寸?行…

python列表转字节_如何在Python中将十进制数转换为字节列表

How do you turn a long unsigned int into a list of four bytes in hexidecimal?Example...777007543 0x2E 0x50 0x31 0xB7解决方案The simplest way I can think of is to use the struct module from within a list comprehension:import structprint [hex(ord(b)) for b…

php里忽略输入数值里的空格,input在标签内设置禁止输入空格

video&period;js1.github地址 2.常用API: class : video-js: video-js应用视频所需的风格.js功能,比如全屏和字幕. vjs-default-skin: vjs-default- ...NSMutableAttributedString 富文本删除线的用法#import //价格 NSString *priceStr "99元 剁手价66元"; NSM…

华为手机怎么隐藏按键图标_mac桌面图标怎么快速隐藏?

我们会应为方便而在电脑桌面直接放一些文件&#xff0c;对于处女座而言无论是桌面还是电脑桌面都不希望非常凌乱&#xff0c;那么我们如何隐藏我们的mac电脑桌面图标文件呢&#xff1f;如何才能使电脑看起来干净整洁呢&#xff1f;一、如何在 Finder 中隐藏桌面图标&#xff1f…

bat脚本中如何多次键盘输入并判断_电脑上如何多开微信?PC端多开微信的方法

相信很多人都有多个微信&#xff0c;尤其是那些工作和生活分的比较开的人士&#xff0c;大家都知道一个电脑和可以登录多个QQ的&#xff0c;但是对于微信却不是这样。当你已经登录一个微信时&#xff0c;再打开微信时会自动弹出当前已经登录的微信窗口。本文将教你如何在PC电脑…

php配置实例,php mailto配置实例

本节内容&#xff1a;php mail to的配置方法。1&#xff0c;配置文件[mail function]; For Win32 only.SMTP mail3.jbxue.comsmtp_port 25; For Win32 only.;sendmail_from meexample.com说明&#xff0c;仅用于测试&#xff0c;所以没有用到用户名和密码&#xff0c;测试代…

python创建dataframe表格不显示_创建列pandas DataFrame数据的表绘图时出现问题?

我有下面的代码&#xff0c;它创建一个带有标签的列名的表映像。我遇到的问题是让列(dc[x])能够垂直填充表&#xff0c;而不是水平填充。在def drilltable():c readcsv3()dc DataFrame(c)topA,ARA,PWA, dc[0],dc[1],dc[2],data[topA,ARA,PWA]fig plt.figure()ax fig.add_s…

win7蓝牙怎么连接_win7添加打印机提示windows无法连接怎么办?正确解决方法分享...

如果有多台电脑&#xff0c;那么一般会把打印机设置成共享&#xff0c;然后其他电脑通过添加网络打印机的方式来使用。有win7纯净版系统用户遇到一个问题&#xff0c;在自己电脑上要添加另一台电脑共享的打印机时&#xff0c;出现“Windows无法连接到打印机。键入的打印机名不正…