【问题标题】:How to make python lambda return comma operator last one如何使python lambda返回逗号运算符最后一个
【发布时间】:2019-10-27 16:16:16
【问题描述】:

我只想在 python lambda 函数中使用 Javascript comma operator,现在我知道 ()[-1] 适合我。

计算其每个操作数(从左到右)并返回最后一个操作数的值。

在python中

# ignore List comprehension
# [ele['val'] for ele in arr ]

from functools import reduce

arr = [{'id': 1, 'val': 100}, {'id': 2, 'val': 200}]
#
# use tuple ()[-1] result [100, 200]
result = reduce(lambda total, ele: (total.append(ele['val']), total)[-1], arr, [])

# use list[][-1] result [100, 200]
result = reduce(lambda total, ele: [total.append(ele['val']), total][-1], arr, [])

result1 = reduce(lambda total, ele: total if total.append(ele['val']) else total, arr, [])
# [100, 200]

在 Javascript 中:

// ignore map [{'id': 1, 'val': 100}, {'id': 2, 'val': 200}].map(e=>e.val)
[{'id': 1, 'val': 100}, {'id': 2, 'val': 200}].reduce((total, ele) => (total.push(ele.val), total), [])
// [100, 200]

【问题讨论】:

  • python 和 javascript 有不同的语法,为什么你认为它们是一样的?还有你的预期输出和输入是什么
  • 在 Javascript 中,逗号可以做到这一点。在法语中,“疼痛”的意思是“面包”。这并不意味着您可以在美国的杂货店要求痛苦并期望得到面包,或者您可以在 Python 中使用逗号并期望得到 Javascript 行为。
  • @user2357112 如果我要求疼痛,我希望得到一个指关节三明治,该死!
  • 那么,你真正想要的是一个可以在 lambda 中工作的单行表达式吗?

标签: javascript python lambda comma-operator


【解决方案1】:

尝试在 Python 中编写 Javascript 并不会真正奏效,最好以 Python 的方式进行。

作为一般规则,从另一个(或任何其他有限迭代)构建列表的首选方法是使用列表推导,即:

def test(*args):
    return [a for a in args]

但在您的情况下 - 没有转换或过滤 - 有一种更简单的方法:只需将您的序列传递给 list 构造函数:

def test2(*args):
    return list(args)

【讨论】:

    【解决方案2】:

    在Python中,只有一种数据类型:元组,JS没有。

    你可以用 Python 试试:

    a = (1, 2)
    # a is (1, 2)
    b = 1, 2
    # b is also (1, 2), which is tuple
    

    在 JS 中:

    let a = (1, 2)
    // a is 2
    let b = 1, 2
    // SyntaxError: Unexpected number
    

    所以,总而言之:Python 和 JS 都有逗号运算符,但同一个运算符的行为方式可能不同。

    关键是(1, 2)这样的表达式在Python中会被计算成元组(1, 2),而在JS中最后一个值是2

    顺便说一句:Python 确实有逗号运算符:

    请注意,元组不是由括号构成,而是由逗号运算符构成。

    python reference: parenthesized-forms

    【讨论】:

    • 逗号在 Python 中不是运算符
    • @brunodesthuilliers Python 确实有逗号运算符,请参阅我的最新答案。
    • 您确实有一点,因为它在文档的这一部分中确实有资格作为“操作员”-但这确实是我见过的唯一有资格的地方-它没有出现在运算符优先级列表也不在operator 模块中。
    • 但是,如果医生这么说,我不会争论 ;-)
    • @brunodesthuilliers 谢谢。至于为什么没有出现在算子优先级列表或者算子模块中,是不是没有必要?
    猜你喜欢
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 2015-10-05
    • 2013-01-12
    • 1970-01-01
    • 2019-04-25
    • 2020-07-14
    相关资源
    最近更新 更多