【问题标题】:Question about defining functions in Python [duplicate]关于在 Python 中定义函数的问题 [重复]
【发布时间】:2019-03-12 14:23:05
【问题描述】:

我目前正在研究 Head First Python,并开始着手定义函数。下面这个程序的目标是创建一个函数 print_lol() ,它接受一个参数:要在屏幕上显示的列表。最终生效的代码如下:

def print_lol(the_list):
    for each_item in the_list:
        if isinstance(each_item,list):
            print_lol(each_item)
        else:
            print(each_item)

因此,如果我们输入如下列表:

movies=["The Holy Grail", 1975, "Terry Jones & Terry Gilliam", 91, ["Graham Chapman", ["Michael Palin", "John Cleese", "Terr Gilliam", "Eric Idle", "Terry Jones"]]]

只会输出这个数组中的所有条目。

我的问题是,为什么第四行中的 print_lol(each_item) 有效?我知道逻辑是程序将查看每个项目,如果它不在列表中,它只会打印该项目,但如果它是计算机如何知道 print_lol 是什么?我认为第一行也不能充分解释 print_lol。 print_lol 是 Python 3 自带的命令吗?

【问题讨论】:

  • 在编程中搜索递归函数的定义(它是一个调用自己的函数)
  • 当一个脚本首先被执行时,def 和后面是一个定义(但不执行)函数的命令。然后在全局命名空间中输入名称为print_lol 的函数。稍后调用该函数时,该定义是现成的。

标签: python python-3.x


【解决方案1】:

您在第 1 行声明了一个您选择调用 print_lol 的函数,并在第 4 行从其内部递归调用它。 print_lol 不是 python 中的命令,它实际上是您在提供的代码中声明的函数。

非常简化,想想函数print_lol 就像它为每个递归调用脱掉一层列表,直到它不再是一个列表,而只剩下字符串。然后打印这些字符串。

【讨论】:

    【解决方案2】:

    在 python 中,它在运行时解析名称。

    你可以这样写一个函数

    def f():
        return k()
    

    代码没问题,但函数执行时k必须存在于运行时。

    发生的情况是“def f”在全局符号列表中插入一个名为 f 的条目,因此在运行时找到 f() 时,会在全局符号中搜索“f”,在您的示例中将是在那里,因为它是之前定义的。

    【讨论】:

      猜你喜欢
      • 2011-05-26
      • 2010-12-23
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 2020-07-23
      • 1970-01-01
      相关资源
      最近更新 更多