Python基础之定义有默认参数的函数

1. 构建有默认参数的函数

当我们在构建一个函数或者方法时,如果想使函数中的一个或者多个参数使可选的,并且有一个默认值,那么可以在函数定义中给参数指定一个默认值,并且放到参数列表的最后就行了。比如:

def func(a, b=42):
    print(a, b)
func(1)             #a=1, b=42 
func(1,2)           #a=1, b=2

如果默认参数使一个可以修改的容器,比如一个列表,集合或者字典,可以使用None作为默认值。比如:

#使用列表list作为默认值
def func(a, b=None):
    if b is None:
        b = []
    ···

但是,如果你并不是想提供一个默认值,而仅仅知识想测试下某个默认参数是不是有值传递进来,可以这样写:

_no_value = object()
def func(a, b=_no_value):
    if b is _no_value:
        print("b没有值")
    else:
        print(a, b)

func(1)                     # b没有值
func(1, None)               # 1 None

仔细通过测试可以发现,传递一个None值和不传值两种情况是有差别的。

2. 参数陷阱

2.1 默认参数的值

默认参数的值仅仅在函数定义的时候赋值一次,示例代码如下:

x = 42
def func(a, b=x):
    print(a, b)

func(1)                    #1 42
x = 23
func(1)                    #1 42

从上面例子中可以看出,当我们改变x的值的对默认参数值并没有影响,这是因为在函数定定义的时候就已经确定了它的默认值了。

2.2 默认参数值的类型

默认参数值的类型应该是不可变对象,比如None,True,False,数字或字符串,而不能使用列表,字典等可变类型。

不要像下面这样写代码:

def func(a, b=[]):          #不能这么写
    ···

如果这样写了,当默认值在某些地方被修改之后,程序就会出现问题。

这些被修改的程序会影响到下次调用这个参数时的默认值。比如:

def func(a, b=[]):
    return b
x = func(1)
print(x)                #[]
x.append("a")
x.append("b")
print(x)                #['a', 'b']
y = func(1)
print(y)                #['a', 'b']

可以看到,b的默认值从一个空list,变成了[“a”, “b”],这种不会是你想要的默认参数。

为了避免这种情况的发生,最好是将默认值设置为None,然后在函数里面检查它。

但是在将默认值设置为None之后,测试None值时使用is操作符是很重要的,is是这种方法的关键点。
有人可能会这样写:

def func(a, b=None):
    if not b:
        b = []
···

这么写有有一个问题,就是虽然None确实会被当成False,但是还有其他的对象(比如长度为0的字符串,列表,元组,字典等)都会被当作False。因此上面的代码会误将一些其他输入也会当作没有输入。比如:

def func(a, b=None):
    if not b:
        b = []
    return b

print(func(1))                      # []
print(func(1, []))                  # []
print(func(1, 0))                   # []
print(func(1, ""))                  # []

从结果中就可以看到,b的值并没有发生改变,这不是我们想要的结果。

2.3 测试某个可选参数

当一个函数需要测试某个可选参数是否被使用者传递进来。这个时候需要小心的是不能用某个默认值,比如None,0或者False值来测试用户提供的值(因为这些值都是合法的值,是可能被用户传递进来的)。

你可以创建一个独一 无二的私有对象实例,就像上面的_no_value变量一样。在函数里面,你可以通过检查被传递参数值跟这个实例是否一样来判断。

这里的思路就是用户不可能去传递这个_no_value实例作为输出。因此这里通过检查这个值就能确定某个参数是否被传递进来了。

 

转载于:https://www.cnblogs.com/yang-wei/p/10015827.html

Python,自定义函数默认参数可以通过在参数列表使用赋值操作符(=)来实现。定义函数时,可以为参数提供默认值,这样在函数调用时可以省略对应的参数。例如: def greet(name="World"): print("Hello, " + name) 上面的代码定义了一个名为greet的函数,它有一个默认参数name,如果在函数调用时没有提供参数,将使用默认值"World"。可以通过以下方式调用函数: greet() # 输出:Hello, World greet("John") # 输出:Hello, John 在函数定义,将默认值直接赋给参数,可以轻松地知道哪些参数默认值。对于Python内置函数或第三方提供的函数,可以查看它们的文档或源代码来获取参数默认值信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [python函数默认参数](https://blog.csdn.net/zhizhengguan/article/details/120641743)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [python-自定义函数定义调用、默认参数、返回值)](https://blog.csdn.net/likinguuu/article/details/130945923)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值