python装饰器

Python十大装B语法

二次信任 提交于 2020-01-07 08:41:10
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才是原配吗?No,你可能不知道,else 是个脚踩两只船的家伙,for 和 else 也是一对,而且是合法的。十大装B语法,for-else 绝对算得上南无湾!不信,请看: >>> for i in [1,2,3,4]: print(i) else: print(i, '我是else') 1 2 3 4 4 我是else 如果在 for 和 else 之间(循环体内)有第三者 if 插足,也不会影响 for 和 else 的关系。因为 for 的级别比 if 高,else 又是一个攀附权贵的家伙,根本不在乎是否有 if,以及是否执行了满足 if 条件的语句。else 的眼里只有 for,只要 for 顺利执行完毕,else 就会屁颠儿屁颠儿地跑一遍: >>> for i in [1,2,3,4]: if i > 2: print(i) else: print(i, '我是else') 3 4

装饰器(Python)

北城以北 提交于 2020-01-06 20:03:22
装饰器(decorators)是 Python 的一个重要部分。简单地说:装饰器是修改其他函数的功能的函数,能让我们的代码更容易被扩展,更加简短。 举个例子: def login(): print("登录中...") login() 这是最简单的一个函数,直接调用必然是执行了print()吧。既然是模拟登录,那是不是应该加一些功能扩展一下呢,在不修改原函数的情况下,那么,装饰器来啦。 我们再定义一个装饰器(本质上是函数,符合闭包的特点) - decorator: http://yuyou10.nx04.com http://yuyou11.nx04.com http://yuyou12.nx04.com http://yuyou13.nx04.com http://yuyou14.nx04.com http://yuyou15.nx04.com http://yuyou16.nx04.com http://yuyou17.nx04.com http://yuyou18.nx04.com def decorator(func): check = '正在校验...' finshed = '校验完毕...' def pack(): func() print(check) print(finshed) return pack 可以看到,这个装饰器的参数是函数,内部又封装了一个函数pack(

Python性能提升小技巧

独自空忆成欢 提交于 2020-01-04 03:42:33
第一部分 1-使用内建函数: 你可以用Python写出高效的代码,但很难击败内建函数. 经查证. 他们非常快速 2-使用 join() 连接字符串. 你可以使用 + 来连接字符串. 但由于string在Python中是不可变的,每一个 + 操作都会创建一个新的字符串并复制旧内容. 常见用法是使用Python的数组模块单个的修改字符;当完成的时候,使用 join() 函数创建最终字符串. >>> #This is good to glue a large number of strings >>> for chunk in input(): >>> my_string.join(chunk) 3-使用Python多重赋值,交换变量 这在Python中即优雅又快速: >>> x, y = y, x 这样很慢: >>> temp = x >>> x = y >>> y = temp 4-尽量使用局部变量 Python 检索局部变量比检索全局变量快. 这意味着,避免 "global" 关键字. 5-尽量使用 in 使用 in 关键字. 简洁而快速. >>> for key in sequence: >>> print “found” 6-使用延迟加载加速 將 import 声明移入函数中,仅在需要的时候导入. 换句话说,如果某些模块不需马上使用,稍后导入他们. 例如

python中的装饰器(Decorators)

醉酒当歌 提交于 2020-01-02 15:33:09
一、什么是python装饰器(Decorators) 定义 :python的装饰器:装饰原有的函数,用于拓展原来函数功能的一种函数,在不更改原来函数代码的基础上,增加函数的功能。 格式 :@ 符号就是装饰器的语法糖,它放在函数开始定义的地方,这样就可以省略最后一步再次赋值的操作。 二 、装饰器返回值及用处 装饰器的返回值也是一个函数/类对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。 装饰器的具体详解可学习此链接 三、用法: 1、函数装饰器 用@函数名,装饰器可以嵌套函数,分为装饰器带参数和不带参数的。用法可参照以下代码使用。 代码引用自: def demo1 ( demo_name ) : def wrapper ( fun ) : print ( demo_name , "wrapper" ) fun ( ) # end def @wrapper def test ( ) : print ( demo_name , "test" ) # end def test # 调用test方法,此处不能加()。 # end def(demo) def demo2 ( demo_name ) : #可以创建嵌套的函数,函数也能返回函数 def wrapper ( func ) : def callback ( *

Python装饰器学习(九步入门)

爱⌒轻易说出口 提交于 2020-01-02 05:14:28
这是在Python学习小组上介绍的内容,现学现卖、多练习是好的学习方式。 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc(): print("myfunc() called.") myfunc() myfunc() 第二步:使用装饰函数在函数执行前和执行后分别附加额外功能 # -*- coding:gbk -*- '''示例2: 替换函数(装饰) 装饰函数的参数是被装饰的函数对象,返回原函数对象 装饰的实质语句: myfunc = deco(myfunc)''' def deco(func): print("before myfunc() called.") func() print(" after myfunc() called.") return func def myfunc(): print(" myfunc() called.") myfunc = deco(myfunc) myfunc() myfunc() 第三步:使用语法糖@来装饰函数 # -*- coding:gbk -*- '''示例3: 使用语法糖@来装饰函数,相当于“myfunc = deco(myfunc)” 但发现新函数只在第一次被调用,且原函数多调用了一次''' def deco(func):

Python核心编程

瘦欲@ 提交于 2020-01-02 01:09:55
模块循环导入问题 深拷贝和浅拷贝 位运算 获取私有属性的值 property的使用 迭代器 闭包 装饰器 python动态添加属性以及方法 生成器 1.模块循环导入问题 #vi a.py from b import b def a(): print('-----a-----') b() a() #vi b.py from a import a def b(): print('-----b-----') def c(): print('------c-----') a() c() #python3 a.py的结果是:ImportError:cannot import name 'a' 解决办法:不要互相调用,另外写个 主模块 去调它们(子模块) 2.深拷贝与浅拷贝 #浅拷贝 a = [11,22,33] b = a id(a) == id(b) #True #深拷贝 a = [11,22,33] import copy c = copy.deepcopy(a) id(a) == id(b) #False #copy与deepcopy的区别 copy只拷贝第一层引用;deepcopy是递归拷贝所有引用 当copy遇到元组时,会进行浅拷贝(只指向) 3.位运算 & 按位与 | 按位或 ^ 按位异或 ~ 按位取反 << 按位左移 >> 按位右移 用途:直接操作二进制,省内存,效率高 按位移

Python核心编程的四大神兽:迭代器、生成器、闭包以及装饰器

北战南征 提交于 2020-01-02 01:09:13
生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值;在下一次调用该函数执行时,程序将从上一次暂停的位置继续往下执行。 通过一个例子来理解生成器的执行过程。求1-10的所有整数的立方并将结果打印输出,正常使用列表的实现如下: 输出结果如下: 当数据量很少时,可以很快得到结果。但是如果范围扩大到10000甚至是100000000,就会发现程序执行时间会变长,变卡,甚至有可能会因超出内存空间而出现程序崩溃的现象。这是因为当数据量变得非常大的时候,内存需要开辟很大的空间去存储这些数据,内存都被吃了,自然会变慢变卡。使用生成器就能解决这个问题。 对于上述同一个问题用生成器实现如下,将范围扩大到1-10000000: 执行效果如下: 可以看到没有任何的结果输出,这说明程序已经可以顺利执行。对于迭代器来讲需要用next()方法来获取值,修改主函数为以下情况可以打印输出前4个整数的立方数: 输出结果如下: 到此可以看到,生成器生成的值需要使用next()方法一个一个的取,它不会一次性生成所有的计算结果,只有在取值时才调用,这时程序会返回计算的一个值且程序暂停;下一次取值时从上一次中断了的地方继续往下执行。 以取出前3个值为例,下图为生成器代码解析图: 图解

Python核心编程的四大神兽

ε祈祈猫儿з 提交于 2020-01-02 01:08:50
本文将主要分为4大部分,分别介绍Python核心编程中的迭代器、生成器 、闭包以及装饰器。 生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值;在下一次调用该函数执行时,程序将从上一次暂停的位置继续往下执行。 通过一个例子来理解生成器的执行过程。求1-10的所有整数的立方并将结果打印输出,正常使用列表的实现如下: def lifang_ls(): """求1-10所用整数的立方数-列表方式实现""" ls = [] for i in range(1,11): result = i ** 3 ls.append(result) print(ls) if __name__ == '__main__': lifang_ls() 输出结果如下: 当数据量很少时,可以很快得到结果。但是如果范围扩大到10000甚至是100000000,就会发现程序执行时间会变长,变卡,甚至有可能会因超出内存空间而出现程序崩溃的现象。这是因为当数据量变得非常大的时候,内存需要开辟很大的空间去存储这些数据,内存都被吃了,自然会变慢变卡。使用生成器就能解决这个问题。 对于上述同一个问题用生成器实现如下,将范围扩大到1-10000000: def lifang_generate(): """求1

60秒一口Python:147个demo,助你从新手小白步步进阶编程高手

我的梦境 提交于 2019-12-30 14:34:04
生苦短,编程苦手,不妨学起Python,感受一飞冲天的快乐。 要害怕学习的过程枯燥无味,这里有程序员jackzhenguo打造的一份中文Python“糖果包”:147个代码小样,60秒一口,营养又好玩,从Python基础到机器学习尽皆囊括。 入门简单如十进制转二进制,尽显Python简洁之美: In [1]: bin(10) Out[1]: '0b1010' 冬天到了,就算没有点亮手绘技能,也能用简单几行代码绘出漫天雪花: 例子是有趣的例子,教程也是正经教程,学习路径清晰、系统,先一起来看看完整目录: 学习路径 施工完成:1、Python基础2、Python字符串和正则化3、Python文件4、Python日期5、Python利器6、Python画图7、Python实战施工中:Python基础算法python 机器学习,包括机器学习的基础概念和十大核心算法以及Sklearn和Kaggle实战的小例子PyQt制作GUIFlask前端开发Python数据分析:NumPy, Pandas, Matplotlib, Plotly等 教程开篇,先用82段简单易懂的代码,介绍了Python的基础语法、功能。由简入繁,层层递进。 class Bloomfilter(object): 欢迎加入我的python学习q裙一起学习Python:821871075   """   A Bloom

python之路——迭代器与生成器

落花浮王杯 提交于 2019-12-29 17:59:18
要了解for循环是怎么回事儿,咱们还是要从代码的角度出发。 首先,我们对一个列表进行for循环。 for i in [1,2,3,4]: print(i) 上面这段代码肯定是没有问题的,但是我们换一种情况,来循环一个数字1234试试 for i in 1234 print(i) 结果: Traceback (most recent call last): File "test.py", line 4, in <module> for i in 1234: TypeError: 'int' object is not iterable iterable:是可迭代的意思。 首先,我们从报错来分析,好像之所以1234不可以for循环,是因为它不可迭代。那么如果“可迭代”,就应该可以被for循环了。 这个我们知道呀, 字符串、列表、元组、字典、集合 都可以被for循环,说明他们 都是可迭代的 。 我们怎么来证明这一点呢? from collections import Iterable l = [1,2,3,4] t = (1,2,3,4) d = {1:2,3:4} s = {1,2,3,4} print(isinstance(l,Iterable)) print(isinstance(t,Iterable)) print(isinstance(d,Iterable)) print