2013-08-22 3 views
5

私は今、pythonで本気でやっています。私は何をしているのか全く分かりません。式math.sqrt()は必要ですか?

import math 
N = input('List primes up to: ') 
N = int(N) 
for i in range(3,N,2): 
    for d in range(2,int(math.sqrt(i))): 
     if i%d==0: 
      break 
else : 
    print(str(i)) 

私はmath.sqrt()一部とimport math部分の両方に保存されない限りsqrt()機能が動作しませんでした。以下は、私は罰金とかなり迅速に動作しているようだこれは、素数を表示するために書いた小さなプログラムです。また、シェルに物を入力していたときに、sqrt()の代わりにmath.sqrt()を使用した場合にのみ機能しました。

シンプルなことのために長い質問がありました:シェルとプログラムファイル(それぞれ異なるかもしれませんが)のために、ある種の#include <math.h> --esque行がありますか?私は入力を避けることができます数学モジュールの関数を使用するたびに 'math.'の部分が表示されますか? (私はどこかに帽子がmath.sqrt()の代わりにsqrt()を使用するプログラムを読んだ誓うので、しかし、そうでないかもしれない。。)(?それは右、モジュールです)

+1

使用する経験則は、「定義されている変数は*あなたが定義したものだけです」です。これに関する良いことは、有効な名前が何であるかすぐに知ることができることです。つまり、 'import'文は1つの変数しか定義しません。ローカルにしたい場合は、 'sqrt = math.sqrt'を実行することができます。 – katrielalex

+2

'int(i ** .5)'と書くこともできます。 – Hyperboreus

+0

好奇心がかからず、sqrt()がi ** 5と定義されているか、それとも良い/悪いですか? –

答えて

5

をさて、あなたはこのように関数を直接インポートすることができます。

from math import sqrt 
# elsewhere 
sqrt(n) 

あなたも、モジュールからすべてをインポートすることができます。

from math import * 

を使用すると、モジュールのプレフィックスを使用してmath.sqrtを言わなければならないだろうというように。しかし、2つのモジュールが同じ名前の関数を定義している場合(実際には非常に頻繁に起こる)、名前の衝突が起こらないようにすることをお勧めします。要するに、これは好ましい方法である:

import math 
# elsewhere 
math.sqrt(n) 
+1

math.sqrt(n)のままにする理由を明確にするために、他のモジュールがsqrt(n)という名前の関数を実装する可能性があります。名前空間の衝突が発生し、他のモジュールsqrtを使用することになります。これは、非常に非効率的に、または間違って、またはシステムをクラッシュさせる可能性があります。これは、開発者がその方法を決定したからです。だから将来、別の開発者が操作する可能性のある長命のコードについては、完全なモジュール名を使うべきです。 –

+0

'math'モジュールはとても便利だから' from math import * 'でインポートする* only *モジュールです。その他は他の2つのオプションのいずれかを使用します。 –

+0

'math.sqrt'より' from math import sqrt'を好むあいまいな理由があります。後者はあなたが名前を取った場所を示しますが、前者はdictironary lookupを必要としません。ワイルドカードを使用しない限り、検索でもインポート行が見つかるため、特定のインポートは気にしません。 –

1

試してみてください。

from math import sqrt 

か、あなたはmathモジュール内の名前のすべてをしたい場合:のいずれかを使用して

from math import * 

2つの方法でmath.sqrt(n)の代わりにsqrt(n)を行うことができます。

ただし、2番目の方法では、mathモジュールですべての名前がインポートされます。通常は、最初の例のように必要なものだけをインポートする方がよいでしょう。

+0

すべてをインポートする際の短所は何ですか?より高いレベルで速度に著しい影響を及ぼしますか? –

+0

@ Thornshadow17432、それは名前の衝突を防ぐためです。 'math import import *'から 'mylogger import * 'の次の行で' 'log''と定義するとどう思いますか? –

+1

@ Thornshadow17432 - また、よりクリーンで簡潔なコードになります。アナロジーは写真をぶら下げている可能性があります。写真を掛けるために、私はハンマーと爪を使います。ハンマー、釘、ドライバー、鋸、プライヤー、ラチェットセットではありません。違いを見ます? :) – iCodez

関連する問題