【问题标题】:Sould I write a function inside of a function or write them all in the global frame? [duplicate]我应该在函数内部编写函数还是将它们全部编写在全局框架中? [复制]
【发布时间】:2018-08-28 05:55:41
【问题描述】:

不是一个复杂的问题,但我找不到明确的答案。

例如,如果我想找出数字列表中素数的个数:

def count_prime(lst):
    """lst is a list of integers"""

    def isPrime(n):
        return all(n % div != 0 for div in range(2, int(n**0.5) + 1)) if n > 1 else False

    result = 0
    for num in lst:
        if isPrime(num):
            result += 1

    return result

这看起来很简单,但是我把isPrime(n)放在了main函数里面。

对比如何:

def isPrime(n):
    return all(n % div != 0 for div in range(2, int(n**0.5) + 1)) if n > 1 else False

def count_prime(lst):
    """lst is a list of integers"""

    result = 0
    for num in lst:
        if isPrime(num):
            result += 1

    return result

我的问题是:这有什么不同吗?首选哪一个?

【问题讨论】:

  • @match 我想这主要是问函数返回一个新函数的高阶函数?和我的问题不太相似?
  • 如果你在多个地方使用它,我会在全局范围内定义它,而不仅仅是在一个函数中。
  • 链接的问题展示了嵌套函数和顶级函数之间的最大区别,这也是使用它们的最大原因——闭包。局部函数可以使用来自外部函数的局部变量。这意味着您可以使用相同的代码创建不同的“加法器”函数来添加不同的数字。但你的问题更笼统——除了闭包之外,还有使用嵌套函数的理由吗?所以也许它应该重新打开。
  • 或者你应该问一个更具体的问题,比如:即使我没有(链接)中的闭包,使用嵌套函数是否有任何风格或可读性?或者:当嵌套函数和顶级函数具有相同的整体效果时,它们之间是否存在性能差异?或者:实现(如果重要的话,在 CPython 中)在创建和调用此函数的嵌套版本和顶级版本方面有何不同?如果您知道您对哪一个感兴趣,它们似乎都不太可能被关闭 - 但当然首先要自己搜索副本。
  • @internet_user 但是直到我意识到我将来会写一些东西,我才会知道,对吧?

标签: python function nested-function


【解决方案1】:

我认为这两种方法都有效。 isPrime 非常小,可以轻松嵌入。如果你想重用这个函数,全局定义它是有意义的。

【讨论】:

  • “如果你想重用”在这里很重要,但我认为函数的大小是一个红鲱鱼,很少是关键问题,你已经把它放在第一位了。
  • 我认为嵌入函数的长度也是一个问题。如果嵌入函数很长而嵌入函数本身很短,那可能会降低代码的可读性。
猜你喜欢
  • 2012-05-25
  • 2018-01-22
  • 1970-01-01
  • 2020-11-01
  • 2014-11-25
  • 2012-05-09
  • 1970-01-01
  • 2011-04-01
  • 2015-04-03
相关资源
最近更新 更多