【问题标题】:Calling python functions without running from the editor在不从编辑器运行的情况下调用 python 函数
【发布时间】:2015-08-17 13:20:20
【问题描述】:

请原谅我所知道的一个非常基本的问题,但我无法自己解决。

我正在尝试将我的数据分析从 Matlab 切换到 Python,并且我正在努力解决一些非常基本的问题:在 Matlab 中,我在编辑器中编写了一个函数,要使用该函数,我只需从命令行,或在其他函数中。我在matlab编辑器中编写的函数在函数定义行有一个名字,一般函数名最好和.m文件名匹配,以免混淆。

我不明白 Python 中的函数有何不同,因为我在那里没有成功地翻译相同的方法。

例如,如果我在 Python 编辑器中编写一个函数(我使用的是 Python 2.7 和 Spyder),那么简单地保存 .py 文件并从 Python 终端通过其名称调用它是行不通的。我收到“未定义函数”错误。但是,如果我在 Spyder 的编辑器中执行该函数(使用“运行文件”按钮),不仅代码可以正确执行,从那时起,该函数也可以直接从终端调用。

那么……我做错了什么?我完全理解使用 Python 不会在各方面都与 Matlab 相同,但似乎我正在尝试做的事情并非不合理。我只是希望能够编写函数并从 python 命令行调用它们,而不必先通过编辑器运行每个函数。我敢肯定我的错误在这里一定很简单,但是在网上做了很多阅读并没有让我得到答案。

感谢您提供任何信息!

【问题讨论】:

  • 你必须import函数!
  • 也作为奖励提示PyCharm 是优秀且免费的 IDE

标签: python function


【解决方案1】:

如果您想在 Python 中使用特定文件中定义的函数,您需要先“导入”该文件。这类似于在该文件中运行代码。 Matlab 不需要您这样做,因为它会搜索具有匹配名称的文件并自动为您读取代码。

例如,

myFunction.py 是一个包含

的文件
def myAdd(a, b):
    return a + b

为了从 Python 命令行或其他文件中访问此函数,我将键入

from myFunction import myAdd

然后在这个会话中我可以输入

myAdd(1, 2)

有几种使用导入的方法,请参阅here

【讨论】:

    【解决方案2】:

    您需要检查您的 python 脚本中的__main__

    def myFunction():
      pass
    
    if __name__ == "__main__":
      myFunction()
    

    然后你可以像这样从终端运行你的脚本

    python myscript.py
    

    另外,如果你的函数在另一个文件中,你需要导入它

    from myFunctions import myFunction
    myFunction()
    

    【讨论】:

      【解决方案3】:

      Python 没有 MATLAB 的“每个文件一个函数”的限制。您可以在给定文件中拥有任意数量的函数,并且所有这些函数都可以从命令行或其他函数中访问。

      Python 也没有遵循 MATLAB 的做法,即始终自动使其可以找到的每个函数始终可用,这往往会导致函数名冲突(两个函数同名)。

      相反,Python 使用“模块”的概念。模块只是一个文件(您的 .py 文件)。该文件可以有零个或多个函数、零个或多个变量以及零个或多个类。当您想使用该文件中的某些内容时,只需将其导入即可。

      假设你有一个文件'mystuff.py':

      X = 1
      Y = 2
      
      def myfunc1(a, b):
         do_something
      
      def myfunc2(c, d):
         do_something
      

      如果你想使用它,你可以输入import mystuff。然后,您可以访问 mystuff 中的任何变量或函数。要拨打myfunc2,您可以拨打mystuff.myfunc2(z, w)

      基本上发生的情况是,当您键入import mystuff 时,它只是执行文件中的代码,并使所有从mystuff.<varname> 得到的变量都可用,其中<varname> 是变量的名称。与 MATLAB 不同,Python 函数被视为任何其他变量,因此可以像访问任何其他变量一样访问它们。类也是如此。

      还有其他导入方式,例如from mystuff import myfunc

      【讨论】:

      • 谢谢你;您的回答确实引起了我的困惑,这是由于 Python 中不存在 Matlab 的“每个文件 1 个函数”限制而引起的。所以现在我必须弄清楚如何同时导入在单独文件中编写的一堆函数,因为似乎坚持每个文件只有一个函数(通常)会更容易调试(至少对我来说)。但我会自己解决。
      • 每个文件只有一个函数没有任何好处。它根本不会使事情更容易调试。它只会让事情变得井井有条。请注意,您可以使用称为 packages 的概念(最新版本的 MATLAB 复制了该概念)将文件组织到文件夹中。您可以将__init__.py 文件(可以为空)放在文件夹中,然后可以像导入模块一样导入该文件夹。另外__init__.py文件还可以导入东西,所以你可以在文件夹里有功能,然后__init__.py拉进来方便访问。
      【解决方案4】:

      你通过运行 python 程序来运行它们

      python program.py
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-05
        • 1970-01-01
        相关资源
        最近更新 更多