文章目录
5.1 函数的定义和调用
1.函数的定义
函数是为了解把会重复使用的代码定义成一个对象,在复用的时候可直接调用。
- def 函数名(形参) 函数名的命名等同变量命名规则。
- 函数执行的代码以冒号起始,并且缩进。
- return函数终止执行,并返回结果,没有return返回None。
def func(n1): # 函数执行的代码以冒号起始,并且缩进。
"函数_文档字符串" # 函数说明文档
return n1+10,n1 # 返回值可以是任意类型,如有逗号,会转换成元组
print(n1) # 遇到return就会立即退出函数(在循环中也会终止函数)
func(10) # return结果需要传递给变量
res = func(10)
print(res) # (20, 10)
2. 函数名调用
- 调用过程中会执行print,如有return返结果。没有默认是None。
- help ,查看说明文档。
def func(n1):
print(n1+10) # print在函数调用执行过程中输出内容
print(n1)
res = func(10) # 调用函数,会执行打印
print(res) # 如果函数中没写return,则默认返回None
- 函数名是可哈希的,可作为集合元素或字典的键等。
- 函数赋值给一个变量后,这个变量也具有了此函数的功能
def func():
return 123
cond_dict = {
"函数":func}
num = cond_dict['函数']
num() # 123
- 函数名也可当成对象,从另一个函数中返回出来而去构建高阶函数,比如:参数是函数、返回值是函数。
- 函数名做另一个函数的参数
def plus(num):
return num + 100
def handler(func):
res = func(10) # 110
msg = "执行func,并获取到的结果为:{}".format(res)
print(msg) # 执行func,并获取到的结果为:110
# 执行handler函数,将plus作为参数传递给handler的形式参数func
handler(plus)
- 函数名做另一个函数的返回值
def plus(num):
print(num + 100)
def handler():
print("执行handler函数")
return plus
result = handler()
data = result(20) # 120
print(data)
- 同时为参数和返回值
def f1():
print(123)
def f2(arg):
ret = arg()
return f1
v1 = f2(f1) # 在return之前先运行了f1,所以过程中打印了123
v2 = v1() # f2 返回f1 所以v2现在指向f1()
print(v2)
3. 函数修饰器
- 函数修饰器是一种特殊的语法,用于在不修改原始函数定义的情况下,通过@函数修改或增强函数的行为。(批量操作会更有意义)
- 修饰器本身是一个函数,它接收一个函数对象作为参数,并返回一个新的函数对象或一个可调用对象。
- 修饰器以 @ 符号开头写在函数定义的上方,多个修饰器可以叠加使用。
def my_decorator(func):
def wrapper():
print("Before the function is called.")
func()
print("After the function is called.")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
say_hello.__name__ # 'wrapper'
- functools.wraps能 传递.__name__和.doc。
import functools
def outer(origin):
@functools.wraps(origin) # 传递函数名称和注释
def inner(*args, **kwargs):
# 执行前需执行的代码
res = origin(*args, **kwargs) # 调用原来的func函数
# 执行完成需执行的代码
return res
return inner
@outer # func = outer(func)
def func():
pass
func.__name__ # func
5.2 函数的参数
Python 的函数具有非常灵活多样的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。从简到繁的参数形态如下:
形参与实参:当一个函数被调用时,实参的值被赋给对应的形参,并作为函数内部变量来使用。
def greet(name):
print("Hello, " + name + "!")
greet("Alice")
在这个例子中,name 是 greet() 函数的形参,而 “Alice” 是传递给函数的实参。当函数被调用时,“Alice” 被赋值给 name,并在函数体内输出 “Hello, Alice!”。
1. 位置参数
- 按照顺序依次传递的参数,在函数内部可以通过对应的参数名来访问。
- 位置传参的实参个数不多不少,依次传参。
2. 关键字参数
用于函数调用,通过“键-值”形式加以指定。可以让函数更加清晰、容易使用。
Python 允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
- 通过名称来指定传递给函数的参数,不需要按照定义顺序传递。
- 可以和位置参数混合使用,但必须在位置参数之后。
def print_hello(name,age,sex):
print('Name:%s Age:%d Sex:%s' %(name,age,sex))
print_hello('male',19,'lili') # Name:male Age:19 Sex:lili
print_hello('lili',sex='male',age=18) # Name:lili Age:18 Sex:male
3. 默认参数
- 用于定义函数,为参数提供默认值,调用函数时可传可不传该默认参数的值,如果不传就取定义时候的值,传了改变为新的值.
- 默认参数的值通常应设为不可变类型。默认值是可变类型时,执行函数会修改默认值。
def print_hello(name,age,sex = '女' ):
#sex = '女' 为默认参数
print('Name:%s Age:%s Sex:%s' %(name,age,sex))
print_hello('Muse',26,'男')
4. 可变长度的参数
- 可变长度的位置参数
在位置参数的最后一个形参名前加*,溢出的位置参数都会被接收,以元组的形式保存下来赋值给该形参
def foo(x,z=1,*args): #在最后一个形参名args前加*号
print(x,z,args)
foo(1) # 1 1 ()
foo(1,2) # 1 2 ()
foo(1,2,3) # 1 2 (3, )
- 可变长度的关键字参数
- 在最后一个形参名前面加**,调用函数时,溢出的关键字参数都会被接收,以字典的形式保存下来赋值给该形参。
- 多个形参时,顺序必须是:位置参数、默认参数和可变位置参数、关键字参数。
def func