您的位置:

python中函数的默认值参数(python 默认参数)

本文目录一览:

Python函数里的默认参数和关键字参数有什么区别

#有默认参数

#定义默认参数 age = 1, gender = 'M'

def person( name, age = 1, gender='M'):

print 'name: %s age: %d gender: %s' % (name, age, gender)

#这里只传一个值给第一个参数which is name, age 和 gender已经有默认值,

#就算不传新值给 age or gender也没问题

person('Jacky')

#output -- name: Jacky age: 1 gender: M

#没有默认参数

def person(name, age, gender):

print 'name: %s age: %d gender: %s' % (name, age, gender)

# person('Jacky') -- error, 3个参数只传了一个值

#没有默认参数,就一定要传 N(total 参数) 个值给 function.

person('Jacky', 19, 'M')

******************************************************

#关键字参数

#用上面第一个例子 person( name, age=1, gender='M')

#用关键字给function传值时,不虽要跟著顺序来也没问题

#就算 age 和 name 顺序不同, 但因为是用关键字来传值,所以没问题

person( age=18, name='Jacky')

#output -- name: Jacky age: 18 gender: 'M'

person( gender='F', age=17, name='Ashley')

#output -- name: Ashley age: 17 gender: 'F'

# Error, 没用关键字去传值

# person( 20, 'M', 'Jacky') -- 没用关键字时,一定要按顺序去传值

i tried to explain as clear as i can....xP

Python的函数和参数

parameter 是函数定义的参数形式

argument 是函数调用时传入的参数实体。

对于函数调用的传参模式,一般有两种:

此外,

也是关键字传参

python的函数参数定义一般来说有五种: 位置和关键字参数混合 , 仅位置参数 , 仅关键字参数 , 可变位置参数 , 可变关键字参数 。其中仅位置参数的方式仅仅是一个概念,python语法中暂时没有这样的设计。

通常我们见到的函数是位置和关键字混合的方式。

既可以用关键字又可以用位置调用

这种方式的定义只能使用关键字传参的模式

f(*some_list) 与 f(arg1, arg2, ...) (其中some_list = [arg1, arg2, ...])是等价的

网络模块request的request方法的设计

多数的可选参数被设计成可变关键字参数

有多种方法能够为函数定义输出:

非常晦涩

如果使用可变对象作为函数的默认参数,会导致默认参数在所有的函数调用中被共享。

例子1:

addItem方法的data设计了一个默认参数,使用不当会造成默认参数被共享。

python里面,函数的默认参数被存在__default__属性中,这是一个元组类型

例子2:

在例子1中,默认参数是一个列表,它是mutable的数据类型,当它写进 __defauts__属性中时,函数addItem的操作并不会改变它的id,相当于 __defauts__只是保存了data的引用,对于它的内存数据并不关心,每次调用addItem,都可以修改 addItem.__defauts__中的数据,它是一个共享数据。

如果默认参数是一个imutable类型,情况将会不一样,你无法改变默认参数第一次存入的值。

例子1中,连续调用addItem('world') 的结果会是

而不是期望的

关于python带默认值的参数只能放在后面的问题

第一个那个*x是*args的意思,就是任意个参数,C++里的 va_arg,...符号这种,python函数里可以有*args和**kwargs。

*args之后可以随便放有默认值的和没有默认值的。

因为这之后的任何东西都得用”y=1“”z=1“这种来赋值。

比如说第一个函数,def fun(*x, y=4, z),我写fun(1,2,3,4,5),这五个数全跑到*x里了。我想给y和z赋值必须要写fun(1,2,3,4,5,y=6,z=7)。相当于z跟有默认值的那种也差不多了。所以规定可以把z放在*x后面的任何位置,包括y=4后面,它们的位置关系已经没有用了。

规定def fun(x=4, y) y必须放在x前,就是要保留这种位置关系,要不我写fun(1),你说这个1是给x的还是y的?就有了歧义。所以必须要有正确的位置关系。但是*x后面所有东西都是用参数名赋值的,位置关系不起作用了,所以可以任意顺序了。

要理解规定背后的原因。同理,**kwargs放在最后,也是这个原因。消除歧义性。

Python中定义函数默认参数值的使用注意事项?

4.7.1. 默认参数值

最常用的一种形式是为一个或多个参数指定默认值。这会创建一个可以使用比定义是允许的参数更少的参数调用的函数,例如:

def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):

while True:

ok = input(prompt)

if ok in ('y', 'ye', 'yes'):

return True

if ok in ('n', 'no', 'nop', 'nope'):

return False

retries = retries - 1

if retries 0:

raise OSError('uncooperative user')

print(complaint)

这个函数可以通过几种不同的方式调用:

只给出必要的参数:

ask_ok('Do you really want to quit?')

给出一个可选的参数:

ask_ok('OK to overwrite the file?', 2)

或者给出所有的参数:

ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')

这个例子还介绍了 in 关键字。它测定序列中是否包含某个确定的值。

默认值在函数 定义 作用域被解析,如下所示:

i = 5

def f(arg=i):

print(arg)

i = 6

f()

将会输出 5。

重要警告: 默认值只被赋值一次。这使得当默认值是可变对象时会有所不同,比如列表、字典或者大多数类的实例。例如,下面的函数在后续调用过程中会累积(前面)传给它的参数:

def f(a, L=[]):

L.append(a)

return L

print(f(1))

print(f(2))

print(f(3))

这将输出:

[1]

[1, 2]

[1, 2, 3]

如果你不想让默认值在后续调用中累积,你可以像下面一样定义函数:

def f(a, L=None):

if L is None:

L = []

L.append(a)

return L