目录
一、函数定义与使用
1.函数的定义
函数是组织好的,可重复使用的,用来实现单一或者相关联功能的代码块。通过函数的调用,可以提高代码的复用性,极大降低代码冗余(代码重复)。在python中默认提供有很多自带有的函数,例如print()。同时,函数也支持自定义创建,这也叫做用户自定义函数。
'''
函数的参数传递:
1. 参数可以是任何类型的内容,不同数据类型的数据,或者对象,都可以是入参。
2. 在传递参数时,可以指定参数名传递,也可不指定。若不指定则根据参数的顺序
对入参进行匹配。
3. 在参数定义时,可以设置参数的默认值。
'''
# 带参数的函数定义
def function_demo(a, b, c): # 此处的a,b,c就是函数的参数,也叫做形参。
print(a)
print(b)
print(c)
# 带默认值参数的函数定义
def function_arguments(a, b='默认'): # 此处b参数设置有默认值,在不给b参数传入入参时,
# 使用默认值,传入参数则修改默认值为传入后的值
print(a)
print(b)
# 调用函数,并进行参数的传递
function_demo(1, 2, 3) # 此处的1,2,3表示实参,也是入参。
# 指定参数顺序进行传参:通过指定参数进行传参,可以不遵循形参的顺序。
function_demo(b=1, a=3, c=2)
# 调用带默认值的函数
function_arguments(1) # 不传入b参数值
function_arguments(1, 2) # 传入b参数值,需与默认值保持同一数据类型,否则会提示警告。
2.函数的调用
函数在被定义好后,是需要通过调用函数来使其生效的。不被调用的函数是没有存在意义的。
'''
函数的调用:
1. 调用方式是通过输入函数名加上括弧号进行调用。
2. 函数在调用时,若需要传入参数,默认情况下,参数值与参数名称是按照函数声明中所定义的顺序匹配起来的。所以传入参数的个数必须与函数保持一致。
'''
# 无参数版
def hello():
print('hello world!')
# 有参数版
def hello_plus(addr):
print('hello {}!'.format(addr))
# 函数的调用
hello() # 无参数
hello_plus('China') # 有参数
3.函数的进阶调用
函数的进阶调用:函数除去被直接调用以外,也可以被其他函数调用,也就是函数调用函数。一般在处理稍微复杂一些的代码逻辑时,会将部分内容写成函数,再将函数放到另外一个函数中进行调用,达到精简代码与提升维护性的目的。
# 函数调用函数的调用方式与一般调用没有区别。
def hello(addr):
print('hello {}!'.format(addr))
def hello_plus(city):
hello(city) # 函数调用函数
# 函数的调用
hello_plus('CSC')
二、函数参数传递
python中,传递函数的参数其实就两个:args和**kwargs
所有的函数在进行参数传递的时候,都会把参数变更为args和kwargs
*args表示元组的传递,可以接收无限制长度的参数
kwargs表示字典的参数传递,可以接收指定key的字典格式的数据内容
*args表示不定值不定长传参
**kwargs表示定值不定长传参
*和**是什么时候需要解包什么时候用。
定值和不定值: 定值:(name='hzp') 不定值:('hzp')
'''
*args与**kwargs的参数传递机制:
正常的函数参数,一般会有不定数量。也就是一个到多个参数不等。在python中,可以通过*args和**kwargs来实现参数的传递。
1. *args表示任意多个无名参数,通过元组的形态进行传递,根据函数参数的顺序依次匹配元组中的每一个元素,一般情况下元组长度必须与参数数量保持一致。
此类传递参数的方式,可以在调用函数时非常灵活将所有参数一次性传入,不用再一个个指定。便于函数调用的拓展使用。也就是所谓的不定值不定长传参模式。
2. **kwargs表示关键字参数。通过字典的kv格式进行传入参数,所有传入的参数都会遵循key=value的格式,根据函数的形参名逐一匹配字典的key,将对应value进行传参,一般情况下字典的key必须与形参相同
此类传递参数的方式,可以在调用函数时快速基于形参名将所有的参数一次性赋值。也就是所谓的定值不定长传参。
'''
# 带参数的函数定义
def function_demo(a, b, c): # 此处的a,b,c就是函数的参数,也叫做形参。
print(a)
print(b)
print(c)
# 调用函数的两种传参方式
function_demo(*(1, 2, 3)) # *表示调用*args传参,python会自行将元组解包,每一个元素都会一一匹配变成参数。
function_demo(**{
'a': 3,
'b': 2,
'c': 1
}) # **表示调用**kwargs传参,python会基于字典的kv对自行匹配函数的每一个参数。
三、return与global
1.return关键字
虽然在函数中,return关键字一般表示函数的结束,但是在函数的代码逻辑编写时,考虑到各类逻辑场景的处理,所以一个函数中有时候也会包含有多个return关键字,但不管有多少return关键字,函数在实际运行时,都会在调用第一次return关键字时结束函数的运行。
# 复杂一些的return关键字调用
# 在整个函数中,根据num的值来进行不同的判断,return对应的结果内容。
def return_function(num):
if num == 1:
return '这是int'
elif num == 'str':
return '这是str'
elif num == 'dict':
return '这是dict'
else:
return '这啥也不是'
# 更为复杂的return关键字调用:在一个死循环中定义return,当运行return时,函数结束,死循环也会同步结束。
def return_function_plus():
i = 0
while True:
print('现在是更为复杂的应用')
if i == 4:
return 'bingo!'
i += 1
2.global关键字
定义函数时,一般函数的操作是无法修改函数外的变量值。
如果想通过调用函数来修改函数外变量的值,则需要在函数中将该变量声明为global变量,
也就是全局变量。
在函数中声明之后,则可以改变它的值。
'''
函数外的变量不会因为函数运行对其进行的操作而修改变量本身的值。如果想要实现修改的效果,则需将变量声明为全局变量才可。
'''
a = 8
def plus():
global a # 定义a为全局变量之后,若对a进行了值的修改,则会影响到函数以外的a变量本身的值。
a = 10
return a + 5
print(a) # 函数调用前,a = 8
print(plus()) # 调用含有global的函数
print(a) # 函数调用后,a = 10
四、递归函数与匿名函数
1.递归函数
递归函数是一个相对比较绕的概念,但其实和编程语法中的循环差不多。递归函数有两个明确定义,一是函数调用自身函数的行为;二是有一个正确的返回条件,也就是递归终止的条件设置。说白了,和循环一样,需要设置一个循环结束的条件。不然容易造成死循环。
因为递归相比较普通的函数以及循环语法而言,会更加占用内存资源。所以一般只会在特定场景下进行使用,解决相对复杂的计算逻辑。
'''
递归函数:
函数调用函数本身的一种形态。函数的定义就是用来调用的,
可以被其他函数调用,自然也可以被自己调用。
只是因为函数本身的逻辑会更加复杂,所以递归函数在使用
时会造成更多的资源占用。一般只是用于处理特定的算法
'''
# 非递归函数
def multiplication(n):
num = n
for i in range(1, n):
num = num * i
return num
# 递归函数
def multiplication_plus(n):
if n == 1: # 正确的结束条件定义
return 1
else:
num = n * multiplication_plus(n - 1) # 调用自身函数的行为
print(num) # 如果你算晕了可以加上print(),实时查看num值在每次被调用时的变化
return num
# 普通函数的调用
print(multiplication(5))
# 递归函数的调用
print(multiplication_plus(5))
2.匿名函数
在python语法中,除去标准格式下定义的函数以外,还有使用lambda关键字来创建的匿名函数。通常情况下,主要应用于需要一个函数,但又不想费神去专门定义一个函数时,作为一次性使用的一句话函数。
'''
1. lambda匿名函数不需要通过def来进行定义,本身只是一个表达式,比常规函数要简单很多
2. lambda的主体基本只有一行代码,而不是一个代码块,所以能实现的逻辑非常有限,只用于简单的代码逻辑
3. lambda函数虽然看起来简单许多,但是除了调用与一般函数有区别外,其他基本一致。比如说函数内与函数外相互独立,数据不互通等。
'''
# 匿名函数示例
x = lambda a: a + 10 # 定义一个匿名函数,要求传入参数a,函数体为计算a+10,将此函数赋值到x
print(x(10)) # 调用匿名函数
y = lambda a, b: a + b # 定义一个多参数的匿名函数,将此函数赋值到y
print(y(2, 3))