4

我这周刚开始学习 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 积木,但它真的让我大吃一惊。非常感谢大家!

4

4 回答 4

4

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

from yourfile import sqrt

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

于 2012-08-31T17:23:40.147 回答
1

首先,您的循环将始终在其第一次迭代时结束,因为您基本上拥有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

于 2012-08-31T17:27:21.337 回答
0

NameError意味着您的 python shell 无法识别该函数。您可能忘记导入脚本。

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

import myscript

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

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

于 2012-08-31T17:27:21.040 回答
0

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

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 教授的,因此某些给定的代码不适合您。即使你不看所有的视频讲座,他们给出的作业也有合理的难度,阅读作业参考了一些优秀的 Python 学习资料。

Udacity CS101 课程还提供了一个很好的、直接的 Python 编程介绍(也使用 Python 2.x),但我在那里只完成了大约一半的作业。但是,我仍然建议您看一下。

于 2012-08-31T17:35:02.493 回答