改进Python列表切片
我想知道为什么Python的extend/append方法不返回对结果列表的引用。 要用最后一个元素构建列表所有组合的字符串,我想写一个简单的:改进Python列表切片,python,list,Python,List,我想知道为什么Python的extend/append方法不返回对结果列表的引用。 要用最后一个元素构建列表所有组合的字符串,我想写一个简单的: for i in range(l, 0, -1): yield " ".join(src[0:i-1].append(src[-1])) 但是我有:TypeError。而是使用以下带有中间变量的代码: for i in range(l, 0, -1): sub = src[0:i-1] sub.append(
for i in range(l, 0, -1):
yield " ".join(src[0:i-1].append(src[-1]))
但是我有:TypeError
。而是使用以下带有中间变量的代码:
for i in range(l, 0, -1):
sub = src[0:i-1]
sub.append(src[-1])
yield " ".join(sub)
如果我错了,请纠正我。一般的理由是
None
中的返回类型指示列表正在修改
for i in range(l-1, 0, -1):
yield ' '.join(src[:i] + src[-1:])
行
扩展/附加方法在适当位置修改列表,因此不返回列表。Hm,可能会替换:
src[0:i-1].append(src[-1])
与:
要对列表进行操作,然后返回列表,可以使用或结构:
def append_and_return(li, x):
"""silly example"""
return (li.append(x) or li)
在这里,X或Y
计算X,如果X为真,则返回X,否则计算并返回Y。X需要始终为负
但是,如果您只处理临时列表,那么已经建议的连接操作也同样好或更好
编辑:它不是一文不值的
>>> li = [1, 2, 3]
>>> newli = append_and_return(li, 10)
>>> li
[1, 2, 3, 10]
>>> newli is li
True
Python中的变异方法不返回对它们变异的对象的引用的原因可以在principle(简称CQS)中找到。Python没有像Meyer的Eiffel语言那样彻底地应用CQS(因为——根据Python的Zen,aka导入此
,“实用性胜过纯度”):例如,somelist.pop()
返回刚刚弹出的元素(仍然不是刚刚变异的容器;-),而在Eiffel弹出堆栈时没有返回值(在需要弹出并使用top元素的常见情况下,首先使用“查询”查看顶部,然后使用“命令”使顶部消失)
CQS的深层动机并不是真正的“变体应该不会返回任何有用的东西”:而是“查询应该没有副作用”。保持这种区别(无论是严格的还是“作为指导原则而不是规则”)应该有助于你记住它,而且它在某种程度上确实有效(捕捉到一些意外错误)尽管如果你习惯了流畅的“表达式和语句是一样的”语言,有时会感到不方便
Python中CQS(广义地说…)的另一个方面是语句和表达式之间的区别。同样,这不是严格应用的——表达式可以在语句可以使用的任何地方使用,这偶尔会隐藏错误,例如,当有人忘记调用一个函数时,他们需要foo()
,而不仅仅是foo
;-)。但是,例如(与C、Perl等截然不同),在测试某个对象时,您无法轻松地分配该对象(if(a=foo())…
),这有时会带来不便,但会捕获其他类型的意外错误。是的。我理解这一点,但问题是关于处理组合列表的更简短的方法。在c/c++中,我可以使用运算符“,”-在计算结果之前执行多个操作。Python提供了什么?我认为有一个错误-“+”操作符连接两个列表,不向列表中添加元素。是的,在您发布注释之前已修复。是“for I in range(l,0,-1):”应该以相反的顺序迭代src中的所有索引吗?这会更好:“因为我在反向(范围(len(src)):”并且它也会命中0索引。对不起。我想在下面发表评论——这是OP对我的问题的评论。SilentGhost,请不要再唠叨了。我没有更改代码,我更改了我的评论,因为我做了一个thinko。它说X必须始终为真,但我的意思是X必须始终为假(因为我们想要返回Y)。代码没有更改。代码更改了两次,从简单的代码行更改为函数。从或x
到或li
?x->li是一个明显的打字错误。别胡扯了。这是一个完全符合提问者要求的答案。那值-1?
>>> li = [1, 2, 3]
>>> newli = append_and_return(li, 10)
>>> li
[1, 2, 3, 10]
>>> newli is li
True