Python assign value and use on same line
我试着为一个拼图创建一个尽可能短的代码,这个问题浮现在我的脑海中,我试着这样做:
zip(l=[1,2,3,4,5],l[1:])。
所以我想知道,有没有一种方法可以产生一个值,将它赋给一个变量,并在同一行/函数调用中使用这个变量?
编辑:为了澄清问题,我知道这是不推荐的,也不好,也不会产生更快的结果。此外,问题的本质是在同一个函数调用中对同一个变量进行赋值和重用。列表是使用输入生成的,这里的静态列表仅用于示例。在这种情况下,当我已经在某个地方生成了结果时,我希望避免重复相同的任务两次。
- 你知道更短的代码不一定能更快地执行,对吗?那么,您创建这种模糊代码的动机到底是什么呢?
- 我的问题仅仅是出于好奇,动机是创建一个单行代码,仅仅是因为,谁知道人们是否会决定在自己的代码中使用它。当然,我知道上面的内容不在正确的编程范围之内。我只是在追求最短的代码,而不是最快的代码。
- 顺便说一句,对于给定的示例,您可以简单地编写l = zip([1,2,3,4,5],[2,3,4,5])。
- 你可以:a=1;print(a)。
- 我可以,但是列表是由其他init创建的,这里的列表只是举个例子。
- 嗯,问题围绕着同一个函数调用中分配和重用的同一个变量
- @如果您在Windows上玩代码高尔夫,Jordanjambazov的答案可以为您节省一个字符,因为Windows使用两个换行符(回车+换行)。
- 这是给python 2的吗?
- @PM2是的,是的
- 我看不出这个问题的价值所在。唯一可能的结果是错误的代码。
- 我想知道这在Python中是否可行,但我没有找到任何答案。这个问题本身并不是不合理的,所以被问也没问题。它是否会提供坏代码是另一回事。这是一个回答技术问题的地方,而不是教别人如何规划正确的方法——即使这是通过正确的答案实现的。
- @Tigerhawkt3:许多编码人员喜欢代码高尔夫,即使高尔夫代码很少是你想在产品代码中看到的那种东西,高尔夫也可以是一种有趣的方式来学习更多关于算法和语言更模糊的语法特征;它还可以提高人们横向思考编码问题的能力。
- @Tigerhawkt3:(续)我想高尔夫问题不完全是这样的话题,但我不知道有什么禁止它们的,而且这一页上的所有答案都警告说,这些技术不适合制作代码,所以我不认为偶尔高尔夫相关问题的危害。
可以使用lambda和默认参数对此进行编码。强调这不应该在生产代码中使用,而只是演示在Python中的可能。
1
| (lambda l=[1, 2, 3]: zip(l, l[1:]))() |
- 这绝对比我的代码好。但我不常打高尔夫球。:)
- @PM2我只知道在查找允许任意执行(包括进口)的eval的方式时。我刚看了一下我的答案,默认参数甚至都不必要。
- 是的,通过将列表作为普通参数传递给lambda,可以保存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调用。
- 因为他的解决方案比较普遍,所以会保持被Kasramvd接受,但你的解决方案在列表方面要好得多。
- @不必担心,但正如Kasra&;?Ukasz已经说过,用globals()做这种愚蠢的把戏不是个好主意。
当然,你可以一直这样做:
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将是对象本身。
- 而且,拜托,千万不要用真正的代码…
- 如果我错了,请纠正我,但使用非wierd代码,对于a = [1,2,3],我的zip([1,2,3],[1,2,3][1:])的结果将是[(1,2),(2,3)]。
- @?Ukaszrogalski真的!
- @noobdoob检查更新!
- 如果你不在全球范围内?那么呢?
- @Tigerhawkt3首先,本地名称空间总是在封闭作用域(如果有)之后的全局作用域内,所以当您更新全局名称空间时,您也可以简单地访问本地名称空间中的对象,但是如果您的意思是如果我们只想在本地名称空间中更改它,那么基本上不需要这样的任务,当1。您可以简单地通过赋值创建对象,和2。你可以把它当作一个论点。如果已经创建了函数(或任何本地对象),则可以读取stackoverflow.com/questions/1142068/…