很久没更新了,抱歉。最近一段时间忙着对付各种考试,现在总算是考完了,继续来聊聊Python。Python中的函数使用def关键字定义,这个大家都知道,而且Python中函数的定义很灵活,什么位置参数、关键字参数、默认参数、可变参数等等一大堆,而且经常听到的匿名函数又是什么,还有个装饰器、闭包,这些又是什么,我们来详细的讲一讲函数。
函数是一等对象
在Python中,函数就是对象,你可以直接把一个函数赋值给变量,作为参数,或者在函数中返回(这样的函数叫做高阶函数),像下面这样:
# 计算斐波那契
deffactorial(n):'''returns n!'''return1ifn
# 把函数赋值给一个变量
fac = factorialprint(fac(5))
# 作为列表推导式的参数
d = [fac(n)forninrange(6)]print(d)
a = ['sd','sdsd','sdsdssd','s']
# len是python内置的函数
# 直接作为参数
# 对a中的数据按长度大小排序
print(sorted(a, key=len))
120[1, 1, 2, 6, 24, 120]['s', 'sd', 'sdsd', 'sdsdssd']
python中也有匿名函数,不过功能很受限制。python中匿名函数除了作为参数传给高阶函数之外,很少使用到。高阶函数是指那些参数是函数或者返回结果是函数的函数。来看个匿名函数的例子:
a =lambdaa, b: a+b
# 传入参数
a(1,2)
3
可调用对象
可调用对象说的是一个对象可以使用调用,像这样:
# min是内置函数,函数是对象
min([2,34,])
fromdatetimeimportdatetimedatetime.now()
datetime.datetime(2018, 1, 3, 20, 39, 12, 160257)
在Python中,方法、函数、类都是可调用对象,如何让那些不可调用的对象(比如类的实例)变成可调用的?方法是实现call内置方法。我们之前写过一类计算向量的类vector,原来的代码中没有定义call方法:
classVector:
def__init__(self, x=, y=): self.x = x self.y = y
# 真假值,如果向量模为0,返回falsedef__bool__(self):
returnbool(abs(self))
# 实现向量加法def__add__(self, other): x = self.x + other.x y = self.y + other.y
returnVector(x, y)
# 实现向量乘法,例如r*3def__mul__(self, scalar):
returnVector(self.x*scalar, self.y*scalar)
# 返回向量的模# hypot()返回欧几里德范数 sqrt(x*x + y*y)def__abs__(self):
returnhypot(self.x, self.y)
# 实现__repr__方法,在控制台打印向量时会输出Vector(1, 2)# 实现__str__,使用str()返回字符串def__repr__(self):
return'Vector(%r, %r)'% (self.x, self.y)
v = Vector(2,3)
# 我们希望v像Vector一样可以传入参数
# 会报错
v(2,3)
TypeError: 'Vector' object is not callable
出错的原因是因为变量v是不可调用的,它只是Vector类的实例而已。实现call方法之后再来试试:
# 只列出__call__部分的代码
'''def __call__(self, x, y): return Vector(x, y)'''
v = Vector(2,3)
# 现在就可以调用啦
print(v(3,4))v2 = v(3,4)v3 = v(5,4)print(v2+v3)
Vector(3, 4)Vector(8, 8)
就先说这些,装饰器和闭包的内容过于繁琐,下篇文章再讲。
本文来自企鹅号 - 码上就来媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文来自企鹅号 - 码上就来媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。