关于Python函数
函数(function) 是一种具有特定功能的代码块,如果有大量需要重复使用的功能,可以通过定义函数来快速实现,能够精简代码,提高效率。
函数体的形式在定义 类Class 时是相同的,只是类中的函数被称为“方法”。
函数的定义
函数结构形式如下:
def func(arg):
'''函数注释文档'''
# 函数体结构代码
return xxx
def 是函数的标识,func是自定义的函数名称,arg是函数的输入形参(可以没有),return 表示函数返回值,即函数体执行完后得到的值,也可以没有返回值。
其中函数名后面的()和 冒号是必须要有的。
函数的输入参数
在定义函数时,函数名后的()中可按照需要,写入参数或参数列表作为函数的形参,参与到函数体代码的计算中,而在调用该函数时,讲实际需要计算的实参填入括号中即可调用函数了。
# ex.1
def sum(a=0, b):
'''a, b为形参,a设定默认参数为0'''
res = a + b
return res
# 调用sum函数
# 数字1,2 为实参,代替a,b参与到实际函数计算中
sumdata = sum(1, 2) #
print(sumdata) # 结果为 3
如果函数执行的时候不需要参数,那么在定义和调用中都不需要填写参数。
而且参数可以是多种形式,例如字符串、数字、列表、对象等,只需要保证输入的实参和形参类型对应即可。
关键字参数
在上面的ex.1中调用函数的时候,两个实参位置顺序是确定的,即1代替形参a, 2代替形参b。如果不想对顺序有太多要求的,可以使用关键字参数,即在调用的时候直接指明了实参要指代哪一个形参,如ex.2.
#ex.2
def salay(name, money):
'''name, money为形参'''
print(name)
print(money)
# 直接调用salay函数,并通过形参的关键字赋值
salay(money=3000, name="Tom")
# 输出
Tom
3000
可变参数
在定义函数的时候,如果不确定参数有多少个,可以在前面加个* 号,用来存放所有未命名的参数,如果没有参数,则建立一个空元组。
也可用两个星号** 来标定可变参数,表明可变参数是字典元素,这时调用函数则需要采用如“arg1=value1,arg2=value2”这样的形式(kwargs是key value arguments的简写)。在调用时,参数必须成对出现,并用等号区分键和值,而不能用传统的参数赋值方式,如func(1,3)。
# ex.3
def func(*arg):
for x in arg:
print(x)
func("sunck", "good", "doing", "nice") #依次输出
def mySum( *c ):
sum = 0
for i in c:
sum += i
return sum #函数返回sum的值,跳过后面语句
print(mySum(1,2,3,4)) #求和,输出10
# 可变字典参数
def func2(**kwargs):
print(kwargs)
func2(x=1, y=2, z=3)
#输出
{'x': 1, 'y': 2, 'z': 3}
由此,如果定义的函数是:
def func3(*arg, **kwargs):
pass
就可以接收任意的参数进来了,可以直接把列表或字典作为参数传递其中。
函数的返回
经过函数计算后,将结果返回使用return即可,这里返回的类型也包含列表、对象等多种形式,可以在调用或递归的时候反复传值使用。
另外,函数可以返回多个值,例如:
# ex.4
def multire():
a = 3
b = "第2个返回值"
return a, b
c, d = multire() #分别接收两个返回的值
print(c) # 3
print(d) # 2个返回值
可以看到,利用return返回了多个结果,但是需要注意的是,实际上返回的时候其实还是一个结果(元组),只是在调用时,python自动解包出来其中的元素,所以像是返回了多个值。
编写函数文档
定义函数之后,最好加上注释,这样当项目复杂的时候便于查看,增加函数注释的方式是在def行之后 用 块注释的方法注明,然后就能通过**help(函数名)**的方式快速查看了,如下:
# ex.5
def multi(a,b):
'''
参数:a,b 数值
a: 第一个
b: 第二个
返回: n :乘积
'''
return a * b
help(multi) # 注意函数名后面不带括号
# ===输出===
Help on function multi in module __main__:
multi(a, b)
参数:a,b 数值
a: 第一个
b: 第二个
返回: n :乘积
匿名函数
这是类特殊的函数,即lambda函数,之所以叫匿名函数,就是没有名字,可以理解为用后即焚,用法如下:
sum = lambda num1, num2: num1 + num2
print(sum(1,2))
其中,num1,num2为形参,冒号后面就是函数体,使用方法和函数类似。
函数装饰器
装饰器其实是一个闭包,本质上是一个返回函数的函数,用来对一个函数进行修饰或增加功能而避免对原函数的破坏具体见下。
装饰器格式
被装饰的原函数
def funczero(%x):
语句1
装饰器
def outer(func): #表示对原函数引用
def inner(*args, **kwargs):
#inner中对*args, **kwargs(原函数形参)进行操作
#*args, **kwargs表示可以修改任何参数
添加修改的功能的代码块
func(*args, **kwargs) #再执行func()
return inner
使用
funczero = outer(funczero) #或者在原函数前加一句 @outer
funczero(%x)
# ex.6
def func1(age):
print("Tom is %d years old" % (age))
def outer(func):
def inner(age):
#定义一个inner函数,age小于0时,变成0
if age < 0:
age = 0
func(age)
return inner
#使用方法一,直接在原函数外面加装饰器
func1 = outer(func1)
func1(-4) #是一个函数
#==输出==
sunck is 0 years old
#使用方法二,定义函数式在前面加上 @装饰器名
@outer
def func1(age):
print("sunck is %d years old" % (age))
func1(-5)
#==输出==
sunck is 0 years old
以上是关于Python函数的一些介绍和自己在使用中的一些心得记录,如有问题多多指正,希望能有所帮助~也欢迎点赞关注,谢谢!