首页 > 编程笔记 > Python笔记

Python函数中的参数(必需参数、关键字参数、默认参数和不定长参数)

Python 中函数的参数可细分为必需参数、关键字参数、默认参数和不定长参数四种情况。

必需参数是指为了确保函数正确执行,需要明确赋值的参数。例如定义一个打印输入的字符串的函数:
def print_string(str):
    print(str)
    return

若调用该函数时不对参数 str 赋值:
print_string()

则 Python 运行时环境将报错,上述代码的运行结果如下所示:

>>> def print_string(str):
...          print(str)
...          return

>>> print_string()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    print_string()
TypeError: print_string() missing 1 required positional argument: 'str'


关键字参数则是指在传参时指明形参的名称,并为其赋以实参的值,例如下面计算长方形面积的函数:
def Calc_Area(width, height):
    return width * height
    print(Calc_Area(height=4, width=3))
上述代码的运行结果如下所示:

>>> def Calc_Area(width, height):
...          return width * height

>>> print(Calc_Area(height=4, width=3))
12


默认参数是指为函数的参数取一个默认值,当调用函数时可以不传入具有默认值的参数,当执行函数时使用该默认值参与运算。例如为计算长方形面积的函数的 height 参数指定默认值并调用:
def Calc_Area(width, height = 5):
    return width * height
    print(Calc_Area(3))
上述代码的运行结果如下所示:

>>> def Calc_Area(width, height = 5):
...         return width * height

>>> print(Calc_Area(3))
15


有的函数在定义时无法指明所有的参数,或是在调用时传入的参数个数比定义时的多,这就需要用到不定长参数。不定长参数主要有两种传入方式,一种是在参数名称前加星号*,以元组类型导入,用来存放所有未命名的变量参数。例如:
def Multi_Add(arg1, *args):
    sum = 0
    for var in args:
        sum += var
    return arg1 + sum
    print(Multi_Add(1, 2, 3 , 4))
Multi_Add( ) 函数的作用是将输入的参数相加,上述代码的运行结果如下所示:

>>> def Multi_Add(arg1, *args):
...         sum = 0
...         for var in args:
               sum += var
...         return arg1 + sum

>>> print(Multi_Add(1, 2, 3 , 4))
10
>>> print(Multi_Add(1, 2, 3 , 4, 5, 6))
21


另一种是在参数名称前加两个星号**,以字典类型导入,用来存放所有命名的变量参数,例如:
def fun(**kwargs):
    for key, value in kwargs.items():
        print("{0} 喜欢 {1}" . format (key, value))
    fun (我="猫", 猫="盒子")
上述代码的运行结果如下所示:

>>> def fun(**kwargs):
...         for key, value in kwargs.items():
...         print("{0} 喜欢 {1}" . format (key, value))
       
>>> fun (我="猫", 猫="盒子")
我 喜欢 猫
猫 喜欢 盒子


在 Python 中一切变量都是对象,数字、字符串和元组是不可更改(immutable)的对象,列表、字典等则是可以更改(mutable)的对象。所谓不可更改的意思是改变变量的取值实际上是新生成一个同类型的变量并赋值。

例如,变量赋值 a=1,然后改变其取值 a=2,实际是新生成一个 int 类型的对象 2,再让 a 指向它,而 1 则被丢弃,相当于新生成了 a。所谓可以更改则是真正改变了变量内部的一部分取值。例如,变量赋值 list=[1,2,3],然后改变其取值 list[1]=6,实际上是更改了其元素的值,本身 list 没有变化,只是其内部部分元素的值被修改了。

当不可更改对象作为函数参数时,类似于 C、C++ 等语言中的值传递,传递的只是参数的值,并不会影响该不可更改对象本身。例如:
def changeVar(a):
    a = 1
    b = 2
    changeVar(b)
    print(b)
上述代码的运行结果如下所示:

>>> def changeVar(a):
...          a = 1

>>> b = 2
>>> changeVar(b)
>>> print(b)
2


当可更改对象作为函数参数时,类似于 C、C++ 等语言中的引用传递,是将该对象本身传过去,在函数体内修改了该对象的内容后,其内部元素的值将被真正修改。例如:
def changeVar2(l):
    l.append([3, 4])
    print ("函数内取值:", l)
    return

l = [1, 2]
changeVar2(l)
print ("函数外取值:", l)
上述代码的运行结果如下所示:

>>> def changeVar2(l):
...          l.append([3, 4])
...          print ("函数内取值:", l)
...          return

>>> l = [1, 2]
>>> changeVar2(l)
函数内取值: [1, 2, [3, 4]]
>>> print ("函数外取值:", l)

所有教程

优秀文章