0%

函数的调用

本文是学习总结,学习网站是廖雪峰网站,连接在这: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>当agecity与默认参数相同时,不需要再设置
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'}
<4>
点这里请我吃个小蛋糕吧~~

Welcome to my other publishing channels