Python 循环
def merge(l1,l2):
i=0;
while((l1[i]!=none)||(l2[i]!=none)):
语法错误:无效的语法
作为一个新手,我搞不清楚上面的代码哪里出错了。
2 个回答
5
更“Pythonic”的写法可能是这样的(因为看起来你是在遍历两个列表,直到其中一个遇到'None'值):
for l1val,l2val in zip(l1,l2):
if l1val is None or l2val is None:
break
... rest of while loop goes here, using l1val and l2val
instead of l1[i] and l2[i]
其实,那个None值看起来有点奇怪。如果这是你加在列表末尾的东西,用来判断何时到达列表的末尾,那就没必要了——直接使用Python自带的遍历功能就行(for循环会自动在遍历到列表的末尾时停止)。*
for l1val,l2val in zip(l1,l2):
... body of while loop goes here, using l1val and l2val
instead of l1[i] and l2[i]
*-它们并不是“真的”自动停止——列表迭代器会抛出一个叫做StopIteration的异常,for循环会捕捉到这个异常,作为停止循环的信号。
我的水晶球变得模糊了,但你方法名中的一个线索是“merge”。假设merge接收两个列表,每个列表都是整数的列表,而“merge”的意思是返回一个新列表,里面是l1和l2中对应值的和。下面是用for循环写的merge:
def merge(l1, l2):
retl = []
for v1,v2 in zip(l1, l2):
retl.append(v1+v2)
return retl
作为新手,你应该学习并对一个叫“列表推导式”的概念感到非常熟悉。使用列表推导式,你可以把你的merge方法简化成这样:
def merge(l1, l2):
return [v1+v2 for v1,v2 in zip(l1, l2)]
这和之前的函数是等价的——请仔细研究这些,看看它是怎么工作的。最后,在Python的鸭子类型的闪光时刻,直接运行merge,但这次传入一个列表的列表,而不是一个整数的列表。(留给提问者自己去做。)
14
把 ||
替换成 or
,把 None
改成大写(并去掉分号):
def merge(l1, l2):
i = 0
while l1[i] != None or l2[i] != None:
pass
(你可以看到,括号也是多余的。)
此外,!= None
可以改成 is not None
:
while l1[i] is not None or l2[i] is not None:
(感谢 @SilentGhost 提醒这一点。)