2013-08-22 18 views
5

Bugün python ile dalga geçmeye başladım; Ne yaptığım hakkında hiçbir fikrim yok. Aşağıda ben oldukça hızlı bir şekilde ince ve çalışıyor gibi görünüyor asal görüntülemek için yazdığım küçük bir programdır:math.sqrt() ifadesi gerekli midir?

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)) 

Ben math.sqrt() parçası ve import math parçası hem muhafaza sürece sqrt() işlevi çalışmadı. Ayrıca kabukta bir şeyler yazarken, sadece sqrt() yerine math.sqrt() kullanmış olsaydım işe yaradı.

Yani ... basit bir şey için uzunca sarhoş bir soru: Kabuğun ve program dosyasının (her biri için belki de farklı çizgiler olsa da) kullanabileceğim bir çeşit #include <math.h> -esk hattı var mı? Matematik modülünden fonksiyon kullanmak istediğimde 'math.' kısmı? (Ben bir yerde şapka math.sqrt() yerine sqrt() kullandığınız programları okudum yemin Çünkü Ama belki de değil..) (? Doğru, bir modül var)

+1

Kullanılacak başparmak kuralı "tanımlanan * tanımladığınız tek değişkenler". Bununla ilgili iyi bir şey, geçerli bir adın ne olduğunu hemen söyleyebilmenizdir - bir 'import' ifadesi yalnızca bir değişken tanımlar. Yerel yapmak isterseniz, 'sqrt = math.sqrt' yapabilirsiniz. – katrielalex

+2

Ayrıca sadece int (i ** .5) 'yazabilirsiniz. – Hyperboreus

+0

Merak ediyorum, sqrt() i ** 5 olarak tanımlanmış mı yoksa daha iyi/kötü mi? –

cevap

5

Eh, böyle bir işlev doğrudan aktarabilirsiniz:

from math import sqrt 
# elsewhere 
sqrt(n) 

hatta modülün her şeyi alabilirsiniz:

from math import * 

modül öneki kullanmak ve math.sqrt söylemek zorunda olmayacak şekilde. Ancak, iki modülün aynı ada sahip bir işlevi tanımlaması durumunda olası ad çatışmalarını önlemek için bunu yapmanız önerilir (pratikte oldukça sık yapılan bir şey). Kısacası, bu tercih edilen yoldur:

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

Neden olmasın diye math.sqrt (n) olarak bırakmanız gerektiğini açıklığa kavuşturmak için Bunu yaparsanız, başka bir modülün sqrt (n) olarak da adlandırılan bir işlevi uygulayabilme şansı vardır. Bir isim alanı çarpışması olacak ve diğer modülleri sqrt kullanarak bitirebilirsiniz.Bu, sisteminizi aşırı derecede verimsiz veya yanlış bir şekilde yapabilir veya sisteminizi kilitleyebilir, çünkü geliştiricinin bunu yapmaya karar vermesi bu şekilde olabilir. Bu nedenle, gelecekte başka bir geliştirici tarafından manipüle edilebilecek herhangi bir uzun ömürlü kod için tam modül adları ile sopa gerekir. –

+0

"Matematik" modülü, yalnızca bu kadar kullanışlı olduğu için matematik içe aktarma yöntemiyle * içe * aktardığım *. Diğerleri diğer iki seçeneklerden birini kullanır. –

+0

'math.sqrt' üzerinden matematik içe aktarma sqrt'undan 'tercih edilmesinin bir nedeni bile var; İkincisi, ismi aldığınız yeri belirtirken, eski bir diktatörlük arayışına daha az ihtiyaç duyar. Joker karakterini kullanmadığınız sürece, arama hala içe aktarma satırını bulacaktır, dolayısıyla belirli içe aktarma işlemini umursamıyorum. –

1

Dene:

from math import sqrt 

ya, sen math modülünde bütün isimleri istiyorsanız: birini kullanarak

from math import * 

İki yöntem şimdi math.sqrt(n) yerine sqrt(n) yapmanıza izin verecektir.

Ancak, ikinci yöntemin, HER adın math modülünde içe aktarılacağını unutmayın. İhtiyacınız olan şeyleri içe aktarmak genellikle daha iyidir (ilk örnekte olduğu gibi).

+0

Her şeyi ithal etmek için olumsuzluklar nelerdir? Yüksek seviyedeki hızı önemli ölçüde etkiler mi? –

+0

@ Thornshadow17432, isim çarpışmaları önlemek için. Yaptığınızı varsayalım '' matematik aktarımından '' sonra bir sonraki satırda '' mylogger içe aktarma * '' - 'log' 'ne olarak tanımlanacaksınız? –

+1

@ Thornshadow17432 - Ayrıca, daha temiz, daha özlü kodlar için yapar. Bir benzetme bir fotoğrafın asılması olabilir. Resim asmak için çekiç ve çivi kullanıyorum. Çekiç, çivi, tornavida, testere, pense ve mandal seti değil. Farkı gör? :) – iCodez

İlgili konular