目录
为何要用到函数
通常我们编写一段代码是为了实现特定的功能,比如想得到一段数字序列中的最大值、最小值和平均值并输出一个字典,编写一段代码如下:
num = [96, 85, 69, 82, 52, 99, 72]
max_num = max(num) #求解最大值
min_num = min(num) #求解最小值
mean_num = sum(num)/len(num) #求解平均值
dict1 = {'max': max_num, 'min': min_num, 'mean': "%.2f" % mean_num}
print(dict1) #输出为{'max': 99, 'min': 52, 'mean': '79.29'}
但如果之后有多个列表需要进行以上操作,需要反复使用该段代码,让文件的语句量非常长,如果在编写大型程序的时候会更麻烦,显然我们更希望能用一行语句反复调用上述代码,这就需要用到函数。
函数的声明和调用
在python中,声明一个函数的格式如下:
def 函数名(参数1, 参数2 ...):
<函数体>
由此我们可以将上面的代码抽象成一个函数。
def function1(num):
max_num = max(num) #求解最大值
min_num = min(num) #求解最小值
mean_num = sum(num)/len(num) #求解平均值
dict1 = {'max': max_num, 'min': min_num, 'mean': "%.2f" % mean_num}
print(dict1)
以上我们只是给函数起了个名字,然后将功能代码原封不动复制了进去,但如果有一段新列表需要实现求解最大最小和平均值,只需要调用这个函数:
num1 = [92, 30, 100, 89, 70, 97]
function1(num1) #调用函数
#输出结果为{'max': 100, 'min': 30, 'mean': '79.67'}
调用一个函数只需要给出函数名和其需要的参数即可。
函数的参数
有些函数需要从外部传递一些基本信息才能实现特定的功能,所以需要用到参数。比如上述代码求解平均值,就需要以参数形式传递给函数一个列表信息。函数可以有多个参数,比如定义一个输出最大值的函数:
def max1(a, b):
if a>b:
print(a)
else:
print(b)
max(5, 10) #输出结果为10
函数也可以没有参数:
def say_Hello():
print("Hello!")
say_Hello() #输出结果为Hello!
参数的传递
函数如何对传递进来的参数进行修改,如下代码所示,此时赋予变量a的值为数字类型。
a = 10
def func1(x):
x = 20
print(x)
func1(a) #输出结果为20
print(a) #输出结果为10
从结果可以看出,变量a作为参数传递到函数中,对其值进行“修改”后,a的值并没有发生改变。这是因为在调用该函数时,a的值传给了局部变量x并存储在函数的局部作用域内,并不影响函数外的变量,就算把func1函数的参数x改成a也是一样的结果。
然而,如果赋予变量a的不是数字而是列表,代码的运行结果会如何?
a = [1, 2, 3, 4]
def func2(x):
x[0] = 0
print(x)
func2(a) #输出结果为[0, 2, 3, 4]
print(a) #输出结果为[0, 2, 3, 4]
可以看到,在函数内部修改了变量x,但函数外的变量a也发生了改变。变量a的数据类型不同导致了不同的结果。
为了方便理解,将python的参数传递分为不可变类型和可变类型两种情况。数字、字符串、元组本身是不可以修改的(只能进行替换),称为不可变类型;列表、字典等可以进行修改的对象被称为可变类型。
在进行不可变类型的参数传递时,在函数内对参数进行“修改”,本质上是一种替换。首先将变量a的值10传递给函数内的变量x,再对函数内的变量x进行修改,两者是指向不同的对象(在python中任何数据类型都是对象),也就是相互独立的。在函数执行结束时,函数作用域内的变量x将会被释放掉。
在进行可变类型参数传递时,实际上是将函数的参数作为传递过来的参数的引用,类似于C++的引用传递,两个变量a和x指向的是同一个对象,所以在函数体内对x进行修改,变量a也就相应产生了变化。
参数的类型
在函数名后的参数中,只给出了参数名并彼此用逗号隔开,即为位置参数。
顾名思义,当调用函数时参数需要按声明函数时的排列顺序传入,而且数量也要保持一致。如果顺序不一致可能会导致不同的输出结果,甚至会报错,数量不一致也会报错。
def printwords(a, b, c):
print(a, b, c)
printwords('boys', 'and', 'girls')#输出结果为boys and girls
printwords('girls', 'and', 'boys')#输出结果为girls and boys
当函数的参数过多时,记住参数的传递顺序可能会很困难,可以使用关键字参数。
使用关键字参数的方法很简单,只需要在调用函数时额外指出参数的名称,此时就可以不需要按顺序传递参数:
def printwords(a, b, c):
print(a, b, c)
printwords(a = 'boys', c ='girls', b = 'and')#输出结果为boys and girls
这样做有另一个好处,在调用函数时能够清楚每个参数的作用,也能让别人更容易看懂你的代码。
还是同样的问题,当函数的参数很多时,有些参数往往都是被传递进来相同的值,也就是大多情况下都属于一种默认值的情况(比如上面的参数b),想在调用函数时省略掉该参数,就要用到默认参数。
使用默认参数只需要在声明函数时进行一些小修改,默认参数放到参数最后:
def printwords(a, c, b = 'and'):
print(a, b, c)
printwords('boys', 'girls')#输出结果为boys and girls
默认参数和关键字参数也是可以结合使用的,但这种情况下所有的位置参数必须事先指定。
当输入的参数数量超过声明时的参数数量,需要用到不定长参数。
在参数前加一个星号( * ),参数将以元组的形式导入,如果加两个星号( ** )将以字典形式导入。
def score_avg(name, *grades):
avg = sum(grades)/len(grades)
print(f"{name}\'s average score is {avg:.2f}")
score_avg('Li Hua', 98, 95, 89, 99, 99, 96)
score_avg('Alice', 82, 72, 75, 76)
以上为一个求解平均成绩的函数,成绩的数量不确定,此外还要输入一个关于姓名的字符串,分别求解Li Hua和Alice的平均成绩,代码运行结果为:
Li Hua's average score is 96.00
Alice's average score is 76.25
使用两个星号时,需要配合使用关键字参数。
def printwords(x, **y):
print(x)
print(y)
printwords('Hello', a = 'World', b = '!')
'''
输出结果为
Hello
{'a': 'World', 'b': '!'}
'''
如果单独出现星号,星号后的参数必须以关键字形式传入。
def printwords(x, *, y, z):
print(x, y, z)
printwords('Hello', y = 'World', z = '!') #输出结果为Hello World !
return语句
return表示函数运行的结束,并返回一个值或表达式。Python中的函数可以有多个return语句,也可以省略return语句,省略时函数默认返回None。
def add1(a, b):
return a + b
print(3, '+', 4, '=', add1(3, 4)) #输出结果为3 + 4 = 7
函数里也可以有多个return语句,用来返回不同情况的结果:
def max1(a, b):
if a > b:
return a
else:
return b
print(max(3, 4)) #输出结果为4
标签:调用,函数,Python,max,num,参数,print,def
From: https://blog.csdn.net/a4546565/article/details/137225412