Python在同一行分配值并使用

Python assign value and use on same line

我试着为一个拼图创建一个尽可能短的代码,这个问题浮现在我的脑海中,我试着这样做:

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

所以我想知道,有没有一种方法可以产生一个值,将它赋给一个变量,并在同一行/函数调用中使用这个变量?

编辑:为了澄清问题,我知道这是不推荐的,也不好,也不会产生更快的结果。此外,问题的本质是在同一个函数调用中对同一个变量进行赋值和重用。列表是使用输入生成的,这里的静态列表仅用于示例。在这种情况下,当我已经在某个地方生成了结果时,我希望避免重复相同的任务两次。


可以使用lambda和默认参数对此进行编码。强调这不应该在生产代码中使用,而只是演示在Python中的可能。

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


如果这是一个代码高尔夫项目,那么它必须是一个单独的语句,那么这在Python2中有效:

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

输出

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

否则,

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

比上面列出的理解滥用短得多,也更明智。

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

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

顺便说一句,python数据模型与许多其他语言的数据模型非常不同。python实际上没有作为值容器的变量,它有可能绑定到名称的对象。

注意,在python 3中,zip返回一个迭代器,而不是一个列表,因此如果您想生成一个列表,您需要用list()包装zip调用。


当然,你可以一直这样做:

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

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

有一个相对干净的方法

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

顺便说一句,这个函数在ITertools的配方中定义为成对的,所以pairwise(range(1, 6))可能是最直接的方法。您只需要编写一个从网页导入python函数的导入钩子。-D

还有一个很好的复杂方法

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

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


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

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

由于update()属性返回none,它与对象的逻辑or将是对象本身。