4

私は文字通り今週Pythonを学び始めました。(私は1か月でコンピュータサイエンスを新しくします!)

これは、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シェルにsqrt(16)と入力すると、エラーメッセージが表示されます。

NameError: name 'sqrt' is not defined

Python3.1.1を使用しています。私のコードに何か問題がありますか?どんな助けでもいただければ幸いです。ありがとう

更新 さて、皆さんのおかげで、関数をインポートしていないことに気づきました。また、インポートしようとすると、C:\Python31ではなく汎用のマイドキュメントファイルに保存したため、エラーが発生しました。したがって、スクリプトをC:\ Python31 \ squareroot.pyとして保存した後、シェルに入力しました(再起動しました)。

平方根をインポートする

そして、新しいエラーが発生しました!

>>> 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シェルを再度開いて、次のことを行いました。

>>> import squareroota

何も起こらなかった、エラーもなかった、素晴らしい!それから私はこれをしました:

>>> squareroota.sqrta(16)

そしてこれを手に入れました!

16 is a perfect square.
4

わお。これは学校でABCブロックで遊んでいるように見えるかもしれませんが、正直なところ私は心を打たれました。みなさん、ありがとうございました!

4

4 に答える 4

4

はい、実際に関数をシェルにインポートする必要があると思います。

from yourfile import sqrt

気をつけて。シェルにいて変更を加えた場合、それらの変更を表示するには、関数を再インポートする必要があると思います。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 シェルが関数を認識していないことを意味します。スクリプトをインポートするのを忘れた可能性があります。

myscript.pyファイルを(Pythonシェルを起動したディレクトリと同じディレクトリに)保存したと仮定すると、次を使用する必要があります。

import myscript

内部で定義された関数を使用できるようにします。myscript.sqrt関数を実行するには、 を呼び出す必要があることに注意してください。名前空間sqrtでのみ使用できます。myscript

別の方法として、 と入力from myscript import sqrtすることもできます。その場合、myscript.sqrt名前空間で を as として使用できるようにしますsqrt。これで組み込み関数を上書きしないように注意してくださいfrom ... import ......

于 2012-08-31T17:27:21.040 に答える
0

これが元のコードです。実行できるようにクリーンアップされています。最初にフォーマットされたときの問題は、インデントにありました。

while ブロックは、関数 sqrt の def ブロックにあることを示すために、1 レベル (4 つのスペース) の深さでインデントする必要があります。

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クラスが非常に便利であることがわかりました。1 つの非常に重要な注意事項: クラスは Python 3.x ではなく Python 2.x を使用して教えられているため、指定されたコードの一部は適切に機能しません。すべてのビデオ レクチャーを視聴しなくても、課題の難易度はかなり高く、読書課題では優れた Python 学習教材が参照されています。

Udacity CS101 クラスも、Python でのプログラミング (および Python 2.x を使用) の優れた指導的な紹介を提供しますが、そこでの課題の約半分しか取り組みませんでした。それでも見てみることをお勧めします。

于 2012-08-31T17:35:02.493 に答える