Python在同一行

时间:2016-08-28 12:28:43

标签: python assign

我正在尝试为拼图创建一个尽可能短的代码,并且想到尝试做这样的事情时会想到这个问题:

zip(l=[1,2,3,4,5],l[1:])

所以我想知道,有没有办法生成一个值,将它分配给一个变量并在同一行/函数调用中使用该变量?

编辑:为了澄清事情,我知道这件事不推荐也不好,也不会产生更快的结果。此外,问题的实质是在同一函数调用中赋值和重用相同的变量。该列表是使用输入生成的,此处的静态列表仅用于示例。在这样的情况下,我想避免重复相同的任务两次,而我已经在某处产生了结果。

4 个答案:

答案 0 :(得分:2)

如果这是代码高尔夫的事情,所以必须是单个语句,那么这适用于Python 2:

print[zip(l,l[1:])for l in[[1,2,3,4,5]]][0]

<强>输出

[(1, 2), (2, 3), (3, 4), (4, 5)]

否则,

l=[1,2,3,4,5];print zip(l,l[1:])

比上面显示的列表理解滥用更短,更明智。

C系列中的许多语言都允许分配表达式中的变量。这可能很方便,但它也导致了许多错误,如果在if条件(例如)内检测到赋值,大多数现代编译器都会生成警告。

这是一个故意的设计决定,不允许在Python中使用那种东西。因此,Python赋值语句不是表达式,因此它没有值。

BTW,Python数据模型与许多其他语言完全不同。 Python doesn't really have variables是值的容器,它包含可能绑定到名称的对象。

请注意,在Python 3 zip中返回迭代器而不是列表,因此如果要生成列表,则需要使用zip包裹list()调用。< / p>

答案 1 :(得分:2)

您可以使用lambdas和默认参数来编码高尔夫。强调这不应该在生产代码中使用,而只是展示python中可能的内容。

(lambda l=[1, 2, 3]: zip(l, l[1:]))()

答案 2 :(得分:1)

这是一个黑客,但不是pythonic。实际上,因为您只需要在全局命名空间中创建一个对象,就可以通过预期的对象更新命名空间。

>>> zip(globals().update(a=[1, 2, 3]) or a, a[1:])
[(1, 2), (2, 3)]

由于update()属性返回None,因此其对象的逻辑or将是对象本身。

答案 3 :(得分:1)

当然,你总是可以这样做:

l = range(1, 6); zip(l, l[1:])

但我猜这不是你想要的。 : - )

有一种相对干净的方式

(lambda l: zip(l, l[1:]))(range(1, 6))

BTW该函数在itertools recipes中成对定义,因此pairwise(range(1, 6))可能是最直接的方式。您只需要编写一个从Web页面导入Python函数的导入钩子。 :-D

并且有一种不错的方式

next(zip(l, l[1:]) for l in [range(1, 6)])

如果你想要更多的想法,那就这么说吧。 : - )