【Python】初识函数 您所在的位置:网站首页 可变参数和不可变参数 【Python】初识函数

【Python】初识函数

2023-07-09 17:17| 来源: 网络整理| 查看: 265

        前面已经了解过什么是函数,以及函数的用法。这篇文章主要是讲解有关函数的参数,比如什么是实参,什么是形参,以及参数的各种传递方式,如位置传参,关键字传参等。

目录

1.   函数的参数

2. 形参和实参

3. 参数的传递方式

3.1 位置传参

3.2 默认值参数

3.3 关键字传参

4. 可变参数(不定长参数)

4.1 *args

4.2 **kwags

4.3 综合使用

5. 参数解包

1.   函数的参数

函数的参数:在定义函数时,可以在函数名后()中定义数量不等的形参,注意可以有也可以没有,可以有一个也可以有多个,多个形参之间使用逗号隔开,逗号是英文的。

在使用函数的时,有时候函数代码里面有部分需要更改的数据,这个时候可以人为传递参数进去,让函数内拥有这个数据,以便后续的操作。

2. 形参和实参

形参:定义函数时,在函数名后面括号里的变量,也就相当于在函数内部定义了一个变量,这个变量只是一个空的,并没有任何值。

实参:在调用函数时需要写在调用括号里面的具体数值,是我们从外部传递给函数的具体的值,然后通过形参的方式拿到这个值,这个时候形参变量就有值了,也就是外部传递来的值。

def func(a,b): # a,b就是形参 print(a+b) # 打印两个相加的值 func(1,2) # 参数1,2两个实参,一一对应上面a,b ======================== 3 进程已结束,退出代码0

上例中,a,b就是形参,1,2就是实参,通过这种方式实现打印任意两个数相加

那么如果有很多很多形参呢?我们一个一个按着位置来传递,会不会很容易出错呢?答案是肯定的,于是就有了以下的几种参数传递方式:

3. 参数的传递方式 3.1 位置传参

按照位置一个一个进行传递,也就是上面的a,b按照顺序传递

3.2 默认值参数

其实就是提前在形参中把值赋值上去,如下的c就是如此

def func(a,b,c=10): # a,b就是形参 print(a+b+c) # 打印两个相加的值 func(1,2) # 参数1,2两个实参,一一对应上面a,b ========================== 13 进程已结束,退出代码0

如果要更改c的值的话,可以重新传递c的参数

def func(a,b,c=10): # a,b就是形参 print(a+b+c) # 打印两个相加的值 func(1,2,3) # 参数1,2两个实参,一一对应上面a =================== 6 进程已结束,退出代码0 3.3 关键字传参

再传递参数的时候,可以直接指定给什么形参传递实参。

def fun(a,b,c): print(a+b+c) fun(a = 1,c = 2,b = 3) =================== 6 进程已结束,退出代码0

混合使用关键字参数和位置参数的时候,位置参数必须写在关键字参数的前面

实参可以传递任何参数,比如函数:

def adds(a,b,c=10): # a,b就是形参 print(a+b+c) # 打印两个相加的值 def func(fn): fn(1,2,3) func(adds) ======================= 6 进程已结束,退出代码0

我们给func定义了一个fn的形参,然后我们将adds函数对象传递给了这个形参,然后此时,fn就代表adds这个函数对象,然后通过函数调用的方式,执行了adds这个函数

4. 可变参数(不定长参数)

在实际传递参数的时候,我们不知道我们应该传递几个实参,比如要实现任意几个数的和,那么阁下要用什么方式去应对呢?答案当然是可变参数,让参数不限长。以下是两种可变参数:

4.1 *args

写在形参中,意味着可以传递任意几个实参,并且将传递进来的实参保存到一个元组中,这个也叫做装包

def func(*args): print(args) func(1,2,3,4) ============== (1, 2, 3, 4) 进程已结束,退出代码0

其实也可以不使用args,这个名字可以任意,比如*a,*b,只要是符合命名规范,当然在python中,使用args更符合常态

现在实现以下任何多个数的求和吧:

def func(*args): print(sum(args)) func(1,2,3,4) ============== 10 进程已结束,退出代码0

sum():求和函数,接受一个可迭代对象,列表、元组等,但得是数字才行

注意点:

1.带 * 号的形参只能有一个 2.带 * 号的参数可以和其他参数配合使用,但是得写在最后面

当然如果你硬要把*args写在位置参数前面,那也是可以的,但此时,你必须得使用关键字传参了

def func(*args,a,b): print(sum(args)) print(a+b) func(1,2,3,4,a = 5,b = 6) ============================ 11 进程已结束,退出代码0 4.2 **kwags

接受任意关键字参数,将接受到的数据保存为字典

def func(**args): print(args) func(a = 1,b = 2,c = 3,d = 4) =========================== {'a': 1, 'b': 2, 'c': 3, 'd': 4} 进程已结束,退出代码0

注意:**形参也是只能有一个,并且必须写在所有参数最后,他必须得是最后一个,命名潜规则是**kwargs(这个就是必须咯,只能这样写了)

4.3 综合使用

*args 和 **kwargs同时使用: 同时使用*args和**kwargs时,*args必须写在**kwargs之前,因为位置传参必须要写在关键字传参前面,否则,python会识别不出位置传参是要传递给谁,造成了混乱

def func(a,b,c,d): print(a,b,c,d) func(d = 1,b = 2,5,6)

比如这种情况,d和b都传递了值,此时5是传递给c还是a呢,5处于3号位置,但a又在前面,此时python就无法辨别而出现报错

5. 参数解包

传递实参时,也可以在序列类型的参数前添加星号,这样他会自动的将序列中的元素依次作为参数传递

def func(a,b,c,d): print(a,b,c,d) lst = [1,2,3,4] func(*lst) ====================== 1 2 3 4 进程已结束,退出代码0

但是注意,序列中元素的个数必须和函数形参的个数一致

字典类型需要**字典去解包

def fn(a, b, c): print("a=", a) print("b=", b) print("c=", c) d = {"a": 10, 'b': 20, 'c': 30} fn(**d) =================== a= 10 b= 20 c= 30 进程已结束,退出代码0

需要注意的是,字典要满足一个点就是key的名字要和参数对得上

好啦!今天的内容到这里就结束啦~~~至此,函数基础基本就这些了,后面会更新函数的高阶用法!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有