Tło: Przejrzałem kilka samouczków i napisałem kilka małych projektów. Wszystko idzie dobrze dzięki Google i StackOverflow .
Kilka razy w ciągu ostatnich kilku dni zastanawiałem się, „czego mi brakuje?” - Czuję, że wciąż myślę w Javie, pisząc w Pythonie.
To pytanie na StackOverflow jest pełne wskazówek na temat zasobów, które należy przeczytać, aby nauczyć się języka Python, ale nadal uważam, że jestem programistą Java ze słownikiem (bez słów) do przetłumaczenia na język Python.
To, co naprawdę chcę zrobić, to zreformować moją głowę, aby móc pisać Pythonic Python zamiast Javy przebranej za Python, nie tracąc przy tym swoich umiejętności Java.
Tak więc sedno mojego pytania brzmi: jakie pojęcia deweloper Java musi naprawdę nauczyć się myśleć w języku Python? Obejmuje to wszystko, co wymaga oduczenia.
Uwaga: pytam o koncepcje językowe, a nie o składnię językową.
Odpowiedzi:
Kilka punktów oprócz tego, co już powiedziano:
Python jest dynamiczny. Tworzenie klasy jest instrukcją wykonywalną , podobnie jak import modułu; można uzależnić. Klasa może zostać zmieniona po stworzeniu; pozwala to na łatwe metaprogramowanie i AOP.
Brak interfejsów; zasady pisania kaczki. Jeśli rozpaczliwie ich potrzebujesz, istnieją „abstrakcyjne klasy podstawowe (ABC)”, ale zwykle nie brakuje interfejsów, ponieważ i tak nie ma sprawdzania typu statycznego.
Chociaż wszystko jest przedmiotem, funkcje mają pierwszeństwo przed obiektami. Posiadanie tylko funkcji (i żadnych klas) w module jest całkowicie w porządku.
Wszystko jest bytem najwyższej klasy. Przekazywanie funkcji jako parametrów, zwracanie ich i przypisywanie do zmiennych jest normą. To samo dotyczy zajęć. Metody to tylko funkcje; możesz obsłużyć metodę instancji tak, jakby była zwykłą funkcją, przekazać ją itp.
Używaj wbudowanych dykt, zestawów, list i krotek. Listy i dyktanda są zmienne, krotki nie. Wszystkie są bardzo wydajne i zwięźle składniowe. Przyzwyczaj się do zwracania kilku wartości z funkcji za pomocą krotki (nie potrzebujesz nawet nawiasów). Przyzwyczaj się do zastępowania złożonych hierarchii bardzo prostych obiektów urządzeniami wyposażonymi w proste listy, krotki i dyktanda („tabele hasht”), co upraszcza życie.
Python ma sporo wsparcia FP; uczyć się list ze zrozumieniem, a następnie iteratorów i generatorów. To bardzo pomaga.
Każdy operator może zostać przeciążony poprzez zdefiniowanie odpowiednich metod, więc dodanie lub porównanie może zwrócić cokolwiek chcesz. Pamiętaj, że pracujesz z takimi rzeczami jak SQLAlchemy.
Nie ma wartości zerowej, tylko Brak, pełnoprawny obiekt. Możesz wydrukować None w porządku, itp. Przekazywanie None, gdy oczekiwana jest kolejna instancja, zwykle powoduje AttributeError, a nie NPE, czasem dalej w dół potoku wykonywania.
Ze względu na w pełni dynamiczną naturę Pythona, prawie nie masz kontroli statycznych . Możesz odwoływać się do nazwy, która nigdy nie istnieje w twoim programie (np. Literówka), lub jest definiowana tylko w określonej ścieżce wykonania, i nic ci nie przypomni, dopóki wykonanie nie trafi w to odwołanie i nie zostanie wywołany błąd NameError. Uważaj na zakres zmiennych i napisz więcej testów jednostkowych.
Ze względu na w pełni dynamiczną naturę Pythona obiekty są prawie zawsze plastyczne. Zwykle można dodawać pola i metody nawet do instancji, a tym samym nieumyślnie usunąć lub zastąpić jego stan lub zestaw metod. Ostrożnie przypisuj atrybuty. To także daje ciekawe możliwości :)
Nie ma stałych symbolicznych , tylko zmienne. Sprawdź, czy nie przypadkowo zastąpisz „stałą”. Jeśli chcesz mieć pewność, że nie możesz nadpisać stałej, użyj funkcji lub właściwości (która jest funkcją ukrytą).
Wątki Pythona są dobre do przetwarzania związanego z We / Wy, ale nie do przetwarzania z procesorem. Nie próbuj przyspieszać zadania obliczeniowego, uruchamiając je w równoległych wątkach.
źródło
None
zazwyczaj powodujeAttributeError
(ale nie ma znaczenia, zazwyczaj nie trzeba go tak) i może (aw niektórych przypadkach powinien) Napisać niezmienne obiekty (np poprzeznamedtuple
).Przeczytaj ten artykuł: Python to nie Java . (Plus większość innych artykułów na pasku bocznym jest wartych przeczytania, choć nie związanych z Javą.) Artykuł ten zawiera kilka świetnych wskazówek na temat tego, jak programiści Java mogą nieumyślnie niewłaściwie używać Pythona (i jak tego nie robić).
źródło
Przeszedłem z Javy do Pythona i jedną z najbardziej przydatnych rzeczy, jakie znalazłem, było testowanie kodu z interpretera wiersza poleceń. Wpisz python w wierszu polecenia i uruchom stamtąd swój kod, dopóki go nie poprawisz.
Frameworki były również nieco mniej zdefiniowane w Pythonie. Istnieje 10s ramek internetowych, które działają tylko na początek. Django mniej więcej zastępuje wiosenną i SQL Alchemy dla Hibernacji.
źródło
Jedną ważną rzeczą byłoby zrozumienie dynamicznego pisania; innym jest to, że obiekty są zmienne i publiczne. Mniej ważne, przynajmniej początkowo, jest powiązanie nazwy ze zmiennymi.
Tutaj myjobtitle i wartość job.title wskazują na ten sam obiekt. Atrybutowi klasy job.startDate najpierw przypisano ciąg, a następnie obiektowi czasu. I przez to wszystko, instancja zadania, a nawet sama klasa mogą być zmieniane dynamicznie.
źródło
Możesz także rzucić okiem na Jython . Może on obsługiwać tylko Python 2.5, ale uważamy, że jest on naprawdę potężny, aby móc szybko prototypować w Pythonie, a następnie w razie potrzeby przepisać w Javie później.
Na podstawie mojej odpowiedzi na pytanie O czym powinienem pomyśleć, przechodząc z Pythona na Javę? ponieważ to pytanie zostało zamknięte jako duplikat tego pytania!
źródło