python装饰器

关于 Python_你一定没读过的8个技巧

吃可爱长大的小学妹 提交于 2019-12-14 15:55:23
介绍 Python 功能和小技巧的文章网上有无数篇,比如变量解压缩,partial 偏函数,枚举可迭代对象... 但关于 Python 我们能说的还有很多。所以今天我将向大家展示一些我知道和有使用过的特性,这些特性在其它文章或博客中很少被提及: 消毒字符串输入 对用户输入内容进行消毒几乎适用于你写的每一个程序。通常来说转换字符大小写的操作就足够了,有时候用 Regex 正则表达式就能完成,但对于比较复杂的情况,我们有更好的办法: user_input = "This\nstring has\tsome whitespaces...\r\n" character_map = { ord('\n') : ' ', ord('\t') : ' ', ord('\r') : None } user_input.translate(character_map) # This string has some whitespaces... " 在这个例子中我们可以看到空格子字符"\n"和"\t"已被单个空格代替,而"\r"已经被删除。这是一个很简单的示例,但我们可以更进一步,并使用unicodedata包和它的 combining() 函数来重新生成映射。 迭代器切片 如果尝试对 Iterator 进行切片,则会出现 TypeError和"generator object is not

python函数装饰器

非 Y 不嫁゛ 提交于 2019-12-14 12:00:50
1、定义:装饰器,就是把一个函数当作参数,返回一个替代版的函数 本质上就是一个返回函数的函数 2、作用:在不改变原函数的基础上给函数增加功能 3、装饰器 如: def outer ( func ) : ##()中是要装饰的函数,此函数名和任意,即参数 def inner ( ) : ##定义的要装饰的内容的函数 print ( '*********' ) ##要装饰的内容 func ( ) ##运行要装饰的函数 return inner ( ) ##返回inner,就是返回装饰后的函数 @outer ##语法糖 (在不用改变原函数的情况下,修改函数的输出结果) def shuchu ( ) : print ( 'wa ha ha' ) @outer def lizi ( ) : print ( 'hello world' ) 例子: def outer ( func ) : def inner ( age ) : if age < 0: age = 0 else: age = age func ( age ) return inner @outer def say ( age ) : print ( 'name is %d years old' % ( age )) say ( 10 ) say ( -10 ) 例子: def desc ( fun ) : def add_info

python装饰器_1

非 Y 不嫁゛ 提交于 2019-12-14 06:09:41
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。 先来看一个简单例子: def foo(): print('i am foo') 现在有一个新的需求,希望可以记录下函数的执行日志,于是在代码中添加日志代码: def foo(): print('i am foo') logging.info("foo is running") bar()、bar2()也有类似的需求,怎么做?再写一个logging在bar函数里?这样就造成大量雷同的代码,为了减少重复写代码,我们可以这样做,重新定义一个函数:专门处理日志 ,日志处理完之后再执行真正的业务代码 def use_logging(func): logging.warn("%s is running" % func.__name__) func() def bar(): print('i am bar') use_logging(bar) 逻辑上不难理解, 但是这样的话,我们每次都要将一个函数作为参数传递给use

详解Python迭代器,生成器,装饰器

南笙酒味 提交于 2019-12-13 12:42:25
文章目录 迭代器 生成器 装饰器 迭代器 简介:迭代器是python里面可以记住遍历位置的对象,迭代器只能往前不能往后,使用iter()创建一个迭代器,使用next()返回一个迭代器里面的元素。 应用场景:数列的数据规模巨大,或者数列有规律,但是通过列表推导式推导不出来 #!/usr/local/bin/python3 import sys it = iter ( [ 1 , 32 , 43 , 2 ] ) while True : try : print ( next ( it ) ) except StopIteration : sys . exit ( ) 参考: 廖雪峰的迭代器教程 菜鸟教程:迭代器与生成器 Tyson Lee的博客:详解高阶函数,闭包,装饰器 生成器 简介:在python里面使用了yield的函数称为生成器,生成器返回一个迭代器,在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象 应用场景: 列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。 如:仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。 如果列表元素按照某种算法推算出来

python-装饰器

我只是一个虾纸丫 提交于 2019-12-13 10:43:05
装饰器: 定义:本质就是函数,(装饰其他函数)为了其他函数添加功能; 原则:1、不能修改被装饰的函数的源代码; 2、不能修改被装饰的函数的调用方式;     以上两点其实就是装饰器对被他装饰的函数是完全透明的,也就是说用你函数的人不知道你改了这个函数的。 需要用到的知识:   1、函数即“变量”;2、高阶函数;3、嵌套函数   高阶函数+嵌套函数 =》装饰器 1、函数即变量----函数定义和变量定义一样,当定义一个函数或者变量时,在内存中放入变量的值或者函数体,变量名或者函数名知识相当于该内存块的门牌号 def bar(): #python中bar函数在foo之前和之后定义都是一样的,只要bar在调用之前存在了就可以;不同于C++; print('in the bar')def foo(): print('in the foo') bar()foo()2、高阶函数---满足条件:  a、把一个函数名当着实参传给另外一个函数;(在不修改被装饰函数源代码的情况下为其添加功能)  b、返回值中包含函数名;两个条件任意一个条件之一就是高阶函数(不修改函数调用方式)。   a、    import time     def bar(): #python中bar函数在foo之前和之后定义都是一样的;不同于C++     time.sleep(3)      print('in the bar'

全面深入理解 Python 面向对象

萝らか妹 提交于 2019-12-12 03:30:33
本篇将详细介绍Python 类的成员、成员修饰符、类的特殊成员。 类的成员 类的成员可以分为三大类:字段、方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份。 一、字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class Province : # 静态字段 country = '中国' def __init__ ( self , name ) : # 普通字段 self . name = name # 直接访问普通字段 obj = Province ( '河北省' ) print obj . name # 直接访问静态字段 Province . country 由上述代码可以看出【普通字段需要通过对象来访问】【静态字段通过类访问】,在使用上可以看出普通字段和静态字段的归属是不同的。其在内容的存储方式类似如下图: 由上图可是: 静态字段在内存中只保存一份 普通字段在每个对象中都要保存一份 应用场景:通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段 二、方法 方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。

你想要的Python面试都在这里了【315+道题】

爱⌒轻易说出口 提交于 2019-12-11 18:31:30
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 写在前面 近日恰逢学生临近毕业,课程后期大家“期待+苦逼”的时刻莫过于每天早上内容回顾和面试题问答部分【临近毕业每天课前用40-60分钟对之前内容回顾、提问和补充,专挑班里不爱说话就的同学回答】。 期待的是可以检验自己学习的成功;苦逼的是怎么又有东西没记住,但我们依然每天坚持一遍、一遍又一遍指导记住为止。 需要完整的面试题可以看一下下图: 第一部分 Python基础篇(80题) 为什么学习Python? 通过什么途径学习的Python? Python和Java、PHP、C、C#、C++等其他语言的对比? 简述解释型和编译型编程语言? Python解释器种类以及特点? 位和字节的关系? b、B、KB、MB、GB 的关系? 请至少列举5个 PEP8 规范(越多越好)。 通过代码实现如下转换: 二进制转换成十进制:v = “0b1111011” 十进制转换成二进制:v = 18 八进制转换成十进制:v = “011” 十进制转换成八进制:v = 30 十六进制转换成十进制:v = “0x12” 十进制转换成十六进制:v = 87 请编写一个函数实现将IP地址转换成一个整数。 如 10.3.9.12 转换规则为: 10 00001010 3 00000011 9 00001001 12 00001100

简单回顾一下python 装饰器。

浪尽此生 提交于 2019-12-11 17:07:34
Python 装饰器(Decoratar)存在的意义就是再不改变原有函数的情况下,给函数增加功能。 直接通过代码以及相应的注释来展示。 def fnname_dec(fn): def wapper(*args, **kwargs): # 为什么wapper 要接收参数呢。 因为被装饰后的函数其实就是wapper, # 然后要接受被装饰后的函数speak的参数供原来的speak函数使用来达到不影响原函数的功能。 print("My name is " + fn.__name__) return fn(*args, **kwargs) return wapper # @fanname_dec def speak(word): print("i say:" + word) return "speak" if __name__ == "__main__": speak = fnname_dec(speak) # 这句话的功能与@fanname_dec 这个语法糖是一样的。 当执行fnname_dec(speak)的时候, # 就像当于执行了wapper函数,因为fnname_dec 的返回值是wapper 是这个函数而不是某个值。 speak("haha") # 就相当于wapper("haha"), 而wapper的返回值是原来speak的返回值,并且在返回的时候执行了 speak(

python中的装饰器

做~自己de王妃 提交于 2019-12-11 12:36:50
python中的装饰器 装饰器简单来说就是一个函数,具有附加其他函数功能的能力 python是面向对象的编程,所以在python中一切皆为对象,那么函数也是对象。 既然是对象就可以进行赋值操作 '''赋值操作''' def func ( ) : print ( "hello" ) if __name__ == "__main__" : text = func text ( ) 运行结果 hello 这里可以看出text()实现了自定义函数一样的功能 也可以作为参数传递给其他函数 '''作为参数操作''' def func ( ) : print ( "hello" ) def text ( func ) : func ( ) if __name__ == "__main__" : text ( func ) 运行结果 hello 还可以在函数内部定义函数 '''内置函数''' def text ( ) : def func ( ) : print ( "hello" ) return func if __name__ == "__main__" : text1 = text ( ) text1 ( ) 运行结果 hello 综上,我们可以细化一下装饰器的工作流程 1.定义一个函数(装饰器),且以一个函数作为参数(形参函数) 2.在这个定义函数(装饰器)内部内置一个函数 3

Python装饰器概述与字符串补充

冷暖自知 提交于 2019-12-10 23:51:27
一.字符串的补充 如何快速生成验证码等无序、限定个数的码 import random import string print(string.ascii_letters) print(string.ascii_lowercase) print(string.ascii_uppercase) print(string.digits) # abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ # abcdefghijklmnopqrstuvwxyz # ABCDEFGHIJKLMNOPQRSTUVWXYZ # 0123456789 print(string.ascii_letters+string.digits) # abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 lie=string.ascii_letters+string.digits print(random.sample(lie,5)) # ['2', 'r', 'D', 'j', 'T'] def random_code(len=4): #写法1 # code='' # for i in range(len): # newcode=random.choice(lie) # code +=