Jak mogę nauczyć się efektywnie pisać kod w języku Python?

46

Wyszukiwanie w Google hasła „python” ujawnia szeroki zakres interpretacji. Strona wikipedia mówi:

Powszechnym neologizmem w społeczności Python jest python, który może mieć szeroki zakres znaczeń związanych ze stylem programu. Stwierdzenie, że kod jest pythonowy, oznacza, że ​​dobrze używa idiomów Pythona, że ​​jest naturalny lub wykazuje płynność w języku. Podobnie mówiąc o interfejsie lub funkcji językowej, że jest on pythoniczny, oznacza to, że działa dobrze z idiomami Pythona, że ​​jego użycie dobrze łączy się z resztą języka.

Omawia także termin „niepythonic”:

W przeciwieństwie do tego, znakiem niepytonicznego kodu jest to, że próbuje napisać kod C ++ (lub Lisp, Perl lub Java) w Pythonie - to znaczy zapewnia szorstką transkrypcję, a nie idiomatyczne tłumaczenie formularzy z innego języka. Pojęcie pythoniczność jest ściśle związane z minimalistyczną filozofią czytelności Pythona i unikaniem podejścia „jest więcej niż jeden sposób”. Nieczytelny kod lub niezrozumiałe idiomy są niepytoniczne.

Co oznacza termin „python”? Jak nauczyć się skutecznie go stosować w praktyce?


źródło
6
Myślę, że twoje pytanie można rozszerzyć na dowolny język programowania. Zawsze istnieje zalecany sposób programowania, który może być dokładny w wielu przypadkach, a także w celu poprawy wersji, czytelności i konserwacji. Myślę, że zakwestionowanie tych zaleceń może sprawić, że język ewoluuje i rozwija się ...
Amine,
@ Amine takie prawdziwe. Właściwie uważam, że należy wziąć pod uwagę wiki społeczności składające się dokładnie z tego, gdzie uczyć się idiomów językowych - dla wszystkich języków.
yati sagade
Możliwe powiązanie: programmers.stackexchange.com/questions/47860/…
FrustratedWithFormsDesigner
1
Komentatorzy: przestań publikować nieistotne komentarze; zostały usunięte z jakiegoś powodu. Jeśli masz odpowiedź, zostaw ją jako odpowiedź. Jeśli chcesz przedyskutować temat tego pytania, skorzystaj z czatu .
1
Ćwicząc Python!
Dynamiczny

Odpowiedzi:

22

Przekonałem się, że większość ludzi ma własne interpretacje tego, co tak naprawdę oznacza „Python”. Z Wikipedii:

Powszechnym neologizmem w społeczności Python jest python, który może mieć szeroki zakres znaczeń związanych ze stylem programu. Stwierdzenie, że kod jest pythonowy, oznacza, że ​​dobrze używa idiomów Pythona, że ​​jest naturalny lub wykazuje płynność w języku. Podobnie mówiąc o interfejsie lub funkcji językowej, że jest on pythoniczny, oznacza to, że działa dobrze z idiomami Pythona, że ​​jego użycie dobrze łączy się z resztą języka.

W przeciwieństwie do tego, znakiem niepytonicznego kodu jest to, że próbuje napisać kod C ++ (lub Lisp, Perl lub Java) w Pythonie - to znaczy zapewnia szorstką transkrypcję, a nie idiomatyczne tłumaczenie formularzy z innego języka. Pojęcie pythoniczność jest ściśle związane z minimalistyczną filozofią czytelności Pythona i unikaniem podejścia „jest więcej niż jeden sposób”. Nieczytelny kod lub niezrozumiałe idiomy są niepytoniczne.

Przekonałem się, że więcej razy niż nie, tak naprawdę więcej „pytonowych” przykładów pochodzi od ludzi, którzy starają się być sprytni z użyciem idiomów Pythona i (znowu więcej niż nie) czyniąc swój kod praktycznie nieczytelnym (co nie jest Pythonic).

Tak długo, jak trzymasz się idiomów Pythona i unikasz prób używania stylów C ++ (lub innego języka) w Pythonie, jesteś Pythonem.

Jak wskazał WorldEngineer, PEP8 jest dobrym standardem do naśladowania (a jeśli korzystasz z VIM, dostępne są wtyczki do linowania PEP8).


Naprawdę jednak, pod koniec dnia, jeśli twoje rozwiązanie działa i nie jest absolutnie okropnie niemożliwe do utrzymania i powolne, kogo to obchodzi? Częściej niż nie, Twoim zadaniem jest wykonanie zadania, a nie napisanie najbardziej eleganckiego, pythonowego kodu.


Kolejna uwaga (tylko moja opinia, z tego powodu proszę głosować za nią;)): Odkryłem również, że społeczność Pythona jest wypełniona toną ego (nie to, że większość społeczności nie jest , jest tylko trochę bardziej rozpowszechniona w społecznościach takich jak C i Python). Zatem połączenie ego z błędnie interpretowanymi interpretacjami bycia „pytonicznym” będzie miało tendencję do wywoływania wielu bezpodstawnych negatywności. Weź to, co czytasz od innych z odrobiną soli. Trzymaj się oficjalnych standardów i dokumentacji, a wszystko będzie dobrze.

Demian Brecht
źródło
2
+1 za miłą odpowiedź (z wyjątkiem cytatu, ponieważ użyłem go w OP).
Ugh .. Powinien ponownie przeczytać OP przed opublikowaniem cytatu: P
Demian Brecht
3
Istnieje raczej duża korelacja między ego a aktywnością w sieci, wyrażaniem opinii w dowolnej społeczności. Zasadniczo nie widzisz tak mało egoistycznych ludzi, ponieważ przede wszystkim nie piszą tak dużo.
isarandi
17

Pythonic polega na idiomatycznym kodowaniu w Pythonie. Oznacza to używanie struktur i formatowania, które działają dobrze dla Pythona z punktu widzenia programowania, ale także z punktu widzenia czytania przez społeczność. To bardzo przypomina sposób, w jaki K&R ustanawia standard stylu programowania C na długi czas. Ten przewodnik pokazuje, że musisz kodować idiomatycznie w Pythonie. PEP 8 jest wymieniony w tym przewodniku, więc prawdopodobnie warto go przeczytać.

Inżynier świata
źródło
1
@MattFenwick Czy nie jest to jednak 90% tego, na czym polega programowanie? Dobrzy programiści spędzają dużo czasu na czytaniu kodu, a na pozostały czas pisać dużo kodu. Im więcej kodu w Pythonie czytasz, a im więcej piszesz w Pythonie, tym bardziej Python jest w twoim kodzie. Nie sądzę, żeby były tu jakieś skróty.
Kris Harper,
2
Doskonały link!
Ethan Furman,
13

Pisanie kodu „Pythonic” IMHO efektywnie wykorzystuje funkcje (V) HLL oferowane przez język. Jako wszechobecny przykład

x, y = 7, 'fuhrer'

To bardzo pytoniczne. Pamiętam, kiedy zacząłem uczyć się języka C # po miesiącach tylko Python,

int x, y = 10, z;

jakoś mnie zdezorientowało, ale minęła minuta, zanim wróciłem do korzeni C / C ++.

Innym sposobem Python jest użycie lambdas.

l = [1, 2, 3, 4, 5]
print(sorted(l, key=lambda x: -x))

wydrukuje lposortowane w kolejności malejącej.

Potem jest bardzo używane, ale bardzo mało zrozumiałe „pisanie kaczek” - jeśli chodzi i mówi jak kaczka, traktujesz go jak kaczkę. Jest to luźno związane z interfejsami w innych językach OO.

Również stosowanie funkcjonalnych metod programowania, w stosownych przypadkach, takich jak użycie map i redukcja, są uważane za pythoniczne.

Podczas pisania zobaczyłem odpowiedź, która zawiera ładny link. PS: To nie jest tak, że twoja znajomość Pythona jest ograniczona. Mogę się założyć, że Python nie był twoim pierwszym językiem, a zatem (jak większość z nas pythonistów) musisz nauczyć się „idiomatyczny” z wężem! Twoje zdrowie!

yati sagade
źródło
Nie dodałem linku, ponieważ został już opublikowany podczas pisania - odpowiedź WorldEngineer :) Pomyśl tylko o „wykorzystaniu” funkcji językowych dla dobra swojego i innych, a po drodze dostaniesz Pythonic i wykonaj następujące czynności ten link
yati sagade
4
Faktycznie, wielu sporów, które map, reduce, lambdaa takie są idiomatyczne per se. Rozumienie list i wyrażenie generatora są alternatywą i wielu woli je, gdy jest to rozsądnie możliwe (w szczególności są mniej głośne, gdy potrzebujesz lambda). Z pewnością mają swoje zastosowania, a programowanie funkcjonalne pokazuje w innych idiomach (na przykład dekoratorach).
@delnan zgodził się - a nawet bardziej, jeśli chodzi o Python 3. Wniosek jest taki, że funkcje funkcjonalne powinny być używane dokładnie tam , gdzie jest to wymagane. I to (jest tylko jeden oczywisty sposób na zrobienie tego) jest idiomatyczne :)
yati sagade
Osobiście nigdy nie zrozumiałem preferencji ludzi dla twojego pierwszego przykładu. Jest to o wiele łatwiej psychicznie parse (Który jest Zen Pythona, kod jest częściej niż to jest napisane odczyt): (x, y) = (7, 'fuhrer')- Mam jeszcze prawie zawsze „poprawione”, że bez parens jest najlepszym sposobem, aby to napisać!
Izkata
2
Twierdziłbym, że twój konkretny przykład sortowania nie jest pythoniczny. Po co ponownie wprowadzać zmiany kolejności za pomocą lambda, jeśli możesz print(sorted(l, reverse=True)), co dodatkowo wyraźnie mówi czytelnikowi, co się dzieje. Twój pierwszy przykład też byłby dyskusyjny. To dwa zadania skompresowane w jedno; jest w porządku, ale nie nazwałbym tego bardzo Pythonicznym. Czytelnicy muszą dłużej patrzeć na to, co robi, niż na dwa zadania.
fresnel
7
--> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Kod Pythonic to:

  • Czytelny
  • Prosty (tak prosty, jak to możliwe, ale nie prostszy)
  • Dobrze przemyślane
Ethan Furman
źródło
1
+1. Zen Pythona jest ważniejszy przy pisaniu kodu pythonowego niż śledzenie listy idiomów; ten ostatni nie obejmie wszystkich okoliczności.
Doval
6

Za każdym razem, gdy próbowałem nauczyć się nowego języka, odkryłem, że czytanie kodu przez ludzi, którzy znają język jak na odwrocie dłoni, patrząc w górę / pytając o wszystko, co wygląda dziwnie, a następnie próbuję naśladować ich styl, to: najlepsza rzecz do zrobienia. Przykłady:

W Pythonie, ponieważ zajmujemy się tym tematem, znalazłem przykłady z Dive Into Python niezwykle przydatne na początku. Zwykle uczą nie tylko podstaw Pythona, ale naprawdę podkreślają idiomatyczny Python.

Kiedy uczyłem się D, ponieważ dokumentacja nie była wtedy świetna, ponieważ język był tak przełomowy, nauczyłem się czytając kod do standardowej biblioteki, a konkretnie niektóre arcydzieła Andrei Alexandrescu .

Podczas nauki C ++ odziedziczyłem bazę kodu od całkiem dobrego programisty C ++ i wiele się nauczyłem o idiomatycznym programowaniu w C ++ po jego naleganiu na przekazywanie kontenerów STL przez referencje itp.

We wszystkich językach uważam, że przeglądanie pytań StackOverflow na temat języka i sprawdzanie, co ludzie zazwyczaj robią, aby osiągnąć podstawowe rzeczy, pomaga.

dsimcha
źródło
+1 Kiedy poznasz podstawy języka, czytanie kodu pomoże znacznie więcej niż czytanie książek.
Tempo
3

Python nie jest Javą, może dać ci przydatne porady. Nie można powiedzieć więcej, nie wiedząc, na jakie problemy się napotykasz, ale jest to bardzo konkretna rada dla programistów pochodzących z innego języka (w tym przypadku konkretnie java) na temat tego, jak inaczej robić Pythona.

maxpolun
źródło
2

Ktoś powiedział, aby sparafrazować, aby dowiedzieć się, co to jest Python, po prostu wypuść trochę kodu. Nie zgadzam się z tym. Jeśli lubisz pisać bardzo gęsty kod, to nie czyni go bardziej Pythonicznym.

Jednym ze sposobów, aby pomóc ci zdefiniować, czym jest Python, jeśli chodzi o ciebie, zapytaj siebie: „Dlaczego miałbym (co oznacza, że) używać języka Python?” Co ci się w tym podoba?

Dla mnie jest to czytelność i brak kompilacji oraz open source (prawie całość). Mogę załadować tony bibliotek i czytać ich kod źródłowy bez większego stresu związanego z licencjonowaniem niż w wielu innych językach.

Dla mnie Python jest piękny wizualnie. Guido (twórca Pythona) również ciągle mi udowadnia, poprzez swoje odpowiedzi w PEPS i dyskusje), że jego wybory dotyczące sposobu, w jaki stworzył język, przewyższają moje własne wyobrażenia o tym, jak powinien zostać stworzony.

Dla mnie świetny programista to ktoś z bardzo świadomymi umiejętnościami podejmowania decyzji o tym, którą drogą wybrać się przy kodowaniu. Dla mnie Python pomaga w szybkim dokonywaniu tych wyborów.

Upraszczając składnię kodu źródłowego, pozwalając na pisanie kaczek zamiast rzutowania typu explicid, a oczekiwanie, że koderzy sprawdzający twój kod „powinni być dobrze zachowanymi programistami”, prowadzi do czegoś, co ja też nazywam „pytonicznym”

Istnieją więc dwie strony tego, co jest Pythonic. Jeden jest składniowy, drugi to praktyka. Jak wyjaśnić głębszą stronę tego, czym jest „Pythonic” ..?

W Pythonie nie ma nic wielkiego do zrobienia: alist = ['one', 'two', 'three \ n'] alist.append ((1234, 'Atuple'))

krotka zostanie dodana do listy bez względu na typy obiektów. Część Pythonic nie polega na tym, że MOŻESZ to zrobić, ale że twój kod powinien tego oczekiwać, a po prostu pracować / dostosowywać.

Cokolwiek działa na obiekcie -alistycznym, powinno być napisane z myślą, że jakiś inny koder mógłby wejść i dodać ciąg znaków do listy oraz że adaptacja kodu źródłowego przez nowy koder nie powinna być trudna. W końcu taka jest zaleta kaczki.

DevPlayer
źródło
-2

Kup zalecaną książkę. Przeczytaj to. Powinno to dać ci dobrą podstawę do używania języka oraz w mechanizmie, który powinien odpowiadać stylowi społeczności

Paweł
źródło