首页 > 编程语言 >Python函数(一):函数的声明、调用以及参数的使用

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

时间:2024-04-03 19:29:05浏览次数:24  
标签:调用 函数 Python max num 参数 print def

目录

为何要用到函数

函数的定义和调用

函数的参数

参数的传递

参数的类型 

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

标签:调用,函数,Python,max,num,参数,print,def
From: https://blog.csdn.net/a4546565/article/details/137225412

相关文章

  • 【进来一起刷Java题】Java中使用空对象引用调用静态方法的奇特现象 附题目+解析 | ((Te
    目录一、题目二、解析三、答案:一、题目有关下述Java代码描述正确的选项是____。答案直接点目录里的跳转。publicclassTestClass{  privatestaticvoidtestMethod(){    System.out.println("testMethod");  }  publicstaticvoidmain(Str......
  • Python 使用matplotlib创建各种静态、动态、交互式和3D图表的功能
    在Python中,你可以使用各种库来创建和显示图表。其中,最常用的库之一是matplotlib,它提供了创建各种静态、动态、交互式和3D图表的功能。另一个流行的库是seaborn,它基于matplotlib,并提供了更高级别的界面,用于绘制有吸引力的统计图形。以下是一个使用matplotlib创建并显示简单折线......
  • Python环境下基于小波分析的Linear电磁谱降噪
    小波变换以其良好的时频局部化特性,成功地解决了保护信号局部性和抑制噪声之间的矛盾,因此小波技术在信号降噪中得到了广泛的研究,并获得了非常好的应用效果。小波降噪中最常用的方法是小波阈值降噪。基于小波变换的阈值降噪关键是要解决两个问题:阈值的选取和阈值函数的确定,目前常......
  • Python中处理JSON字段时,和如何将Python对象转换为JSON字符串
    在Python中处理JSON字段时,通常使用内置的json模块。这个模块允许你将Python对象转换为JSON字符串,以及将JSON字符串解析为Python对象。以下是一些常见的JSON字段处理操作:1.将Python对象转换为JSON字符串python复制importjson#定义一个Python字典data={  "name"......
  • 软测WebUI Python安装selenium模块失败,用VSCode安装成功
    Dos命令行下Python安装selenium模块失败,安了python,pip也好着呢,安装失败,网上没有查到类似报错。  报错还有一些,截图不全使用vsc安装selenium模块,成功了。  ......
  • 浮点数转定点数(自编函数)
    方法:1、计算b=a*2^F,其中F是变量的分数长度,b是用十进制表示的。2、将所得b的值四舍五入到最接近的整数值。3、将(2)所得的b从十进制转换为二进制表示,并命名为新变量c。4、现在,假设c,需要n位来表示二进制中b的值。另一方面,通过模拟得到了W和F的值。所以W的值应该是等于或大于n。如果为......
  • 2、excel的循环查找vloopup函数
    excel的循环查找vloopup函数1、基本语法vloopup(查找值,数据表,显示列,匹配方式)=vloopup(A1,H2:G5,1,0)匹配方式:0为精准匹配,1为模糊匹配2、实例1ABCDE2小米12小红=vloopup(D1,A2:B5,1,0)3小花134小红145小明15=vloopup(D1......
  • Python实现【贪吃蛇大作战】+源码
    文章目录前言:一、游戏概述1.游戏玩法2.游戏特色二、游戏规则三、工具选择四、主要技术pygame库numpy库cocos2d五、源码分享六、项目地址前言:今天的GitHub小游戏分享,我们将聚焦于一个经典而又极富趣味性的游戏——贪吃蛇大作战。这款游戏不仅考验玩家的反应速度......
  • 欧拉函数
    一、性质求欧拉函数fromcollectionsimportCounter#证明:容斥原理#f(N)=N*(1-1/p1)*(1-1/p2)*...*(1-1/pn)#与N互质的数的个数:N-N/P1-N/P2-...-N/Pn+N/(p1p2)+...+...-...defcal_euler(x):ans=xcnt=Counter()i=......
  • 安装Ray包,Python降版本
    平常安装ray包使用的是:1pipinstallray然而今天在安装了新的Anaconda之后安装ray包提示:1ERROR:Couldnotfindaversionthatsatisfiestherequirementray(fromversions:none)2ERROR:Nomatchingdistributionfoundforray参考了Ray的documentation:https:......