Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
改进Python列表切片_Python_List - Fatal编程技术网

改进Python列表切片

改进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(

我想知道为什么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(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