查看原文
其他

彻底掌握Python函数的5种参数

Python猫 2022-04-12
 △点击上方“Python猫”关注 ,回复“1”领取电子书

原文地址:5 Types of Arguments in Python Function Definition

原文作者:Indhumathy Chelliah

译文出自:掘金翻译计划
本文永久链接:https://github.com/xitu/gold-miner/blob/master/article/2020/5-types-of-arguments-in-python-function-definition.md
译者:Zhengjian-L

Python 函数定义:

关键字 def 引入一个函数定义。它后面必须跟着函数名称和带括号的形式参数列表。构成函数体的语句从下一行开始,并且必须缩进。

在定义的函数中需要提及形式参数实际参数在函数调用时传递。

我们可以用各种参数来定义函数。

1. 缺省参数

  • 缺省参数是在定义函数时提供的值。
  • 赋值符号=用于声明参数的默认值。
  • 在调用函数时,参数默认值是可变更项。
  • 如果在调用函数时提供缺省参数的值,这个值会替代默认值。
  • 一个函数可以有任意数量的缺省参数。
  • 缺省参数要在非缺省参数之后。

例:b,c在下面的例子中,参数b,c指定了默认值。

def add(a,b=5,c=10):
    return (a+b+c)

这个函数有三种调用方式

(1)只给出必需参数

print(add(3))
#Output:18

(2)给出一个可选的参数 3 赋值给 a, 4 赋值给 b。

print(add(3,4))
#Output:14

(3)给出所有参数

print(add(2,3,4))
#Output:9

注意: 默认值在函数定义处的定义过程中只会计算一次。因此,在把如列表、字典等可变对象作为默认值时会有些许不同。

2. 关键字参数

也可以使用形如kwarg=value的关键字参数来调用函数。

在调用函数时,参数值并不需要与函数定义中的参数顺序相同。这可以通过关键字参数实现。但所有的关键字参数必须与函数定义中的参数一一对应。

def add(a,b=5,c=10):
    return (a+b+c)

调用函数 function add 时提供关键字参数

(1)所有的参数都是关键字参数,因此不需要固定顺序。

print (add(b=10,c=15,a=20))
#Output:45

(2)调用函数时,只给出必要参数作为关键字参数,可选缺省参数就会跳过。

print (add(a=10))
#Output:25

3. 位置参数

调用函数时,参数传递的值的顺序和形式参数的顺序需要对应。这称之为位置参数。位置参数之后只能是关键字参数。

def add(a,b,c):
    return (a+b+c)

上面的函数有两种调用的方式:

(1)调用函数时,参数均为位置参数。参数传递的值会通过位置传递到对应参数。10 赋值给a,20赋值给b30 赋值给 c

print (add(10,20,30))
#Output:60

(2)在混合使用位置参数和关键字参数时,关键字参数总是在位置参数之后。

print (add(10,c=30,b=20))
#Output:60

缺省参数、位置参数 、关键字参数三者对比:


关键要点:

1. 缺省参数需要在非缺省参数之后

def add(a=5,b,c):
    return (a+b+c)

#Output:SyntaxError: non-default argument follows default argument

2. 关键字参数需要在位置参数之后

def add(a,b,c):
    return (a+b+c)

print (add(a=10,3,4))
#Output:SyntaxError: positional argument follows keyword argument

3. 所有传递的关键字参数必须有对应参数,并且顺序不重要。

def add(a,b,c):
    return (a+b+c)

print (add(a=10,b1=5,c=12))
#Output:TypeError: add() got an unexpected keyword argument 'b1'

4. 参数只能赋值一次

def add(a,b,c):
    return (a+b+c)

print (add(a=10,b=5,b=10,c=12))
#Output:SyntaxError: keyword argument repeated

5. 缺省参数是可选参数

例 1: 只给必要参数

def add(a,b=5,c=10):
    return (a+b+c)

print (add(2))
#Output:17

例 2: 给出所有参数(必要参数和可选参数)

def add(a,b=5,c=10):
    return (a+b+c)

print (add(2,3,4))
#Output:9

可变长度参数

可变长度参数也称为任意参数。如果我们事先不知道函数的参数数量,可以使用任意参数。

两种任意参数

  1. 任意位置参数
  2. 任意关键字参数

4. 任意位置参数

对于任意位置参数,函数定义的参数前会有一个星号(*),该参数可以包含非关键字可变长度参数。这些参数将包含在一个元组中。在可变数量的参数之前,可能会出现零个或多个普通参数。

def add(*b):
    result=0
    for i in b:
         result=result+i
    return result

print (add(1,2,3,4,5))
#Output:15

print (add(10,20))
#Output:30

5.任意关键字参数

对于任意关键字参数,函数定义的参数前会有双星号(*),该参数可以包含非关键字可变长度参数。

def fn(**a):
    for i in a.items():
        print (i)
fn(numbers=5,colors="blue",fruits="apple")
'''
Output:
('
numbers', 5)
('
colors', 'blue')
('
fruits', 'apple')
'
''

特殊参数:

根据 Python 手册

默认情况下,函数的参数传递形式可以是位置参数或是显式的关键字参数。为了确保可读性和运行效率,限制允许的参数传递形式是有意义的,这样开发者只需查看函数定义即可确定参数项是仅按位置、按位置也按关键字,还是仅按关键字传递。

函数的定义看起来可以像是这样:

在这里/* 是可选的。如果使用这些符号则表明可以通过何种形参将参数值传递给函数:仅限位置、位置或关键字,以及仅限关键字。

  1. 位置或关键字参数
  2. 仅限位置参数
  3. 仅限关键字参数

(1) 位置或关键字参数

如果函数定义中未使用 /*,则参数可以按位置或按关键字传递给函数。

def add(a,b,c):
    return a+b+c

print (add(3,4,5))
#Output:12

print (add(3,c=1,b=2))
#Output:6

(2) 仅限位置参数

在定义的函数中,仅限位置参数要放在/(正斜杠)之前。这个/被用来从逻辑上分隔仅限位置形参和其他形参。在/之后的形参可以为位置或关键字或者仅限关键字

def add(a,b,/,c,d):
    return a+b+c+d

print (add(3,4,5,6))
#Output:18

print (add(3,4,c=1,d=2))
#Output:10

如果将关键字参数规定为仅限位置参数,则会导致TypeError

def add(a,b,/,c,d):
    return a+b+c+d

print (add(3,b=4,c=1,d=2))
#Output:TypeError: add() got some positional-only arguments passed as keyword arguments: 'b'

(3)仅限关键字参数

要将形参标记为仅限关键字,应在参数列表的第一个仅限关键字形参前放置一个 *

def add(a,b,*,c,d):
    return a+b+c+d

print (add(3,4,c=1,d=2))
#Output:10

如果将位置参数规定为仅限关键字参数,则会导致TypeError

def add(a,b,*,c,d):
    return a+b+c+d

print (add(3,4,1,d=2))
#Output:TypeError: add() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

在同一个函数中的拥有三种参数的调用规则

在下面的例子中,function add 拥有所有三种参数

a,b — 仅限位置参数 c - 位置或关键字参数 d - 仅限关键字参数

def add(a,b,/,c,*,d):
    return a+b+c+d

print (add(3,4,1,d=2))
#Output:10

注意事项:

  1. 当你希望参数的名称对用户不可用时,则使用仅限位置。当参数名称没有实际意义时,这很有用。
  2. 如果你想规定调用函数的参数数据时,则使用仅限位置
  3. 当名称有意义且定义的函数通过名称变得更易于理解时,则使用仅限关键字
  4. 当你想要避免用户依赖传递的参数的位置时,则使用仅限关键字
Python猫技术交流群开放啦!群里既有国内一二线大厂在职员工,也有国内外高校在读学生,既有十多年码龄的编程老鸟,也有中小学刚刚入门的新人,学习氛围良好!想入群的同学,请在公号内回复『交流群』,获取猫哥的微信(谢绝广告党,非诚勿扰!)~

近期热门文章推荐:

大幅提高生产力:你需要了解的10 大 Jupyter Lab 插件
在手机上 Python 编程,可以试试它!
如何理解 Python 之禅:Explicit is better than implicit?
如何在 Python 程序中实现缓存?
如何全面掌握 Python 中正则表达式的使用?

感谢创作者的好文

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存