函数2:参数详解

这篇博客详细介绍了Python函数的参数类型,包括位置参数、关键字参数、默认参数、'/ '字符的作用、'*'参数、收集参数(元组和字典)以及解包参数的使用规则和注意事项。

目录

1. 参数格式

2. 位置参数

3. 关键字参数

4. 默认参数

5. 参数中的 '/'

6. 参数中的 '*'

7. 收集参数-元组

8. 收集参数-字典

9. 解包参数


1. 参数格式

定义中参数的格式

参数格式

说明

name

由名字或位置匹配【输入关键字参数、位置参数】

name=value

没有传递name时的默认值【默认参数】

*name

收集额外的位置参数作为新的元组名【收集参数-元组】

**name

收集额外的关键字参数作为新的字典名【收集参数-字典】

*other,name[=value]

*后是Python3.X的进位关键字参数

*,name[=value]

与前行相同【参数中的 '*'】

调用中参数的格式

参数格式

说明

value

位置参数

name=value

关键字(由name匹配)参数

*iterable

分解位置参数的序列或其他迭代

**dictionary

分解关键字参数的字典

2. 位置参数

直接按照函数定义形参前后位置,在调用函数时录入实参,这种实参录入即位置参数;

录入超过声明定义形参数量的实参,报错;

录入少于声明但未赋值默认参数的形参数量的实参,报错;

def functionx(var1,var2,var3):
     print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}')    
   
#按顺序录入的实参'Ana'、'Bob'、'Carl',按照functionx的形参位置,赋予了var1、var2、var3
functionx('Ana','Bob','Carl')
Hi,Carl.
Waohoh,Ana!
En,Bob

#录入超过声明定义形参数量的实参,报错。
functionx('Ana','Bob','Carl','Dave')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functionx() takes 3 positional arguments but 4 were given

#录入少于声明但未赋值默认参数的形参数量的实参,报错
functionx('Ana','Bob')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functionx() missing 1 required positional argument: 'var3'

3. 关键字参数

当函数参数较多,位置、顺序容易混淆时,在知道形参参数名的前提下,可直接通过"形参 = 实参"的方式录入,这种实参录入即关键字参数;

关键字参数只要知道形参参数名,可以不按形参位置录入;

反复录入同一形参的实参,报错;

关键字参数录入实参少于声明的未赋值默认参数的形参的数量,报错;

录入未声明的形参为关键字,报错;

可以混合使用位置参数和关键字参数,此时关键字参数录入需要在所有位置参数之后,否则报错;

位置参数和关键字参数重复赋值实参给同一形参,报错。

def functionx(var1,var2,var3):
     print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}')    

#按形参名给予关键字参数,可以不按形参位置录入
functionx(var3='Ana',var2='Bob',var1='Carl')
Hi,Ana.
Waohoh,Carl!
En,Bob

#反复录入同一形参的实参,报错
functionx(var1='Ana',var1='Bob',var3='Carl')
  File "<input>", line 1
SyntaxError: keyword argument repeated: var1

#关键字参数录入实参少于声明的形参数,报错
functionx(var1='Ana',var3='Carl')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functionx() missing 1 required positional argument: 'var2'

#录入未声明的形参为关键字,报错
functionx(var4='Dave')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functionx() got an unexpected keyword argument 'var4'

#混合使用位置参数和关键字参数
functionx('Ana',var3='Bob',var2='Carl')
Hi,Bob.
Waohoh,Ana!
En,Carl

#关键字参数在位置参数之前,报错
functionx(var1='Ana','Bob',var3='Carl')
  File "<input>", line 1
    functionx(var1='Ana','Bob',var3='Carl')
                                          ^
SyntaxError: positional argument follows keyword argument

#位置参数和关键字参数重复赋值实参给同一形参,报错
functionx('Ana',var3='Bob',var2='Carl',var1='Dave')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functionx() got multiple values for argument 'var1'

4. 默认参数

函数定义形参时,即通过"形参 = 默认参数",来给形参赋值默认参数;

函数调用时,如果已经赋值默认参数的形参没有录入实参,则函数该形参赋值为默认参数;

有赋值为默认参数的形参,调用函数时,可以不赋值实参;

未赋值默认参数的其他形参,若未被赋值实参,报错;

函数定义形参时,如有形参赋值默认参数,则该形参的声明,需要在所有未赋值默认参数的形参声明之后,否则报错;

默认值在函数定义中求值,如默认值为变量,函数定义后改变变量值,默认值不变;

重要警告: 

  • 通常默认值只计算一次。但当默认值为列表、字典或类实例等可变对象时,会产生与该规则不同的结果:
  • 函数内调用时,如改变被默认值赋值为列表、字典等可变对象的形参时,默认值改变;
  • 函数内调用时,如被默认值赋值为不可变对象的形参,则不会改变默认值;
  • 函数外改变被赋值为默认值的可变对象,也不改变默认值。
def functionx(var1='Smith1',var2='Smith2',var3='Smith3'):
      print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}') 
   
#函数调用时,如果已经赋值默认参数的形参没有录入实参,则函数该形参赋值为默认参数   
#有赋值为默认参数的形参,调用函数时,可以不赋值实参
functionx()
Hi,Smith3.
Waohoh,Smith1!
En,Smith2
functionx('Ana',var3='Bob')
Hi,Bob.
Waohoh,Ana!
En,Smith2

#未赋值默认参数的其他形参,若未被赋值实参,报错
functionx('Ana',var3='Bob')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functionx() missing 1 required positional argument: 'var2'

#函数定义形参时,如有形参赋值默认参数,则该形参的声明,需要在所有未赋值默认参数的形参声明之后,否则报错
def functionx(var1='Smith1', var2, var3='Smith3'):
     print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}') 
     
  File "<input>", line 1
    def functionx(var1='Smith1', var2, var3='Smith3'):
                                       ^
SyntaxError: non-default argument follows default argument

默认值在函数定义中求值,如默认值为变量,函数定义后改变变量值,默认值不变
x = 'Smith1'
def functionx(var1, var2, var3=x):
     print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}') 
     
functionx('Ana','Bob')
Hi,Smith1.
Waohoh,Ana!
En,Bob
x = 'James1'
functionx('Ana','Bob')
Hi,Smith1.
Waohoh,Ana!
En,Bob

#函数内调用时,如改变被默认值赋值为列表、字典等可变对象的形参时,默认值改变
def functionx(var1, var2, var3=[]):
     var3.append(var1)
     print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}') 
     
functionx('Ana','Bob')
Hi,['Ana'].
Waohoh,Ana!
En,Bob
functionx('Ana','Bob')
Hi,['Ana', 'Ana'].
Waohoh,Ana!
En,Bob
functionx('Ana','Bob')
Hi,['Ana', 'Ana', 'Ana'].
Waohoh,Ana!
En,Bob

#函数内调用时,如被默认值赋值为不可变对象的形参,则不会改变默认值
def functionx(var1, var2, var3=1):
     var3 += 1
     print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}') 
     
functionx('Ana','Bob')
Hi,2.
Waohoh,Ana!
En,Bob
functionx('Ana','Bob')
Hi,2.
Waohoh,Ana!
En,Bob

#函数外改变被赋值为默认值的可变对象,也不改变默认值
x = []
def functionx(var1, var2, var3=x):
    print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}') 
     
functionx('Ana','Bob')
Hi,[].
Waohoh,Ana!
En,Bob
x = [1,2,3]
functionx('Ana','Bob')
Hi,[].

5. 参数中的 '/'

通过help()函数查看内置函数说明时,发现如abs()、sum()等函数的参数中有 '/' 字符;

 '/' 字符实际作用是:定义函数时,斜杠“/”限制位置参数,即斜杠左侧的参数必须传递位置参数,而不能传递关键字参数(斜杠右侧的参数随意)。

#abs()函数说明,可见带有'/'
help(abs)
Help on built-in function abs in module builtins:
abs(x, /)
    Return the absolute value of the argument.

def functionx(var1,/,var2,var3):
     print(var1,var2,var3)
     
#斜杠左侧的参数必须传递位置参数,而不能传递关键字参数
#斜杠右侧的参数既可以是位置参数,也可以是关键字参数
functionx(1,2,3)
1 2 3
functionx(1,var3=2,var2=3)
1 3 2

#斜杠左侧传递关键字参数,报错
functionx(var1=1,var3=2,var2=3)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functionx() got some positional-only arguments passed as keyword arguments: 'var1'

6. 参数中的 '*'

'*' 字符实际作用是:限制关键字参数,即星号右侧的参数必须传递关键字参数,而不能传递位置参数(星号左侧的参数随意);

'*' 实际上就是一个匿名的收集参数,参见章节6;

'/' 、'*' 可以混合使用。

def functionx(var1,var2,*,var3):
     print(var1,var2,var3)
    
#星号左侧的参数既可以是位置参数,也可以是关键字参数
#星号右侧的参数必须传递关键字参数,而不能传递位置参数
functionx(var1=1,var3=2,var2=3)
1 3 2
functionx(1,var3=2,var2=3)
1 3 2
functionx(1,2,var3=3)
1 2 3

#星号右侧参数传递位置参数,报错
functionx(1,2,3)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functionx() takes 2 positional arguments but 3 were given

#'/' 、'*' 可以混合使用
#如下示例中,var1只能为位置参数,var3只能为关键字参数,var2则都可以
def functionx(var1,/,var2,*,var3):
     print(var1,var2,var3)    
     
functionx(1,var2=2,var3=3)
1 2 3
functionx(1,2,var3=3)
1 2 3
functionx(var1=1,var2=2,var3=3)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functionx() got some positional-only arguments passed as keyword arguments: 'var1'
functionx(1,2,3)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functionx() takes 2 positional arguments but 3 were given

7. 收集参数-元组

若实参个数不定,定义函数时,形参可以使用收集参数-元组实现,在形参前加上星号(*)即可;

Python实现时,把标志为收集参数-元组的所有实参打包成一个元组,可以在函数内部代码块应用元组方法对收集参数进行操作;

def functionx(*vart):
     for i in range(len(vart)):
         print(f'实参{vart[i]},在收集参数元组中索引值是{vart.index(vart[i])}')     
     print(type(vart))    
     
functionx('a','b','c')
实参a,在收集参数元组中索引值是0
实参b,在收集参数元组中索引值是1
实参c,在收集参数元组中索引值是2
<class 'tuple'>

收集参数-元组收集额外的位置参数,只能以位置参数实参录入,不能使用关键字参数实参录入;

收集参数之前定义的形参,如果收集参数有实参录入,则只能以位置参数实参录入,否则收集参数无法以位置参数实参录入;

收集参数之前定义的形参,如果收集参数没有实参录入,则可以同时使用位置参数或关键值参数实参录入;

def functionx(var1,*vart,var2,var3):
     print(f'Waoh{var1}\nWaoh{var2}\nWaoh{var3}\nWaoh{vart}\n')

#收集参数-元组收集额外的位置参数,只能以位置参数实参录入,不能使用关键字参数实参录入
functionx(0,vart=(1,2,3,4),var2='a',var3='b')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functionx() got an unexpected keyword argument 'vart'

#收集参数之前定义的形参,如果收集参数有实参录入,只能以位置参数实参录入
functionx(0,1,2,3,4,5,6,var2='a',var3='b')
Waoh0
Waoha
Waohb
Waoh(1, 2, 3, 4, 5, 6)

#收集参数之前定义的形参,以关键值参数实参录入,则收集参数无法以位置参数实参录入
functionx(var1='x',1,2,3,4,var2='a',var3='b')
  File "<input>", line 1
    functionx(var1='x',1,2,3,4,var2='a',var3='b')
                                                ^
SyntaxError: positional argument follows keyword argument

#收集参数之前定义的形参,如果收集参数没有实参录入,则可以关键值参数实参录入
functionx(var1='x',var2='a',var3='b')
Waohx
Waoha
Waohb
Waoh()

收集参数之后定义的形参,在调用函数时使用关键参数指定,否则Python会把所有实参纳入到收集参数中;

收集参数之后定义的形参,如果没有设置默认值,且在调用时没有输入关键字实参,则报错;

def functionx(var1,*vart,var2,var3):
     print(f'Waoh{var1}\nWaoh{var2}\nWaoh{var3}\nWaoh{vart}\n')
     
#收集参数之后的形参,不使用关键字调用,则未录入实参报错
functionx(0,1,2,3,4,5)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functionx() missing 2 required keyword-only arguments: 'var2' and 'var3'

#通过关键字调用收集参数之后的形参
functionx(0,1,2,3,var3=4,var2=5)
Waoh0
Waoh5
Waoh4
Waoh(1, 2, 3)

#收集参数之后的形参,设置默认值
def functionx(var1,*vart,var2='A',var3='B'):
     print(f'Waoh{var1}\nWaoh{var2}\nWaoh{var3}\nWaoh{vart}\n')
     
functionx(0,1,2,3,4,5,6,7,8,9)
Waoh0
WaohA
WaohB
Waoh(1, 2, 3, 4, 5, 6, 7, 8, 9)

8. 收集参数-字典

若多个实参需要以字典形式输入函数,则在定义函数时,形参使用收集参数-字典实现,在形参前加上两个星号(**)即可;

收集参数-字典前可以定义位置参数、收集参数-元组,但之后则不可以定义任何形参;

收集参数-字典前声明的位置参数,可以通过关键字参数录入实参;

调用时,收集参数-字典的实参,通过key1=value1,key2=value2,key3=value3 的格式录入,注意此时key为字符串,不能带单引号和双引号;

实参录入时,直接录入字典、dict()函数、带二元元组元素的序列,都报错;

需要直接录入完整字典时,参见解包参数。

#位置参数 + 收集参数-元组 + 收集参数-字典,可以同时使用
def functionx(var1,*vart,**vard):
     print(f'参数1:{var1},参数2:{vart}')
     for i in range(len(vard)):
         print(vard.popitem())        
         
functionx(0,1,2,3,4,5,a=6,b=7,c=8)
参数1:0,参数2:(1, 2, 3, 4, 5)
('c', 8)
('b', 7)
('a', 6)

#收集参数-字典前声明的位置参数,可以通过关键字参数录入实参
def functionx(var1, *vart, **vard):
     print(f'参数1:{var1},参数2:{vart},参数3:{vard}')
         
functionx(vart=(2,3,4),vard=3,var1=4)
参数1:4,参数2:(),参数3:{'vart': (2, 3, 4), 'vard': 3}

#收集参数-字典之后则不可以定义任何形参
def functionx(var1,**vard,var2):
     print(f'参数1:{var1},参数2:{var2}')
     for i in len(vard)
         vard.popitem()
         
  File "<input>", line 1
    def functionx(var1,**vard,var2):
                              ^
SyntaxError: invalid syntax
def functionx(var1,**vard1,**vard2):
     print(f'参数1:{var1},参数2:{var2}')
     for i in len(vard)
         vard.popitem()
         
  File "<input>", line 1
    def functionx(var1,**vard1,**vard2):
                               ^
SyntaxError: invalid syntax

#实参录入时,直接录入字典、dict()函数、带二元元组元素的序列,都报错
functionx({'a':1,'b':2})
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functionx() takes 0 positional arguments but 1 was given
functionx(dict({'a':1,'b':2}))
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functionx() takes 0 positional arguments but 1 was given
functionx([('a',1),('b',2)])
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functionx() takes 0 positional arguments but 1 was given

9. 解包参数

当函数定义多个形参,需要将序列或字典作为实参直接录入函数时,可以通过解包参数,即在序列实参前加上星号(*),或在字典实参前加上两个星号(**)进行解包;

不仅可以对收集参数录入解包的序列、字典,对于多个位置参数也可以通过解包序列录入,但需要注意解包元素数量如果与形参数量不一致,则报错;

字典解包录入位置参数或收集参数-元组时,录入的是键。

#当函数定义多个形参,需要将序列或字典作为实参直接录入函数时,可以通过解包参数录入
def functionx(*vart,**vard):
     for i in range(len(vart)):
         print(f'参数:{vart[i]},索引为:{vart.index(vart[i])}')
     for i in range(len(vard)):
         print(vard.popitem())        
         
str1 = 'ac 1.&'
dic1 = {'a':1,2:[1,2,'34']}

functionx(*str1,**dic1)
参数:a,索引为:0
参数:c,索引为:1
参数: ,索引为:2
参数:1,索引为:3
参数:.,索引为:4
参数:&,索引为:5
('b', [1, 2, '34'])
('a', 1)

#多个位置参数可以通过解包序列录入
def functiony(var1,var2,var3):
     print(f'参数1:{var1},参数2:{var2},参数3:{var3}')
     
s = [1,2,3]
functiony(*s)
参数1:1,参数2:2,参数3:3
#解包元素数量如果与形参数量不一致,则报错
s = [1,2,3,4]
functiony(*s)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functiony() takes 3 positional arguments but 4 were given
s = [1,2]
functiony(*s)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: functiony() missing 1 required positional argument: 'var3'

#字典解包录入位置参数或收集参数-元组时,录入的是键
def functiony(var1,var2,var3):
     print(f'参数1:{var1},参数2:{var2},参数3:{var3}')
     
d = {'a':1,'b':2,'c':3}
functiony(*d)
参数1:a,参数2:b,参数3:c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燃烧的火鸟啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值