Jakie są mniej znane, ale przydatne funkcje języka programowania Python?
- Spróbuj ograniczyć odpowiedzi do rdzenia Pythona.
- Jedna funkcja na odpowiedź.
- Podaj przykład i krótki opis funkcji, a nie tylko link do dokumentacji.
- Oznacz obiekt, używając tytułu jako pierwszego wiersza.
Szybkie linki do odpowiedzi:
- Rozpakowywanie argumentów
- Aparat ortodontyczny
- Łączenie łańcuchowe operatorów
- Dekoratorzy
- Domyślny argument Gotchas / Dangers of Mutable Default arguments
- Deskryptory
- Domyślna
.get
wartość słownika - Testy docstringowe
- Ellipsis Slicing Składnia
- Wyliczenie
- Dla / else
- Funkcja jako argument iter ()
- Wyrażenia generatora
import this
- Zamiana wartości na miejscu
- Krocząca lista
__missing__
przedmiotów- Regex wieloliniowy
- Formatowane ciągi nazwane
- Zagnieżdżone listy / generatory
- Nowe typy w czasie wykonywania
.pth
akta- Kodowanie ROT13
- Debugowanie Regex
- Wysyłanie do generatorów
- Wypełnianie tabulatorów w interaktywnym tłumaczu
- Wyrażenie trójskładnikowe
try/except/else
- Rozpakowanie +
print()
funkcja with
komunikat
(< 1 x 10)
. Możesz nawet zastosować je do pojedynczych argumentów, takich jak(= 10)
: cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/…Pobierz drzewo parsowania wyrażenia regularnego w Pythonie, aby debugować wyrażenie regularne.
Wyrażenia regularne są świetną funkcją Pythona, ale ich debugowanie może być uciążliwe i zbyt łatwo jest pomylić wyrażenie regularne.
Na szczęście Python może wydrukować drzewo analizy wyrażeń regularnych, przekazując nieudokumentowaną, eksperymentalną, ukrytą flagę
re.DEBUG
(właściwie 128) dore.compile
.Po zrozumieniu składni możesz dostrzec swoje błędy. Nie widzimy, że zapomniałem uciec
[]
in[/font]
.Oczywiście możesz to połączyć z dowolnymi flagami, takimi jak skomentowane wyrażenia regularne:
źródło
wyliczać
Zawijaj iterowalny wyliczeniem, a otrzymasz element wraz z jego indeksem.
Na przykład:
Bibliografia:
enumerate
źródło
Tworzenie obiektów generatorów
Jeśli napiszesz
możesz wyjść z generatora i przypisać go do x. Teraz oznacza to, że możesz to zrobić
Zaletą tego jest to, że nie potrzebujesz pośredniego magazynu, który byłby potrzebny, gdybyś to zrobił
W niektórych przypadkach może to prowadzić do znacznego przyspieszenia.
Możesz dołączyć wiele instrukcji if na końcu generatora, w zasadzie replikując zagnieżdżone dla pętli:
źródło
iter () może przyjąć argument wywoływalny
Na przykład:
iter(callable, until_value)
Funkcja wielokrotnie wzywacallable
i daje swój wynik ażuntil_value
zostanie zwrócony.źródło
lambda
słowo kluczowe jest tutaj potrzebne?Uważaj na zmienne argumenty domyślne
Zamiast tego powinieneś użyć wartownika oznaczającego „nie podano” i zastąpić zmienną, którą chcesz domyślnie:
źródło
foo.func_defaults
. Które, będąc krotką, jest niezmienne.Przesyłanie wartości do funkcji generatora . Na przykład mając tę funkcję:
Możesz:
źródło
Jeśli nie lubisz używać białych znaków do oznaczania zakresów, możesz użyć stylu C {}, wydając:
źródło
Argument kroku w operatorach wycinków. Na przykład:
Przypadek specjalny
x[::-1]
jest przydatnym idiomem dla „x reverse”.źródło
Dekoratorzy
Dekoratory pozwalają na zawinięcie funkcji lub metody w inną funkcję, która może dodawać funkcjonalność, modyfikować argumenty lub wyniki itp. Dekoratory piszesz jeden wiersz powyżej definicji funkcji, zaczynając od znaku „at” (@).
Przykład pokazuje
print_args
dekorator, który drukuje argumenty dekorowanej funkcji przed jej wywołaniem:źródło
Składnia for ... else (patrz http://docs.python.org/ref/for.html )
Blok „else” będzie normalnie wykonywany na końcu pętli for, chyba że wywołane zostanie przerwanie.
Powyższy kod można emulować w następujący sposób:
źródło
Od 2.5 dyktatury mają specjalną metodę,
__missing__
która jest wywoływana dla brakujących elementów:W
collections
wywołanej jest również podklasa dict,defaultdict
która działa prawie tak samo, ale wywołuje funkcję bez argumentów dla nieistniejących elementów:Polecam konwersję takich nagrań na zwykłe nagrania przed przekazaniem ich do funkcji, które nie oczekują takich podklas. Wiele kodów używa
d[a_key]
i łapie KeyErrors, aby sprawdzić, czy istnieje element, który dodałby nowy element do dykta.źródło
m={}; m.setdefault('foo', []).append(1)
.defaultdict
jest również silniejszy niżsetdefault
metoda w innych przypadkach. Na przykład, dla liczącydd = collections.defaultdict(int) ... dd[k] += 1
vsd.setdefault(k, 0) += 1
.Zamiana wartości w miejscu
Prawa strona zadania jest wyrażeniem, które tworzy nową krotkę. Lewa strona zadania natychmiast rozpakowuje, że (bez odniesienia) krotka do nazw
a
ib
.Po przypisaniu nowa krotka nie jest przywoływana i jest oznaczana do wyrzucania elementów bezużytecznych, a wartości powiązane
a
ib
zostały zamienione.Jak zauważono w sekcji samouczka poświęconej Pythonowi na temat struktur danych ,
źródło
Czytelne wyrażenia regularne
W Pythonie możesz podzielić wyrażenie regularne na wiele wierszy, nazwać swoje dopasowania i wstawić komentarze.
Przykładowa pełna składnia (od Dive do Python ):
Przykładowe dopasowania nazewnictwa (z wyrażenia regularnego HOWTO )
Możesz także napisać wyrażeniem regularnym wyrażenie regularne bez użycia
re.VERBOSE
literackiej łańcuchowej konkatenacji.źródło
Rozpakowywanie argumentów funkcji
Możesz rozpakować listę lub słownik jako argumenty funkcji za pomocą
*
i**
.Na przykład:
Bardzo przydatny skrót, ponieważ listy, krotki i dyktanda są szeroko stosowane jako kontenery.
źródło
ROT13 jest prawidłowym kodowaniem kodu źródłowego, jeśli użyto właściwej deklaracji kodowania na górze pliku kodu:
źródło
cevag h"Uryyb fgnpxbiresybj!"
Tworzenie nowych typów w pełni dynamiczny sposób
który jest dokładnie taki sam jak
Prawdopodobnie nie najbardziej użyteczna rzecz, ale miło wiedzieć.
Edycja : Stała nazwa nowego typu powinna być
NewType
dokładnie taka sama jak w przypadkuclass
instrukcji.Edycja : Dostosowano tytuł, aby dokładniej opisać funkcję.
źródło
Menedżery kontekstu i instrukcja „
with
”Menedżer kontekstu, wprowadzony w PEP 343 , jest obiektem działającym jako kontekst wykonawczy dla zestawu instrukcji.
Ponieważ funkcja korzysta z nowych słów kluczowych, jest wprowadzana stopniowo: jest dostępna w Pythonie 2.5 poprzez
__future__
dyrektywę. Python 2.6 i nowsze wersje (w tym Python 3) domyślnie są dostępne.Często używałem wyrażenia „z”, ponieważ uważam, że jest to bardzo przydatna konstrukcja, oto krótkie demo:
To, co dzieje się tutaj za kulisami, polega na tym, że instrukcja „with” wywołuje funkcje specjalne
__enter__
i__exit__
metody na obiekcie pliku. Szczegóły wyjątku są również przekazywane,__exit__
jeśli z treści instrukcji with został zgłoszony jakiś wyjątek, umożliwiając tam obsługę wyjątków.W tym konkretnym przypadku oznacza to, że gwarantuje zamknięcie pliku, gdy wykonanie wykracza poza zakres
with
pakietu, niezależnie od tego , czy nastąpi to normalnie, czy też zgłoszono wyjątek. Jest to w zasadzie sposób wyodrębnienia wspólnego kodu obsługi wyjątków.Inne typowe przypadki użycia to blokowanie za pomocą wątków i transakcji w bazie danych.
źródło
withs
:)with open('filea') as filea and open('fileb') as fileb: ...
with open('filea') as filea, open('fileb') as fileb: ...
Słowniki mają metodę get ()
Słowniki mają metodę „get ()”. Jeśli zrobisz d [„klucz”], a klucza go nie ma, otrzymasz wyjątek. Jeśli wykonasz d.get („klucz”), otrzymasz zwrot Brak, jeśli „klucz” nie istnieje. Możesz dodać drugi argument, aby odzyskać ten element zamiast None, np .: d.get ('key', 0).
Doskonale nadaje się do dodawania liczb:
sum[value] = sum.get(value, 0) + 1
źródło
get(key, None)
. Nie miałem pojęcia, żeNone
został dostarczony domyślnie.Deskryptory
Są magią kryjącą się za całym szeregiem podstawowych funkcji Pythona.
Kiedy używasz dostępu przerywanego do wyszukiwania członka (np. Xy), Python najpierw szuka członka w słowniku instancji. Jeśli nie zostanie znaleziony, szuka go w słowniku klas. Jeśli znajdzie go w słowniku klas, a obiekt zaimplementuje protokół deskryptora, zamiast go zwracać, Python wykonuje go. Deskryptor jest dowolną klasę, która realizuje
__get__
,__set__
lub__delete__
metod.Oto, w jaki sposób zaimplementujesz własną (tylko do odczytu) wersję właściwości za pomocą deskryptorów:
i użyjesz go tak jak wbudowanej właściwości ():
Deskryptory są używane w Pythonie do implementacji między innymi właściwości, metod powiązanych, metod statycznych, metod klas i gniazd. Ich zrozumienie ułatwia zrozumienie, dlaczego wiele rzeczy, które wcześniej wyglądały jak „dziwactwa” Pythona, są takie, jakie są.
Raymond Hettinger ma świetny samouczek , który lepiej opisuje je niż ja.
źródło
foo = property(lambda self: self.__foo)
property
sam jest implementowany z deskryptorami, co było celem mojego postu.Przypisanie warunkowe
Robi dokładnie tak, jak to brzmi: „przypisz 3 do x, jeśli y wynosi 1, w przeciwnym razie przypisz 2 do x”. Pamiętaj, że pareny nie są konieczne, ale podoba mi się ich czytelność. Możesz również połączyć go w łańcuch, jeśli masz coś bardziej skomplikowanego:
Chociaż w pewnym momencie idzie to trochę za daleko.
Pamiętaj, że możesz użyć if ... else w dowolnym wyrażeniu. Na przykład:
Tutaj func1 zostanie wywołany, jeśli y wynosi 1, a func2, w przeciwnym razie. W obu przypadkach odpowiednia funkcja zostanie wywołana z argumentami arg1 i arg2.
Analogicznie obowiązuje również:
gdzie klasa 1 i klasa 2 to dwie klasy.
źródło
x = ((y == 1) ? 3 : 2)
ma dla mnie więcej sensuDoctest : dokumentacja i testy jednostkowe w tym samym czasie.
Przykład wyodrębniony z dokumentacji Python:
źródło
locals()
następnie w twoim doctest dolocals().update(setUp())
= DNazwane formatowanie
% -formatting pobiera słownik (stosuje również sprawdzanie poprawności% i /% s itp.).
A ponieważ locals () jest także słownikiem, możesz po prostu przekazać to jako słownik i mieć% -substitions ze zmiennych lokalnych. Myślę, że jest to niezadowolone, ale upraszcza rzeczy ...
Nowe formatowanie stylu
źródło
Aby dodać więcej modułów Pythona (szczególnie zewnętrznych), większość ludzi wydaje się używać zmiennych środowiskowych PYTHONPATH lub dodaje dowiązania symboliczne lub katalogi w swoich katalogach pakietów stron. Innym sposobem jest użycie plików * .pth. Oto oficjalne wyjaśnienie doktora Pythona:
źródło
Wyjątek od pozostałych klauzul:
Użycie klauzuli else jest lepsze niż dodanie dodatkowego kodu do klauzuli try, ponieważ pozwala uniknąć przypadkowego wyłapania wyjątku, który nie został zgłoszony przez kod chroniony przez instrukcję try ....
Zobacz http://docs.python.org/tut/node10.html
źródło
Ponowne zgłaszanie wyjątków :
Instrukcja „podbicia” bez argumentów w module obsługi błędów mówi Pythonowi, aby ponownie podniósł wyjątek z nienaruszonym oryginalnym śledzeniem , pozwalając powiedzieć „och, przepraszam, przepraszam, nie chciałem tego złapać, przepraszam, przepraszam. „
Jeśli chcesz drukować, przechowywać lub bawić się przy użyciu oryginalnego traceback, możesz go uzyskać za pomocą sys.exc_info (), a drukowanie w taki sposób, jak w Pythonie, odbywa się za pomocą modułu „traceback”.
źródło
raise e
zamiast tego, co nie zachowuje oryginalnego śledzenia.exc_info = sys.exc_info(); raise exc_info[0], exc_info[1], exc_info[2]
jest to równoważne, ale możesz zmienić te wartości (np. Zmienić typ wyjątku lub komunikat)Główne wiadomości :)
Odszyfrowane :
źródło
print s.translate("".join(chr(64<i<91 and 65+(i-52)%26 or 96<i<123 and 97+(i-84)%26 or i) for i in range(256)))
i wygląda teraz znacznie lepiej !! :-DWypełnienie zakładki interaktywnego interpretera
Będziesz także musiał ustawić zmienną środowiskową PYTHONSTARTUP.
źródło
easy_install ipdb
- wtedy możesz użyćimport ipdb; ipdb.set_trace()
readline.parse_and_bind ("bind ^I rl_complete")
Wyjaśnienia list zagnieżdżonych i wyrażenia generatorów:
Mogą one zastąpić duże fragmenty kodu zagnieżdżonej pętli.
źródło
for
instrukcji ma być zapisana w takiej kolejności, w jakiej można oczekiwać, że zostaną zapisane w standardowej pętli for, od zewnątrz do wewnątrz.for
s iif
siyield x
wewnątrz. Aby przekonwertować to na wyrażenie generatora,x
najpierw przenieś , usuń wszystkie dwukropki (iyield
) i otocz wszystko w nawiasach. Aby zamiast tego zrozumieć listę, zamień zewnętrzne pareny na nawiasy kwadratowe.Przeciążenie operatora dla
set
wbudowanego:Więcej szczegółów ze standardowego odniesienia do biblioteki: Ustaw typy
źródło