Python 循环

4 投票
2 回答
35869 浏览
提问于 2025-04-15 21:46
 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 提醒这一点。)

撰写回答