2013-08-22 13 views
5

Właśnie zacząłem wygłupiać się z pytonem dzisiaj; Nie mam absolutnie pojęcia, co robię. Poniżej znajduje się mały program napisałem do wyświetlania liczb pierwszych, które wydaje się działać dobrze i dość szybko:Czy konieczne jest wyrażenie 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)) 

Funkcja sqrt() nie działa, chyba że trzymane w obu math.sqrt() części i import math części. Również podczas pisania rzeczy w powłoce działało tylko wtedy, gdy użyłem math.sqrt() zamiast sqrt().

Więc ... pytanie zadaje proste pytanie: czy istnieje jakiś rodzaj linii, której mogę użyć, dla powłoki i pliku programu (choć może dla każdej z nich są różne wiersze), aby uniknąć wpisywania część "math." za każdym razem, gdy chcę korzystać z funkcji z modułu matematycznego? (Jest to moduł, prawda?) (Bo przysięgam Czytałem programów gdzieś kapelusz używać sqrt() zamiast math.sqrt() Ale może nie.).

+1

Zasada, której należy użyć, to "jedyne zdefiniowane zmienne to te, które * Ty * zdefiniowałeś". Dobrą rzeczą jest to, że możesz od razu powiedzieć, co jest poprawną nazwą - instrukcja 'import' definiuje tylko jedną zmienną. Jeśli chcesz uczynić go lokalnym, możesz zrobić "sqrt = math.sqrt". – katrielalex

+2

Możesz także napisać 'int (i ** .5)'. – Hyperboreus

+0

Z ciekawości, czy sqrt() jest zdefiniowane jako i **. 5 lub czy jest lepsze/gorsze? –

Odpowiedz

5

Cóż, można importować funkcję bezpośrednio tak:

from math import sqrt 
# elsewhere 
sqrt(n) 

można nawet importować wszystko z modułem:

from math import * 

W ten sposób nie będziesz musiał używać prefiksu modułu i powiedzieć math.sqrt. Zaleca się jednak, aby to zrobić, aby uniknąć ewentualnych konfliktów nazw w przypadku, gdy dwa moduły definiują funkcję o tej samej nazwie (co często zdarza się w praktyce). W skrócie, jest to preferowany sposób:

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

Aby wyjaśnić, dlaczego powinieneś zostawić to jako math.sqrt (n), jeśli nie Aby to zrobić, istnieje szansa, że ​​inny moduł zaimplementuje funkcję o nazwie sqrt (n). Nastąpi kolizja przestrzeni nazw i możesz skończyć używając innych modułów sqrt.Może to zrobić bardzo nieefektywnie, lub niepoprawnie, lub po prostu zawiesić system, ponieważ tak postanowił to zrobić deweloper. Powinieneś więc trzymać pełne nazwy modułów dla każdego długowiecznego kodu, który może zostać zmanipulowany przez innego programistę w przyszłości. –

+0

Moduł 'matematyczny' jest * jedynym *, który importuję z' z importu matematyki * 'tylko dlatego, że jest tak wygodny. Wszyscy inni używają jednej z dwóch pozostałych opcji. –

+0

Istnieje nawet niejasny powód, by preferować 'from math import sqrt' przez' math.sqrt'; podczas gdy ta ostatnia wskazuje, skąd wziąłeś nazwę, ta pierwsza wymaga mniej dictironaryzmu. Dopóki nie użyjesz symbolu wieloznacznego, wyszukiwanie nadal będzie zawierało wiersz importu, więc nie mam nic przeciwko konkretnemu importowi. –

1

Spróbuj:

from math import sqrt 

lub, jeśli chcesz wszystkie nazwy w module math:

from math import * 

zastosowaniem jednej z dwie metody pozwalają teraz po prostu wykonać sqrt(n) zamiast math.sqrt(n).

Należy jednak pamiętać, że druga metoda zaimportuje KAŻDĄ nazwę w module math. Zazwyczaj lepiej jest po prostu zaimportować to, czego potrzebujesz (jak w pierwszym przykładzie).

+0

Jakie są wady importowania wszystkiego? Czy znacząco wpływa na prędkość na wyższym poziomie? –

+0

@ Thornshadow17432, aby zapobiec kolizjom nazw. Załóżmy, że robisz "z importu matematyki *", a następnie w następnym wierszu 'od importu myloggera *' - jak myślisz, co zdefiniujesz jako "log"? –

+1

@ Thornshadow17432 - Ponadto zapewnia czystszy, bardziej zwięzły kod. Analogią może być powieszenie obrazu. Aby powiesić zdjęcie, używam młotka i gwoździa. Nie młotek, gwóźdź, śrubokręt, piła, szczypce i grzechotka. Zobacz różnicę? :) – iCodez

Powiązane problemy