本文是学习总结,学习网站是廖雪峰网站,连接在这:https://www.liaoxuefeng.com/
函数调用
一:函数的调用
<1>普通函数调用
def enroll(name, gender):
print('name:', name)
print('gender:', gender)
def main():
enroll('sarah', 'F')
if __name__ == "__main__":
main()
输出是这个样子的:
name: sarah
gender: F
<2>调用数组
def calc():
global nums #先定义一个全局变量
nums = [1, 2, 3] #然后把数组赋值给变量
def main():
calc()
print(nums[0], nums[1], nums[2])
if __name__ == "__main__":
main()
二:设置默认参数
定义一个enroll函数,它的参数有name,gender,age,city
def enroll(name, gender, age=6, city='Beijing'):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)
定义完函数后,在主函数调用,一个是默认参数调用,一个是更改默认参数调用
<1>当age 和city与默认参数相同时,不需要再设置
def main():
enroll('sarah', 'F')
if __name__ == "__main__":
main()
输出结果为:
name: sarah
gender: F
age: 6
city: Beijing
<2>当与默认参数不符时,提供值覆盖默认参数值:
def main():
enroll('sarah', 'F', 7) #按顺序可以不写参数名
enroll('Adam', 'M', city='TianJin') #不按顺序要写参数名
<3>默认参数需要设置成不变的对象(重要)
错误例子:
def add_end(L=[]):
L.append('END')
print(L)
return L
def main():
add_end([1, 2, 3])
add_end(['x', 'y', 'z'])
add_end()
add_end()
add_end()
if __name__ == "__main__":
main()
输出结果:
[1, 2, 3, 'END']
['x', 'y', 'z', 'END']
['END']
['END', 'END']
['END', 'END', 'END']
从结果中可以看到:当调用函数时传参了,显示的结果是正确的。但是如果直接调用,不传入参数,那数组就会记录上一个数组的值,从而导致结果累加,如结果第三,四,五条所示。
正确例子1:
def add_end(L = []): #也可以让L等于None 即def add_end(L = None):
if L == []: #这里同样要改成None 即if L == None:
L = []
#这里必须是L = [],因为这里是当if满足条件的时候,L的值,这里应该定义L的值,而不能用L=None,会报AttributeError
L.append('END')
print(L)
return L
def main():
add_end([1, 2, 3])
add_end(['x', 'y', 'z'])
add_end()
add_end()
add_end()
if __name__ == "__main__":
main()
输出结果:
[1, 2, 3, 'END']
['x', 'y', 'z', 'END']
['END']
['END']
['END']
除此以外,还可以在错误例子的基础上改主函数,不过有点麻烦,每一个都要改,好处就是可以选择哪些要像错误例子里面那样,把结果叠加起来的,哪些不想把结果叠加起来的,代码如下:
正确例子2:
def add_end(L=[]):
L.append('END')
print(L)
return L
def main():
add_end([1, 2, 3])
add_end(['x', 'y', 'z'])
add_end([])
add_end([])
add_end([])
print("-------------这是一条分割线")
add_end()
add_end()
add_end()
if __name__ == "__main__":
main()
输出结果:
[1, 2, 3, 'END']
['x', 'y', 'z', 'END']
['END']
['END']
['END']
-------------这是一条分割线
['END']
['END', 'END']
['END', 'END', 'END']
以上输出结果可以看到,当在调用函数的时候,每次调用函数都传空数组,相当于重置数组的初始值,所以得到的结果是正确的,如果啥都不传,直接调用,数据就会叠加
三:可变参数
可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个
<1>主函数–没有元素、单个元素或者多个元素传入
def calc(*numbers): #这里的*表示把number改成可变参数,让函数传入的参数个数是可变的。
sum = 0
for number in numbers:
sum = sum + number * number #这里是number乘number
print(sum)
return sum
def main():
calc(1, 2, 3)
calc(2, 3)
calc()
if __name__ == "__main__":
main()
输出结果为:
14
13
0
如果不把calc函数的参数变成可变参数,那么在主函数中调用的时候就要先组装出一个list或者tuple,如下所示
def calc(numbers):
sum = 0
for number in numbers:
sum = sum + number * number
print(sum)
return sum
def main():
calc([1, 2, 3]) #或calc((1, 2, 3))
if __name__ == "__main__":
main()
输出结果为:
14
<2>主函数–数组元素传入
def calc(*numbers):
sum = 0
for number in numbers:
sum = sum + number * number
print(sum)
return sum
def main():
nums = [1, 2, 3]
calc(*nums) # calc(nums[0], nums[1], nums[2])这种方式也可以,只是比较麻烦
if __name__ == "__main__":
main()
输出结果为:
14
<3>关键字参数
关键字参数的作用是:如下代码所示:name和age是必填参数,**kw是选填参数
def person(name, age, **kw): #形参前加'*'和'**'表示动态形参
print('name:', name, 'age:', age, 'other:', **kw)
def main():
person('Michael', 30, city='Beijing')
if __name__ == "__main__":
main()
输出结果为:
name: Michael age: 30 other: {'city': 'Beijing'}