2010-05-20 13 views
9

Jestem programistą java, ale teraz wchodzę w "królestwo pythona" dla pewnych rzeczy, dla których Python działa lepiej. Jestem pewien, że dobra część mojego kodu wyglądałaby dziwnie dla programisty Pythona (na przykład używając nawiasów na każdym, jeśli).Wskazówki dla czytelnika w języku Python dla programisty Java

Wiem, że każdy język ma swoje własne konwencje i zestaw "nawyków". Więc, z punktu widzenia czytelności, jakie są konwencje i praktyki, które są "drogą do zrobienia" w Javie, ale tak naprawdę nie są "pythonic way" do robienia rzeczy?

+0

Miałem dokładnie to samo pytanie :) – Snehal

+0

Zachowaj otwarty umysł ... Python z natury ma być czytelny ... będzie jasne przez zrozumienie niektórych pojęć takich jak krojenie, lambda, dekoratory itp. – Perpetualcoder

Odpowiedz

3

Najlepszym miejscem na rozpoczęcie jest prawdopodobnie PEP-8, który jest oficjalnym przewodnikiem po Pythonie. Obejmuje wiele podstaw tego, co uważane jest za standard.

+0

Czy to tylko ja, czy też w ciągu ostatnich kilku dni odniesiono się do PEP-8 nieco częściej niż wcześniej? –

+0

Od dłuższego czasu odnosi się do tego bardzo często. – Amber

0

"Wszystko jest klasą" to idiom języka Java, który w szczególności nie jest idiomem Pythona. (Prawie) wszystko może być klasą w Pythonie, a jeśli jest to dla ciebie wygodniejsze, to przejdźmy do niego, ale Python nie wymaga takiej rzeczy. Python nie jest językiem czysto obiektowym, aw moim (ograniczonym) doświadczeniu dobrze jest wziąć to do serca.

5

Kiedy Jacob Hallén zauważył, że najlepszy styl Pythona następuje po odrzuceniu dekoracji w stylu Tufte (chociaż pole Tufte'a nie jest językiem programowania, ale wizualnym wyświetlaniem informacji): nie marnuj "atramentu" (pikseli) ani "papieru" (przestrzeń) do zwykłej dekoracji.

Wiele wynika z tej zasady: bez zbędnych nawiasów, bez średników, bez głupich "pudełek ascii" w komentarzach i docstrujach, bez zmarnowanej przestrzeni do "wyrównania" rzeczy w różnych wierszach, pojedynczych cudzysłowów, chyba że potrzebujesz specjalnie podwójnych cytatów, no \, aby kontynuować linie, z wyjątkiem sytuacji, gdy są obowiązkowe, brak komentarzy, które jedynie przypominają czytelnikowi zasady języka (jeśli czytelnik nie zna języka, w którym i tak masz kłopoty ;-), i tak dalej.

Chciałbym zauważyć, że niektóre z tych konsekwencji "ducha Tufte Pythona" są bardziej kontrowersyjne niż inne, w społeczności Python. Ale język z pewnością szanuje "Ducha Tufte'a" całkiem dobrze ...

Przejście na "bardziej kontrowersyjne" (ale usankowane przez Zen Pythona - import this w odpowiedzi na zapytanie tłumacza): "mieszkanie jest lepsze niż zagnieżdżone", więc "wynoś się tak szybko, jak rozsądnie", zamiast gniazdować.Pozwól mi wyjaśnić:

if foo: 
    return bar 
else: 
    baz = fie(fum) 
    return baz + blab 

to nie jest straszne, ale nie jest to optymalna: od „powrotu” `` ją na zewnątrz „”, można zapisać zagnieżdżania

if foo: 
    return bar 
baz = fie(fum) 
return baz + blab 

ostrzejszy przykład :

for item in container: 
    if interesting(item): 
    dothis(item) 
    dothat(item) 
    theother(item) 

że duży blok jest podwójnie zagnieżdżone nie jest miłe ... rozważyć płaski styl:

for item in container: 
    if not interesting(item): 
    continue 
    dothis(item) 
    dothat(item) 
    theother(item) 

BTW, a na marginesie to nie specjalnie z Python-ekskluzywnym stylu - jeden z moich peeves domowych (w dowolnym języku, ale w Duchu Python Tufte wspiera mnie ;-):

if not something: 
    this() 
    that() 
    theother() 
else: 
    blih() 
    bluh() 
    blah() 

„czy nie. .. else "to wykrzywiony! Zamienić dwie połówki i stracić not:

if something: 
    blih() 
    bluh() 
    blah() 
else: 
    this() 
    that() 
    theother() 
+4

Wyobrażenie, czy "zwrócić" wartość w połowie funkcji lub użyć instrukcji "else", często zostawia mnie sparaliżowanego niezdecydowaniem ... – detly

0

Składnia jest tylko wierzchołkiem góry lodowej. Istnieje wiele różnych konstrukcji językowych, o których powinni wiedzieć programiści języka Java, np. Python nie trzeba użyciu interfejs

Creating an interface and swappable implementations in python - Stack Overflow

Drugi naprawdę użyteczne idiom to wszystko mogą być konwertowane na wartości logicznej z intuicyjnym rozumieniu w Pythonie. Na przykład, aby sprawdzić pustą tablicę, po prostu zrobić

if not my_array: 
    return 
...process my_array... 

Pierwszym warunkiem jest równoważne Java

if ((my_array == null) || (my_array.length == 0)) { 
    return 
} 

Jest wybawieniem w Pythonie. Jest to nie tylko bardziej zwięzłe, ale także unikanie pułapki Java, w której wiele osób nie sprawdza konsekwentnie obu warunków. W rezultacie uniknięto niezliczonej ilości wyjątków NullPointerException.

Powiązane problemy