当前位置:   article > 正文

python特殊函数_python类的几个特殊函数

python类的几个特殊函数

    在日常使用python时,我们经常会碰到一些特殊的函数,下面就此进行一定的总结:

1.匿名函数
匿名函数:函数名字被隐藏

匿名函数的定义语法:
lambda 参数1,参数2,...,参数n:函数体

注意:匿名函数函数体只有一行代码,并且该行代码必须具有运行结果,运行结果会被作为函数的返回值自动返回(也可以实现只输出功能,但违背了Python简化代码的初衷,一般不建议使用)
匿名函数因为没有函数名,因此通常是通过变量接受该函数,之后通过变量名(参数列表)来调用。同时匿名函数因为代码只有一句,因此匿名函数一般只用来解决比较简单的数据计算问题
 

##2.递归函数
如果一个函数直接或间接的调用本身,这个函数即为递归函数

注意:正确的递归函数都是有限定值的,即有递归次数的限制,不会无限递归下去。因此正确的递归函数需要设置结束位置

 

##3.闭包函数
闭包函数:在A函数内部定义另外一个函数B,之后B作为A函数的返回值直接被返回,此时函数B称为函数A的闭包函数。

在闭包函数中如果使用了A函数中定义的变量,此时A函数中被定义的变量会被临时存储,直到B函数调用结束时,变量才会被系统回收,从而延长A中变量释放的时间

global:声明的变量属于全局变量,此时在使用该变量时,计算机直接到函数的最外层寻找是否存在该变量

nonlocal:声明的变量属于非本地变量,此时计算机不会在当前变量使用的函数中寻找该变量,而是到该函数的最外层寻找该距离函数比较近的对应变量进行应用
 

  1. # 延续num的寿命
  2. def put(num):
  3. print(num)
  4. def wrapper():
  5. nonlocal num # 非本地变量
  6. num = num + 20
  7. print(num)
  8. return wrapper
  9. fun = put(20)
  10. # 此时put()函数已结束,但num仍存在
  11. fun()
  12. # 20
  13. # 40
'
运行

 

##4.装饰器
装饰器:装饰器的作用是,通过@语法直接用定义好的函数修饰之前已经存在的函数,从而实现对原函数功能的扩充

装饰器的优点
1.不需要修改原函数代码,即可实现对原函数功能的扩充
2.利于后期代码的维护

  1. # 定义一个带参数的装饰器
  2. import time
  3. import functools
  4. def log(txt):
  5. def decorator(fun):
  6. @functools.wraps(fun)
  7. # 使用functools中函数将fun函数参数的名字赋值给warpper 等价于wrapper.__name__ = fun.__name__
  8. def wrapper(*args, **kwargs):
  9. print(txt, end=" ")
  10. print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
  11. return fun(*args, **kwargs)
  12. return wrapper
  13. return decorator
  14. # 功能1:求最大值
  15. @log("您当前正在运行的函数运行的时间是")
  16. def max_num(num1, num2):
  17. print(max(num1, num2))
  18. # 功能2:求最小值
  19. @log("您当前正在运行的函数运行的时间是")
  20. def min_num(num1, num2):
  21. print(min(num1, num2))
  22. max_num(10, 20)
  23. min_num(10, 20)
  24. # 您当前正在运行的函数运行的时间是2018-07-28 16:03:41
  25. # 20
  26. # 您当前正在运行的函数运行的时间是 2018-07-28 16:10:42
  27. # 10

 

#5.偏函数
偏函数:将指定的函数和函数中默认的参数进行绑定,生成一个新的函数,比如把int函数和int的默认参数base绑定生成一个新的函数int2,int2此时进行数据转化时按照二进制数据进行转化

  1. import functools
  2. int2 = functools.partial(int, base=2)
  3. print(int2("1000"))
  4. # 8

 

6、类的小函数

(1)isinstance:检查是不是这个对象产生的实例,返回布尔值   isinstance(a,b)

(2)issubclass:检查一个类是否是另一个类的子类,返回布尔值 如上


魔法函数:形如__xx__的函数即为魔法函数

(3)__init__    初始化函数(构造函数)

Python的类中可以有很多个构造函数,但是最后一个构造函数会覆盖掉上面的构造函数,所以,只有最后一个init函数有效。

__new__是一个静态函数,并且至少需要传递一个参数cls。cls表示需要实例化的类。此参数在实例化时由Python解释器自动提供。另外,实例化对象时,__new__在__init__方法之前调用。有个比较形象化的比喻:__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工、初始化商品环节。

  1. class Demo(object):
  2. def __init__(self):
  3. print('__init__() called...')
  4. def __new__(cls, *args, **kwargs):
  5. print('__new__() - {cls}'.format(cls=cls) )
  6. return object.__new__(cls, *args, **kwargs)
  7. if __name__ == '__main__':
  8. de = Demo()
  9. 输出结果为:
  10. __new__() - <class '__main__.Demo'>
  11. __init__() called...

利用__new__函数可以实现一个简单的单例模式


补:

我们在查看一些项目时,常会发现一个__init__.py文件,

  • __init__.py的在文件夹中,可以使文件夹变为一个python模块,python的每个模块对应的包中都有一个__init__.py文件的存在
  • 通常__init__.py文件为空,但是我们还可以为它增加其他的功能,我们在导入一个模块时候(也叫包),实际上导入的是这个模块的__init__.py文件。我们可以在__init__.py导入我们需要的模块,不需要一个个导入
  • _init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:from PackageName import *,这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如:#文件 __init__.py中__all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]

(4)__doc__    文档,也就是获取类的注释文档

注意它只返回第一个三对单引号或三对双引号的类的注释文档。

 

(5)__dict__:

以字典的形式返回类的属性及其值,属性和值构成键值对。

如果是 对象.__dict__ 的话返回的是属性和值的字典

如果是 类.__dict__ 的话返回的是类中所有的内容,包括属性、方法

甚至注释文档等。

(6)__call__

实例化对象()自动调用类中的__call__方法,如果类中没有__call__函数的话,实例化对象()这样使用会报错

(7)__str__ 和 __repr__

其实简单来说

__str__是给人看的

__repr__是给机器看的,但是总的来说repr的优先级比str要高,因为str只能给人看,而repr既能给机器看也能给人看。

所以平时尽可能的使用repr。

》示例1

  1. ###case 1
  2. class person:
  3. def __init__(self,fname,lname):
  4. self.fname=fname
  5. self.lname=lname
  6. p=person("san","zhang")
  7. print(p) ###得到一个实例对象及地址
  8. p ###得到是一个实例对象及地址
  9. ###case 2
  10. class person:
  11. def __init__(self,fname,lname):
  12. self.fname=fname
  13. self.lname=lname
  14. def __str__(self):
  15. return "fnmae:%s,lname:%s"%(self.fname,self.lname)
  16. def __repr__(self):
  17. return "fnmae:%s,lname:%s"%(self.fname,self.lname)
  18. p=person("san","zhang")
  19. print(p) ###由于__str__函数,正常显示
  20. p ###由于__repr__函数,正常显示
'
运行

》示例2

》示例3:常用魔法函数:

  1. class DictDemo:
  2. def __init__(self,key,value):
  3. self.dict = {}
  4. self.dict[key] = value
  5. def __getitem__(self,key):
  6. print("2222")
  7. return self.dict[key]
  8. def __setitem__(self,key,value):
  9. print("3333")
  10. self.dict[key] = value
  11. def __len__(self):
  12. print("4444")
  13. return len(self.dict)
  14. dictDemo = DictDemo('key0','value0')
  15. print(dictDemo['key0']) #value0
  16. dictDemo['key1'] = 'value1'
  17. print(dictDemo['key1']) #value1
  18. print(len(dictDemo)) #2
  19. ######与c不同,python在声明一个类的对象的同时,可以对对象直接进行一些操作,然后自动调用类内的魔法函数。
'
运行

 

参考链接:

https://blog.csdn.net/w18211679321/article/details/81262221(Python基础之特殊函数类型)

https://blog.csdn.net/ziteng_du/article/details/78825913(Python基础13——python和类相关的几个函数及几个特殊函数)

https://www.cnblogs.com/jiameng991010/p/11257918.htmlPython学习8——魔法方法、特性和迭代器

https://www.cnblogs.com/xie-y/p/8744133.html魔法方法、特性和迭代器

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/894325
推荐阅读
相关标签
  

闽ICP备14008679号