在函数中未传递默认参数的情况下,将 None 转换为空列表的大多数 Pythonic 方法?

Most Pythonic way to convert None to an empty list in case a default argument is not passed in a Function?

我想编写一个通用函数,它接受两个输入变量 var1var2 和 returns 两者的串联。

每个变量都有默认值None,可以是单个元素,也可以是list

预期的输出应该是一个列表(即使var1var2都是None,它应该return 空列表 []).

下面是我的函数:

def my_func(var1=None, var2=None):
    if not isinstance(var1, list):
        var1 = [var1]
    if not isinstance(var2, list):
        var2 = [var2]
    return var1 + var2 

当我只输入一个变量时,我得到以下结果:

>>> lst = my_func(var2=[1, 2, 3])
>>> print(lst)
[None, 1, 2, 3]

我想得到

[1, 2, 3]

有没有办法在函数中将None转换为[]而不改变默认的None?

您可以使用 [] 作为每个 var.

的默认参数,而不是 None
def my_func(var1 = [], var2 = []):
    if not isinstance(var1, list):
        var1 = [var1]
    if not isinstance(var2, list):
        var2 = [var2]
    return var1 + var2 
        
lst = my_func(var2=[1, 2, 3])
print(lst)

然而,正如用户 mkrieger1 在评论中所建议的那样,如这个问题 "Least Astonishment" and the Mutable Default Argument 所示,这可能不是一个好主意,因此您可以这样做:

def my_func(var1 = None, var2 = None):
    var1 = [] if var1 is None else var1
    var2 = [] if var2 is None else var2

    if not isinstance(var1, list):
        var1 = [var1]
    if not isinstance(var2, list):
        var2 = [var2]
    return var1 + var2 

    
lst = my_func(var2=[1, 2, 3])
print(lst)

输出:

[1, 2, 3]

如果您想要保留None值,请添加到@solif.py答案(因此默认值为 一个可变对象)然后 运行 一个简单的测试:

def my_func(var1=None, var2=None):
    if not var1:
        var1 = []
    if not var2:
        var2 = []
    if not isinstance(var1, list):
        var1 = [var1]
    if not isinstance(var2, list):
        var2 = [var2]

    return var1 + var2


lst = my_func(var2=[1, 2, 3])
print(lst)
  • 关于函数的参数何时可变或不可变检查 “Least Astonishment” and the Mutable Default Argument

EDIT:

进一步检查您的代码后,您实际上可以将 if not isinstance(var1, list) 行更改为:

def my_func(var1=None, var2=None):

    if not isinstance(var1, list):
        var1 = []
    if not isinstance(var2, list):
        var2 = []
    

    return var1 + var2


lst = my_func(var2=[1, 2, 3])
print(lst)

其他解决方案

注意 @Cid 回答基本上仅在等于 None 时才更改参数 var1 或 var2 因此可以执行以下操作:

def my_func(var1=None, var2=None):

    if var1 == None:
        var1 = []
    if var2 == None:
        var2 = []
    if not isinstance(var1, list):
        var1 = [var1]
    if not isinstance(var2, list):
        var2 = [var2]
    return var1 + var2


lst = my_func(var1=False, var2=[1, 2, 3])
print(my_func(var2=[1, 2, 3]))
print(my_func(var1=None,var2=[1, 2, 3]))
print(my_func(var1=0,var2=[1, 2, 3]))
print(my_func(var1=False,var2=[1, 2, 3]))
print(my_func(var1='',var2=[1, 2, 3]))

输出

[1, 2, 3]                                                                                                                                                                                                                                       
[1, 2, 3]                                                                                                                                                                                                                                       
[0, 1, 2, 3]                                                                                                                                                                                                                                    
[False, 1, 2, 3]                                                                                                                                                                                                                                
['', 1, 2, 3]

这就是我从列表中删除所有 None 的方法:

def my_func(var1=None, var2=None):
    lst = []
    c = 0
    
    if not isinstance(var1, list):
        var1 = [var1]
    if not isinstance(var2, list):
        var2 = [var2]
    lst =  var1 + var2

    for i in lst:
        if i == None:
            lst.pop(c)
        c += 1

    return lst
    

lst_ = my_func(var2=[1, 2, 3])
print(lst_)

我使用 for 循环迭代列表中的每个项目。如果项目 == None,代码将删除它。

你可以先看看var(1和2)是否是Not None

def my_func(var1=None, var2=None):
    var1 = var1 if var1 is not None else []
    var2 = var2 if var2 is not None else []
    if not isinstance(var1, list):
        var1 = [var1]
    if not isinstance(var2, list):
        var2 = [var2]

    return var1 + var2

这将涵盖许多情况,例如:

print(my_func(var2=[1, 2, 3]))
print(my_func(var1=None,var2=[1, 2, 3]))
print(my_func(var1=0,var2=[1, 2, 3]))
print(my_func(var1=False,var2=[1, 2, 3]))
print(my_func(var1='',var2=[1, 2, 3]))

[1, 2, 3]                                                                                                                                                                                                                                       
[1, 2, 3]                                                                                                                                                                                                                                       
[0, 1, 2, 3]                                                                                                                                                                                                                                    
[False, 1, 2, 3]                                                                                                                                                                                                                                
['', 1, 2, 3]