Python 在同一行赋值和使用
Python assign value and use on same line
我正在尝试为一个谜题创建一个最短的代码,并且在尝试做这样的事情时想到了这个问题:
zip(l=[1,2,3,4,5],l[1:])
所以我想知道,有没有办法生成一个值,将其分配给一个变量并在同一个 line/function 调用中使用该变量?
编辑:澄清一下,我知道这个东西不推荐也不好,也不会产生更快的结果。此外,问题的本质是在同一个函数调用中分配和重用同一个变量。该列表是使用输入生成的,此处的静态列表仅用于示例。在这种情况下,我想避免重复相同的任务两次,而我已经在某处产生了结果。
这是一种 hack,但不是 pythonic。实际上,因为您只需要在全局命名空间中创建一个对象,您就可以简单地通过您想要的对象更新命名空间。
>>> zip(globals().update(a=[1, 2, 3]) or a, a[1:])
[(1, 2), (2, 3)]
由于 update()
属性 returns None,它与对象的逻辑 or
将是对象本身。
如果这是代码高尔夫,那么它 必须 是单个语句,然后这在 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 赋值语句 不是 表达式,因此它没有值。
顺便说一句,Python 数据模型与许多其他语言的数据模型完全不同。 Python doesn't really have variables 是值的容器,它具有可以绑定到名称的对象。
注意在 Python 3 zip
returns 中是一个迭代器,而不是一个列表,所以如果你想生成一个列表,你需要包装 zip
调用 list()
.
您可以使用 lambda 表达式和默认参数对此进行编码。强调这不应在生产代码中使用,而只是演示 python.
中的可能性
(lambda l=[1, 2, 3]: zip(l, l[1:]))()
当然,您可以随时这样做:
l = range(1, 6); zip(l, l[1:])
但我想这不是您想要的。 :-)
有一种比较干净的方式
(lambda l: zip(l, l[1:]))(range(1, 6))
顺便说一句,该函数在 itertools recipes 中定义为成对的,因此 pairwise(range(1, 6))
可能是最直接的方法。您只需要编写一个从网页中导入 Python 函数的导入钩子。 :-D
还有一个很好的复杂方法
next(zip(l, l[1:]) for l in [range(1, 6)])
如果你想要更多的想法,就直说吧。 :-)
我正在尝试为一个谜题创建一个最短的代码,并且在尝试做这样的事情时想到了这个问题:
zip(l=[1,2,3,4,5],l[1:])
所以我想知道,有没有办法生成一个值,将其分配给一个变量并在同一个 line/function 调用中使用该变量?
编辑:澄清一下,我知道这个东西不推荐也不好,也不会产生更快的结果。此外,问题的本质是在同一个函数调用中分配和重用同一个变量。该列表是使用输入生成的,此处的静态列表仅用于示例。在这种情况下,我想避免重复相同的任务两次,而我已经在某处产生了结果。
这是一种 hack,但不是 pythonic。实际上,因为您只需要在全局命名空间中创建一个对象,您就可以简单地通过您想要的对象更新命名空间。
>>> zip(globals().update(a=[1, 2, 3]) or a, a[1:])
[(1, 2), (2, 3)]
由于 update()
属性 returns None,它与对象的逻辑 or
将是对象本身。
如果这是代码高尔夫,那么它 必须 是单个语句,然后这在 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 赋值语句 不是 表达式,因此它没有值。
顺便说一句,Python 数据模型与许多其他语言的数据模型完全不同。 Python doesn't really have variables 是值的容器,它具有可以绑定到名称的对象。
注意在 Python 3 zip
returns 中是一个迭代器,而不是一个列表,所以如果你想生成一个列表,你需要包装 zip
调用 list()
.
您可以使用 lambda 表达式和默认参数对此进行编码。强调这不应在生产代码中使用,而只是演示 python.
中的可能性(lambda l=[1, 2, 3]: zip(l, l[1:]))()
当然,您可以随时这样做:
l = range(1, 6); zip(l, l[1:])
但我想这不是您想要的。 :-)
有一种比较干净的方式
(lambda l: zip(l, l[1:]))(range(1, 6))
顺便说一句,该函数在 itertools recipes 中定义为成对的,因此 pairwise(range(1, 6))
可能是最直接的方法。您只需要编写一个从网页中导入 Python 函数的导入钩子。 :-D
还有一个很好的复杂方法
next(zip(l, l[1:]) for l in [range(1, 6)])
如果你想要更多的想法,就直说吧。 :-)