【问题标题】:Square root function in Python - what's wrong with it?Python中的平方根函数 - 它有什么问题?
【发布时间】:2012-08-31 17:18:13
【问题描述】:

我这周刚开始学习 Python。 (我将在一个月内成为一名计算机科学专业的新生!)

这是我编写的用于计算 x 平方根的函数。

#square root function

def sqrt(x):
    """Returns the square root of x if x is a perfect square.
Prints an error message and returns none if otherwise."""

ans = 0
if x>=0:
    while ans*ans <x:
        ans = ans + 1
        if ans*ans == x:
            print(x, 'is a perfect square.')
            return ans
        else:
            print(x, 'is not a perfect square.')
            return None    
else: print(x, 'is a negative number.')

但是当我保存它并在 Python shell 中键入 sqrt(16) 时,我收到一条错误消息。

NameError: name 'sqrt' is not defined

我使用的是 Python 3.1.1。 我的代码有问题吗? 任何帮助,将不胜感激。 谢谢

更新 好的,感谢你们,我意识到我没有导入该功能。 当我尝试导入它时,我收到了一个错误,因为我将它保存在一个通用的 My Documents 文件而不是 C:\Python31 中。所以在将脚本保存为 C:\Python31\squareroot.py 后,我在 shell 中输入了(重新启动它):

导入平方根

又出现一个新错误!

>>> import squareroot
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    import squareroot
  File "C:\Python31\squareroot.py", line 13
    return ans
SyntaxError: 'return' outside function

意思是我的原始代码中有一个错误!我现在要看看下面的一些建议的更正。如果您发现了其他任何东西,请说。谢谢:)

更新 2 - 成功了!!!!!!!!!!

这就是我所做的。 首先,我使用了 IamChuckB 友好发布的代码的清理版本。我在其中制作了一个新脚本(将函数名称从 sqrt 更改为 sqrta 以区分):

def sqrta(x):
    """Returns the square root of x if x is a perfect square.
Prints an error message and returns none if otherwise."""
    ans = 0
    if x>=0:
        while ans*ans <x:
            ans = ans + 1
        if ans*ans == x:
            print(x, 'is a perfect square.')
            return ans
        else:
            print(x, 'is not a perfect square.')
            return None    
    else: 
            print(x, 'is a negative number.')

重要的是,将其保存为 C:\Python31\squareroota.py(同样,在末尾添加了一个“a”以区分另一个失败的文件。)

然后我重新打开 Python shell 并这样做:

>>> import squareroota

什么都没有发生,没有错误,太棒了!然后我这样做了:

>>> squareroota.sqrta(16)

得到了这个!

16 is a perfect square.
4

哇。我知道这看起来像是在学校里玩 ABC 积木,但它真的让我大吃一惊。非常感谢大家!

【问题讨论】:

  • 你可以使用ans ** 0.5,你知道的。
  • 您必须描述您的工作流程。你所说的 Python shell 是什么意思,你如何运行 shell,你在将它保存到文件和在 shell 中尝试之间做了什么,你做了什么使sqrt 在 shell 中可用,等等。
  • 您是否将此代码保存在文件中?你在python shell中导入了这个吗? (抱歉问这些问题)
  • 缩进在 Python 中很重要,因此请确保您提供的代码与相关代码的格式完全一致
  • def sqrt(x): 行之后缩进所有内容。

标签: python function debugging square-root


【解决方案1】:

是的,我相信您必须将函数实际导入 shell。

from yourfile import sqrt

小心。我认为,如果您在 shell 中并进行了更改,则必须重新导入函数才能显示这些更改。正如德尔南在下面提到的,您可以reload 更改后的文件..

【讨论】:

  • 另外,在同一会话中再次使用 import-ing yourfile 将不起作用。为此,您需要reload
  • 我关闭并重新打开程序,输入:>>> from C:\Users\Win 7\Documents\Python\function_squareroot.py import sqrt - 又得到另一个错误 - SyntaxError: invalid syntax跨度>
  • @user1639304,您需要让 Python 决定使用 Python 路径从何处加载。当您进行更改时,delnan 关于需要reload 是正确的,请参阅stackoverflow.com/questions/11618687/…
  • 谢谢!但是当我输入 >>>import sys 时,没有选项可以在任何地方添加文件 - 很抱歉成为这样的 n00b,但你能告诉我如何将文件添加到列表 sys.path 中吗?
【解决方案2】:

首先,您的循环将始终在其第一次迭代时结束,因为您基本上拥有if (...) return else return。试试这个:

def sqrt(x):
    """Returns the square root of x if x is a perfect square.
       Prints an error message and returns none if otherwise."""
    ans = 0
    if x >= 0:
        while ans * ans <= x:
            if ans * ans == x:
                print(x, 'is a perfect square.')
                return ans
            ans = ans + 1
        print(x, 'is not a perfect square.')
        return None  
    else: print(x, 'is a negative number.')

但请注意,Python 提供了内置的幂运算符:

def sqrt(x):
    return x ** 0.5 

要具体回答您的问题,您必须导入您的函数。如果写入的文件是sqrt.py,要在另一个文件中使用这个函数,你需要from sqrt import sqrt

【讨论】:

    【解决方案3】:

    NameError 表示您的 python shell 无法识别该函数。您可能忘记导入脚本了。

    假设您将文件保存为myscript.py与您启动 python shell 的目录相同),您必须使用:

    import myscript
    

    内部定义的功能可用。请注意,您必须调用myscript.sqrt 才能运行您的函数sqrt:它仅在myscript 命名空间中可用。

    另一种方法是键入from myscript import sqrt:在这种情况下,您可以将myscript.sqrt 作为sqrt 在命名空间中可用。请注意不要使用此 from ... import ...... 覆盖内置函数...

    【讨论】:

    • 我的函数名为 sqrt,但我将文件保存为 function_squareroot.py 。我只是这样做了: >>> import function_squareroot -but got- ImportError: No module named function_squareroot :(
    • 您是否在保存文件的同一目录中启动您的 python shell?
    • 呃,我不这么认为。 shell 提供了一个自动选项来保存在 C:\Python31 文件夹中,但我导航到 My Documents -_-
    • 我应该在某个地方保存以后的文件,这样我就可以输入 import function_squareroot 并自动导入该函数?
    【解决方案4】:

    这是您的原始代码,刚刚清理后可以运行。最初格式化的问题在于缩进。

    while 块应该缩进一级(4 个空格)以表示它在函数 sqrt 的 def 块中。

    在 while 语句中包含 if/else 块意味着每次通过循环时都会进行检查;因此,第一次当 ans 仅等于 1 时,将完成该测试,打印您的输出并返回一个值。我们需要改变这一点。其他几个答案提供了更直接的方式来在 python 中表达这一点,但是,为了尽可能接近您编写的代码,您实际上需要做的就是将 if 块和 else 块移出而块。代码如下:

    def sqrt(x):
        """Returns the square root of x if x is a perfect square.
    Prints an error message and returns none if otherwise."""
        ans = 0
        if x>=0:
            while ans*ans <x:
                ans = ans + 1
            if ans*ans == x:
                print(x, 'is a perfect square.')
                return ans
            else:
                print(x, 'is not a perfect square.')
                return None    
        else: 
                print(x, 'is a negative number.')
    

    示例输入和输出如下所示: 在:

    sqrt(9)
    

    输出:

    9 is a perfect square.
    

    在:

    sqrt(8)
    

    输出:

    8 is not a perfect square.
    

    编辑:在我看来,Python 是一门很棒的第一语言。当我第一次开始使用它时,我发现MIT OpenCourseWare 类非常有用。 一个非常重要的注意事项:该课程是使用 Python 2.x 而不是 3.x 教授的,因此某些给定代码不适合您。即使您没有观看所有视频讲座,assignments they give 难度适中,reading assignments 参考了一些优秀的python学习资料。

    Udacity CS101 课程还为 Python 编程(并且还使用 Python 2.x)提供了很好的定向介绍,但我只完成了大约一半的作业。不过,我仍然建议您看一看。

    【讨论】:

    • 另外,感谢您的建议 - 我目前正在观看 MIT OCW 视频,并且我有几本书,但一旦我完成这些,我一定会看看 Udacity。 (是的,我发现 Python 2.x 和 3.x 之间的差异在我意识到它们存在之前就令人不安 - 当 print 'stuff' 不起作用时我非常恼火。然后我检查了文档并看到了我的 python 版本print('stuff') 括号是强制性的!)
    • @user1639304 太好了!麻省理工学院的东西非常棒。除非您有使用 Python 3.x 的特定原因,否则您可能想在学习时考虑跳到 Python 2.7.3,除非您将在今年秋季参加 3 中教授的课程或类似的课程。我相信您将能够找到更多针对在 2 中学习的文档,然后一旦您精通该语言,您就可以按照 2 到 3 指南进行操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    相关资源
    最近更新 更多