位置参数
Python 处理参数的方式要比其他语言更加灵活。其中,最熟悉的参数类型是位置参数,传入参数的值是按照顺序依次复制过去的。下面创建一个带有位置参数的函数:
需求:
y = k * x +b
中 k
与 b
也不固定。
def f(x, k, b):
y = k * x + b
print(y)
f(5, 5, 6)
尽管这种方式很常见,但是位置参数的一个弊端是必须熟记每个位置的参数的含义。在调用函数 f()
时误把最后一个参数当作第一个参数,会得到完全不同的结果:
def f(x, k, b):
print("x:{} k:{} b:{}".format(x, k, b))
y = k * x + b
return(y)
f(5, 5, 6)
关键字参数
为了避免位置参数带来的混乱,调用参数时可以指定对应参数的名字,甚至可以采用与函数定义不同的顺序调用:
def f(x, k, b):
print("x:{} k:{} b:{}".format(x, k, b))
y = k * x + b
return(y)
f(x=5, k=5, b=6)
你也可以把位置参数和关键字参数混合起来。首先,实例化参数 ,然后对参数使用关键字参数的方式:
def f(x, k, b):
print("x:{} k:{} b:{}".format(x, k, b))
y = k * x + b
return(y)
f(5, k=5, b=6)
如果同时出现两种参数形式,首先应该考虑的是位置参数。
指定默认参数
当调用方没有提供对应的参数值时,你可以指定默认参数值。这个听起来很普通的特性实际上特别有用,以之前的例子为例:
def f(x, k=5, b=6):
print("x:{} k:{} b:{}".format(x, k, b))
y = k * x + b
return(y)
f(x=5, k=5, b=6)
使用*收集位置参数(了解)
在不清楚传入参数是多少个
# 用 * 收集位置参数
# int * 特殊符号 有特殊的作用, 在定义函数的括号里面,用于收集所有的位置参数
# 在输出 或者是运行代码的过程中 是解包 包:元组、列表、迭代器、生成器
def f(*args):
# * 解包的标志
print('位置参数元组:',*args)
无参数调用函数,则什么也不会返回:
>>> f()
f ()
给函数传入的所有参数都会以元组的形式返回输出:
>>> f(3, 2, 1, 'wait!', 'uh...')
(3, 2, 1, 'wait!', 'uh...')
>>>
这样的技巧对于编写像 print() 一样接受可变数量的参数的函数是非常有用的。如果你函数同时有限定的位置参数,那么 *args 会收集剩下的参数:
>>> def f(arg1, arg2, *args):
... print('arg1:', arg1)
... print('arg2:', arg2)
... print('args:', args)
...
>>> print_args(1,2,3,4,5,6)
arg1: 1
arg2: 2
args: (3, 4, 5, 6)
当使用 * 时不需要调用元组参数 args,不过这也是 Python 的一个常见做法。
使用**收集关键字参数
使用两个星号可以将参数收集到一个字典中,参数的名字是字典的键,对应参数的值是字典的值。下面的例子定义了函数 print_kwargs(),然后打印输出它的关键字参数:
def print_kwargs(*arg, **kwargs):
""" args为关键字元组 kwargs为双元关键字元组 """
for i in kwargs.items():
print(i)
for i in arg:
print(i)
案例:假设 python
中的 print
不能一次性传入多个参数使用了,让我们自己实现 print
可以传递多个参数的功能。
# 假设 print 函数突然变成了一下这个样子
def print_(arg):
print(arg, sep="", end="")
要求:自己编写一个 changed_print
函数实现原本 print
的功能。
例:原本函数的功能
In [1]: print(1)
1
In [2]: print(1, 2, 3, 4)
1 2 3 4
In [3]: print(1, 2, 3,4, sep=',')
1,2,3,4
In [4]: print(1, 2, 3,4, sep=',', end='我是结尾')
1,2,3,4我是结尾
def changed_print(*args, sep=' ', end='\n'):
# print_ 只能接受一个参数
for arg in args[:-1]:
print_1(arg)
# , 空格 #
print_1(sep)
print(args[-1])
print_1('\n')