如何解决如果没有在函数中传递默认参数,将 None 转换为空列表的大多数 Pythonic 方法是什么?
我想编写一个通用函数,它接受两个输入变量 var1
、var2
并返回两者的串联。
每个变量都有默认值 None
,可以是单个元素,也可以是 list
。
预期的输出应该是一个 list(即使 var1
和 var2
都是 None
,它应该返回一个空列表 []
).
以下是我的功能:
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,3]
我想要
[1,3]
有没有什么办法可以在函数中将None
转换为[]
,不改变默认的None
值?
解决方法
您可以使用 None
作为每个 []
的默认参数,而不是 var
。
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):
var2 = [var2]
return var1 + var2
lst = my_func(var2=[1,3])
print(lst)
输出:
[1,3]
,
您可以先检查 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):
var2 = [var2]
return var1 + var2
这将涵盖很多情况,例如:
print(my_func(var2=[1,3]))
print(my_func(var1=None,var2=[1,3]))
print(my_func(var1=0,3]))
print(my_func(var1=False,3]))
print(my_func(var1='',3]))
[1,3]
[1,3]
[0,1,3]
[False,3]
['',3]
,
添加到@solif.py 的答案,以防您想要保留 None 值(因此默认值不是可变对象)然后运行一个简单的测试作为所以:
def my_func(var1=None,var2=None):
if not var1:
var1 = []
if not var2:
var2 = []
if not isinstance(var1,list):
var2 = [var2]
return var1 + var2
lst = my_func(var2=[1,3])
print(lst)
- 关于函数的参数是可变还是不可变检查“Least Astonishment” and the Mutable Default Argument
编辑:
进一步检查您的代码后,您实际上可以像这样更改 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,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):
var2 = [var2]
return var1 + var2
lst = my_func(var1=False,3])
print(my_func(var2=[1,3]))
输出
[1,3]
,
这就是我从列表中删除所有 None 的方法:
def my_func(var1=None,var2=None):
lst = []
c = 0
if not isinstance(var1,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,3])
print(lst_)
我使用 for 循环来迭代列表中的每个项目。如果项目 == 无,则代码将其删除。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。