Programowanie w Javie Python: jakie koncepcje muszę zawinąć?


38

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ą.


9
Porzuć myśl, że programowanie powinno być trudne.
Job

Odpowiedzi:


40

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.


+1 bardzo dobre punkty. Nitpicking: Nonezazwyczaj powoduje AttributeError(ale nie ma znaczenia, zazwyczaj nie trzeba go tak) i może (aw niektórych przypadkach powinien) Napisać niezmienne obiekty (np poprzez namedtuple).

@danlan: dzięki, poprawiłem tekst :) Tak, możesz tworzyć niezmienne obiekty. Ale obiekty, które generalnie tworzysz, tworząc regularną klasę, a następnie jej instancje, są bardzo zmienne, chyba że zastosujesz szereg specjalnych środków. Fakt, że przypisanie do niezdefiniowanego atrybutu instancji zwykle dyskretnie go definiuje zamiast powodować błąd, może być zaskoczeniem dla programisty Java.
9000

1
Python (i inne języki FP) zastępuje bardziej szczegółowe budowanie prostszych bloków kodem kompaktowym kodem na bardziej złożonych blokach konstrukcyjnych. Pomyśl o procesorach RISC a CISC.
Paul

1
Dodałbym zestawy do struktur danych.
sakisk

2
Nieco ponad 3 lata odkąd zadałem to pytanie. Muszę powiedzieć, że ta rada bardzo dobrze się potwierdziła.
LRE,

14

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


6
„XML nie jest odpowiedzią”. - wykracza to znacznie poza Java v Python ;-)
LRE

3

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.


2

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.

class MyJob:
    pass        # an empty class
job = MyJob()
job.title = "Ruler of Omicron Persei 8"
job.startDate = "2086"
job.startDate = time.strptime("2035/01/02", "%Y/%m/%d")
myjobtitle = job.title
import new
def myjobduration(self, when):  # create a function
    return when - time.mktime(self.startDate)
MyJob.duration = myjobduration
job.duration(time.time()) # now

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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.