【问题标题】:How to migrate lambda from python2 to python3 and handle removed tuple parameter unpacking in python3如何将 lambda 从 python2 迁移到 python3 并处理 python3 中删除的元组参数解包
【发布时间】:2020-01-02 04:59:10
【问题描述】:

我目前正在使用 python 3.5 和 Ubuntu 16.04。我在 python 2 中有一个代码,我想将它用于 python 3.5。代码由 lambda 组成,传递给它的参数(比如说苹果)由 3 个元组组成。第一个元组是一个数组,看起来像这样:

array([[0,0,0,0],[0,0,0,0]],dtype=uint8)  

第二个元组由一对这样的数字组成:

(34,678)  

第三个元组是一个字符串,它包含一个指向特定文件的路径:

'/home/king/abcd.png'  

因此我的论点苹果看起来像这样:

apple=(array([[0,0,0,0],[0,0,0,0]],dtype=uint8),(34,678),'/home/king/abcd.png')

现在我知道 python3 中 lambda 的语法已经改变,同时删除了元组参数解包:

lambda(x, y) : x*x , y*y (python2)  
lambda x_y : x_y[0] * x_y[0] , x_y[1] * x_y[1] (python3)  

现在我的主要问题/问题是我想访问 lambda 中第一个元组的第一行,即访问:

[[0,0,0,0],[0,0,0,0]]  

传递给 lambda 的参数是我们的参数 apple。 我目前的语法是:

lambda(x,y,z) : x[0] , y , z  (pyhton2)  

lambda x_y_z : ? , ? , ?  (python3)

注意:我没有使用/尝试/考虑使用 python 3.8

【问题讨论】:

  • 只是不要使用 lambda。它从来没有必要。

标签: python python-3.x lambda ubuntu-16.04


【解决方案1】:

直接的方法是索引到元组中:

lambda x_y_z: (x_y_z[0][0], x_y_z[1], x_y_z[2])

您可以在任何解包可索引序列参数的情况下机械地应用此方法,例如元组或列表。我认为这有点难看,但作为让您的测试在 Python 3 上通过的第一步,然后再进行更彻底的重构,这很好。

如果你还是手动升级,你可以嵌套 lambdas 来模拟参数解包:

lambda x_y_z: (lambda x, y, z: x[0], y, z)(*x_y_z)

这是否比直接方法更具可读性是有争议的。我发现名称比数字更容易阅读,但代价是表达式更复杂。您可能不应该总是以这种方式升级 lambda,因为嵌套参数元组会占用太多 lambda 来解包。但是这种方法也可以解包迭代器,它不能被直接索引。

请注意,您仍然可以像以前一样通过提前使用def 和赋值语句来解包,这可能是最易读的:

def spam(x_y_z):
    x, y, z = x_y_z
    return x[0], y, z

这种方法也适用于迭代器参数和嵌套元组。但是你每次都必须想出一个合适的函数名。


你能解释一下*x_y_z的含义吗?

在该上下文中(在调用中),* 将可迭代对象的 内容 作为位置参数传递,而不是可迭代对象本身。也许一个例子会有所帮助:

>>> def show_args(*args):
...     print(args)
...
>>> show_args([1,2,3], 'abc')
([1, 2, 3], 'abc')
>>> show_args(*[1,2,3], *'abc')
(1, 2, 3, 'a', 'b', 'c')

【讨论】:

  • 好的。我说得有些对。让我现在试试确切的东西(直接方法)。我觉得很容易。谢谢!
  • 你能解释一下 ` *x_y_z ` 的含义吗? @gilch
猜你喜欢
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 2017-04-26
  • 2016-10-15
  • 1970-01-01
  • 2019-06-06
  • 2013-11-07
  • 1970-01-01
相关资源
最近更新 更多