Ser*_*nin 1 python lambda list
我想制作一个"走路"的模型.

所以我创建了8个函数:
g0 = lambda ct: ct.append((lambda (x,y): (x-1,y))(ct[-1]))
g1 = lambda ct: ct.append((lambda (x,y): (x-1,y+1))(ct[-1]))
g2 = lambda ct: ct.append((lambda (x,y): (x,y+1))(ct[-1]))
g3 = lambda ct: ct.append((lambda (x,y): (x+1,y+1))(ct[-1]))
g4 = lambda ct: ct.append((lambda (x,y): (x+1,y))(ct[-1]))
g5 = lambda ct: ct.append((lambda (x,y): (x+1,y-1))(ct[-1]))
g6 = lambda ct: ct.append((lambda (x,y): (x,y-1))(ct[-1]))
g7 = lambda ct: ct.append((lambda (x,y): (x-1,y-1))(ct[-1]))
Run Code Online (Sandbox Code Playgroud)
但当我尝试应用任何功能时,我得到None:
print g0([(50,50)])
None
Run Code Online (Sandbox Code Playgroud)
好吧,Iet尝试更传统的方式:
def g0(ct):
ct.append((lambda (x,y): (x-1,y))(ct[-1]))
return ct
Run Code Online (Sandbox Code Playgroud)
这是按预期工作的:
[(50, 50), (49, 50)]
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试
def g0(ct):
return ct.append((lambda (x,y): (x-1,y))(ct[-1]))
Run Code Online (Sandbox Code Playgroud)
结果也是None,为什么?
你的lambda函数将一个元素附加到一个列表,它不返回任何内容(None):
g0 = lambda ct: ct.append((lambda (x,y): (x-1,y))(ct[-1]))
Run Code Online (Sandbox Code Playgroud)
更确切地说,它不返回任何内容,因为它ct.append(...)是一个返回的方法,None而你的lambda返回返回的内容ct.append(...).
在第二个示例中,您实际上是返回列表,因此它可以按预期工作:
def g0(ct):
ct.append((lambda (x,y): (x-1,y))(ct[-1]))
return ct
Run Code Online (Sandbox Code Playgroud)
但是,要小心,因为即使您不返回列表,您的列表实际上也会被更改.
你也在问是否可以重写lambda函数来返回列表...嗯,是的,但如果有人问你这个问题,请不要提我的名字:
>>> g0 = lambda ct: (ct.append((lambda (x,y): (x-1,y))(ct[-1])) or ct)
>>> print g0([(50,50)])
[(50, 50), (49, 50)]
Run Code Online (Sandbox Code Playgroud)
代码不容易阅读,我建议你改用函数.
此外,这个问题与您的问题有关:为什么list.append返回None?
list.append()就地修改列表,就像直接在底层可变对象上运行的所有Python标准库方法一样,该方法返回None发出信号.
您的lambda返回不是列表对象,而是结果ct.append(); 例如None.您有两种选择:
不要改变原始列表,而是返回一个新列表:
g0 = lambda ct: ct + [(lambda (x,y): (x-1,y))(ct[-1])]
Run Code Online (Sandbox Code Playgroud)附加到原始列表并链接原始列表对象or以返回它而不是None:
g0 = lambda ct: ct.append((lambda (x,y): (x-1,y))(ct[-1])) or ct
Run Code Online (Sandbox Code Playgroud)演示:
>>> ct = [(50,50)]
>>> g0 = lambda ct: ct + [(lambda (x,y): (x-1,y))(ct[-1])]
>>> g0(ct)
[(50, 50), (49, 50)]
>>> ct
[(50, 50)]
>>> g0 = lambda ct: ct.append((lambda (x,y): (x-1,y))(ct[-1])) or ct
>>> g0(ct)
[(50, 50), (49, 50)]
>>> ct
[(50, 50), (49, 50)]
Run Code Online (Sandbox Code Playgroud)
第一个版本使原始列表不受影响; 返回一个新的列表对象.第二种方法改变了原始列表; 返回值并且ct都指向同一个对象.
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |