本节重点
- 函数的定义
- 局部变量与全局变量
- 调用函数的传参方式
- 不定长参数
- 缺省参数
- 函数参数的高级使用
- 函数的嵌套
一、函数的定义
定义:
某一功能的代码实现,可以降低代码冗余,达到对代码进行复用的目的。
注意
函数名不要和已有函数、变量相同,要见名知意,参考变量的命名规范,同名情况会覆盖。
基本形式:
def function(parameter1,parameter2):
'''
parameter1,parameter2为形式参数,一般称为形参
'''
process
# 调用函数
function(p1,p2) # p1,p2一般称为实参
带返回值的形式:
def get_sum(nums):
'''
通过return 带数据返回函数的调用处
'''
sum = 0
for i in nums:
sum = sum + i
return sum
nums = [1,2,3,4]
result = get_sum(nums)
# 还有一种形式,指定参数与返回值得类型
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
'''
参数与返回值的类型都被指明,其中参数self表示这是一个类内的方法
'''
for value in nums:
if value >= target:
return nums.index(value)
elif nums.index(value) == len(nums)-1:
return nums.index(value) + 1
函数的调用顺序
定义函数时不会执行函数体内的代码,必须调用后才会开始执行。调用时程序会返回到函数的定义处,执行函数体里面的代码,执行完毕返回调用处。可结合断点查看程序运行的顺序。
二、局部变量与全局变量
定义
局部变量:在函数内定义的变量叫做局部变量,只能在函数中使用。
def show():
num = 1
print(num)
print(num) # 失败,局部变量生命周期仅在其定义的函数内
全局变量:在函数外定义的变量,可以在不同的函数中使用
num_global = 1
def show():
num_global = 2
print(num_global)
show()
print(num_global)
'''
2,1
结果与预期不符,函数没有对全局变量进行修改
'''
注意!:这里不叫给全局变量num_global修改值,这里相当于定义了一个局部变量num_global = 2,只不过其与全局变量重名
那么如何使用函数修改全局变量呢?
# 要真正修改全局变量,需要关键字global
num_global = 1
def show():
global num_global
num_global = 2
print(num_global)
show()
print(num_global)
三、调用函数的传参方式:
1、位置传参
调用函数传参时,不需要指明形参,直接输入实参按照顺序分配给形参
def show(name,age):
print(name,age)
show("syp",18)
show(18,"syp")
'''
syp 18
18 syp
'''
位置传参的局限,必须按照形参规定的顺序传,否则就与形参意义不符。
2、关键字传参
可以不按照形参的顺序进行传参,需要指明实参与对应形参
def show(name,age):
print(name,age)
show(age = 18, name = "syp")
'''
syp 18
'''
必须使用关键字传参的形式:
# *后面要求必须使用关键字传参,之前的无所谓,可以使用位置传参
def callable(address,*,name,age):
print(address,name,age)
callable("Beijing",name = "syp", age = 20)
3、能不能混用?
其实是可以的,只不过要按照先位置传参后关键字传参的方式,而且要要和形参名对应起来,混用的一般比较少。
def show(name,age):
print(name,age)
show("syp",age = 19)
show(name="syp",18) # 报错,告知位置传参不能在关键字传参后面
show(18,name = "syp") # 报错,告知name被赋予了两个值,形参名没对应
四、不定长参数
1、不定长位置参数:
调用函数时不确定函数参数的数量:0个或多个均可。规定了只能以位置传参调用。
def sum_num(*args):
'''
在()中使用*args来代表,使用不定长位置参数,可以不叫args但是一般约定都这么命名
传入的位置参数封装到args元组中
'''
print(args, type(args))
sum = 0
for value in args:
sum += value
return sum
sum_num(1,2,3,4)
'''
(1,2,3,4)<class 'tuple'>
'''
不定长位置参数的使用
在两个函数间连续传递不定长位置参数,会出现对元组的再包装,可使用*拆包args元组。
# 不定长位置参数的使用
def show_msg(*args):
print(args)
def show(*args):
print(args,type(args))
show_msg(args)
show(1,2)
'''
(1, 2) <class 'tuple'> 对元组(1,2)再包装,包为新的元组
((1, 2),)
'''
# 如果想继续以(1,2)的方式向下传,需要把元组拆开
def show_msg(*args):
print(args)
def show(*args):
print(args,type(args))
show_msg(*args) # 区别,添加一个星号
show(1,2)
'''
(1, 2) <class 'tuple'>
(1, 2)
'''
2、不定长关键字参数:
调用函数时不确定函数参数的数量:0个或多个均可。规定了只能以关键字传参调用。
def show_msg(**kwargs):
'''
一般命名为kwargs,前面加两个*号,表示使用不定长关键字参数
传入的关键字参数封装到kwargs字典中
'''
print(kwargs, type(kwargs))
for key ,value in kwargs.items():
print(key,value)
show_msg(a = 1, b = 2)
'''
{"a":1,"b":2}<class 'dict'>
a 1
b 2
'''
不定长关键字参数的使用
在两个函数间连续传递不定长关键字参数,会出现对字典的再包装,形成嵌套字典可使用**拆包kwargs字典。
# 不定长关键字函数的使用,类比以上不定长位置参数使用的例子
def show_msg3(**kwargs):
print(kwargs)
def show3(**kwargs):
# 拆包方式,不加**则为嵌套字典
show_msg3(**kwargs)
show3(a=1,b=2)
五、缺省参数
在函数定义时就有默认值,可以重新赋值进行覆盖。
def sum(num1,num2 = 2):
'''
num1是必选参数,缺省参数必须放在必选参数后面
'''
return num1+num2
print(sum(1,5))
print(sum(1))
'''
6
3
'''
六、函数的高级使用
混合了各种参数的情况:必选参数,不定长位置参数,不定长关键字参数
def show(name,age,*args,**kwargs):
'''
必选参数,不定长位置参数,不定长关键字参数
'''
print(name,age,args,kwargs)
#规范:位置传参必须在关键字传参前面,不定长放在最后面
show("syp",18,1,2,3,4,a = 1,b = 2)
#这种方式也可以,但是不常用,这里name和age必须使用关键字传参,否则使用位置传参会被归类到args中
def show(*args,name,age,**kwargs):
print(name,age,args,kwargs)
show(1,2,3,name = "syp",age = 18, a = 1,b = 2)
'''
syp 18 (1, 2, 3, 4) {'a': 1, 'b': 2}
syp 18 (1, 2, 3) {'a': 1, 'b': 2}
'''
七、函数的嵌套
在函数中再定义一个函数,新定义函数只能在旧函数中调用。如果想在外部使用,需要在调用旧函数时将新函数名返回,在外部承接函数名后,再进行调用。
示例:
'''
函数嵌套:在函数中再定义一个函数
'''
def callable():
def test():
print("I'm a function")
test()
callable()
# 想在外部直接调用test
def callable1():
def test():
print("I'm a function")
return test
test = callable1()
test()
'''
I'm a function
I'm a function
'''
网友评论