当前位置: 首页 > 面试题库 >

它是pythonic:命名lambdas

长孙骏
2023-03-14
问题内容

我开始欣赏lambda表达式在python中的价值,尤其是在函数编程map,函数返回函数等方面。但是,我也一直在函数中命名lambda,因为:

  • 我多次需要相同的功能,并且不想重复代码。
  • 该功能特定于其出现的功能。它不需要其他地方。

当遇到满足以上条件的情况时,我一直在编写一个命名的lambda表达式,以进行DRY和狭义范围功能。例如,我正在编写一个在某些numpy数组上运行的函数,并且我需要对传递给该函数的所有数组进行适度繁琐的索引编制(可以很容易地放在一行上)。我编写了一个名为lambda表达式来进行索引编制,而不是编写整个其他函数或在整个函数定义中多次复制/粘贴索引。

def fcn_operating_on_arrays(array0, array1):
    indexer = lambda a0, a1, idx: a0[idx] + a1[idx]

    # codecodecode

    indexed = indexer(array0, array1, indices)

    # codecodecode in which other arrays are created and require `indexer`

    return the_answer

这是对python的lambda的滥用吗?我应该吸收它并定义一个单独的功能吗?


问题答案:

这不是Pythonic,PEP8不建议这样做:

始终使用def语句而不是将lambda表达式直接绑定到标识符的赋值语句。

是:

def f(x): return 2*x

没有:

f = lambda x: 2*x

第一种形式意味着结果函数对象的名称专门'f'代替了generic
'<lambda>'。通常,这对于回溯和字符串表示形式更为有用。使用赋值语句消除了lambda表达式可以提供的优于显式def语句的唯一好处(即,它可以嵌入较大的表达式中)

经验法则是考虑其定义:lambdas表达式是匿名函数。如果您命名,它将不再是匿名的。:)



 类似资料:
  • 在Go标准sql库中,类型的方法定义如下: 新的(未命名的)语句由以下人员编写: 连接池是抽象的,不能直接访问 在单个连接上准备事务 如果在Station执行时连接不可用,将在新连接上重新准备连接 类型未定义任何方法。新命名的prepared语句由以下人员编写: 操作直接在连接池上 在池的所有连接上准备事务 没有明确的方法如何执行准备好的语句 在Github的评论中,作者更好地解释了pgx和数据库

  • 问题内容: 我已经创建了文件夹并在其中初始化了virtualenv实例。 当我运行时,它将按原样显示已安装的软件包。 现在我想重命名为。 但是,当我跑步时 提示未安装pip。如何在不破坏环境的情况下重命名项目文件夹? 问题答案: 您需要调整安装以使用相对路径。为此提供了选项。从文档: 通常,环境与特定路径相关。这意味着您无法移动环境或将其复制到另一台计算机。您可以使用以下命令修复环境以使其可重定位

  • 问题内容: 这是我的方法: 表名是小写,下划线的用途来分隔词语,并且是单数(例如,等 我通常(并非总是)具有自动增量PK。我用下面的约定:(例如,等)。 当表包含作为外键的列时,我只需从它来自的任何表中复制该键的列名。例如,假设表格具有FK (的PK )。 在定义FK来强制引用完整性时,我使用以下代码:(例如,扩展示例3,它将是)。由于这是表名/列名的组合,因此可以保证它在数据库中是唯一的。 我按

  • 命名 程序设计的真正难题是替事物命名及使缓存失效。 ——Phil Karlton 标识符使用英文命名。 # 差 - 标识符使用非 ASCII 字符 заплата = 1_000 # 差 - 标识符使用拉丁文写法的保加利亚单词 zaplata = 1_000 # 好 salary = 1_000 符号、方法、变量使用蛇底式小写(snake_case)。 # 差 :'some symbol' :So

  • Names 命名 Names are as important in Go as in any other language. They even have semantic effect: the visibility of a name outside a package is determined by whether its first character is upper case. I

  • 通用的约定 尽可能遵守 Apple 的命名约定,尤其是和 内存管理规则 (NARC) 相关的地方。 推荐使用长的、描述性的方法和变量名。 推荐: UIButton *settingsButton; 不推荐: UIButton *setBut;