Python函数(一):函数的声明、调用以及参数的使用

目录

为何要用到函数

函数的定义和调用

函数的参数

参数的传递

参数的类型 

return语句


为何要用到函数

通常我们编写一段代码是为了实现特定的功能,比如想得到一段数字序列中的最大值、最小值和平均值并输出一个字典,编写一段代码如下:

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
  • 30
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值