在函数中未传递默认参数的情况下,将 None 转换为空列表的大多数 Pythonic 方法?
Most Pythonic way to convert None to an empty list in case a default argument is not passed in a Function?
我想编写一个通用函数,它接受两个输入变量 var1
、var2
和 returns 两者的串联。
每个变量都有默认值None
,可以是单个元素,也可以是list
。
预期的输出应该是一个列表(即使var1
和var2
都是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]
我想编写一个通用函数,它接受两个输入变量 var1
、var2
和 returns 两者的串联。
每个变量都有默认值None
,可以是单个元素,也可以是list
。
预期的输出应该是一个列表(即使var1
和var2
都是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]