ipython
Skróty, porady i wskazówki dotyczące IPython
Szukaj…
Uwagi
IPython (i notatnik Jupyter) definiuje specjalne znaczenie podkreślenia. Zawsze zawiera najnowsze dane wyjściowe. Jest to przydatne podczas przetwarzania danych w wielu krokach. Jest to pokazane w powyższym przykładzie. Aby wyczyścić tekst, jest on przetwarzany przez kilka wyrażeń regularnych, a następnie normalizowany przed podziałem. Poza IPython każdy wynik musiałby być zapisany w nowej zmiennej lub zagnieżdżonych krokach. W IPython często badamy i śledzimy zmienne lub odtwarzamy długą serię zagnieżdżonych wywołań, co jest uciążliwe. Tutaj pojawia się podkreślenie.
Jest jedna gotcha. Jeśli przypiszesz wartość do znaku podkreślenia w zasięgu globalnym, spowoduje to nieoczekiwane zachowanie. Na przykład:
address = ('http://example.com', 80)
(_, port) = address
Tutaj interesuje mnie tylko drugi element w krotce, numer portu. Postępuję zgodnie z konwencją i przypisuję pierwszy element do podkreślenia, aby wskazać, że jest to rzut jednorazowy. Jednak teraz wartość podkreślenia to http://example.com
. A jeśli miałbym uruchomić więcej kodu:
1+4
Oczekiwana wartość podkreślenia wynosiłaby 5. Jednak tak nie jest. Wartością jest wciąż domena z krotki. Po przypisaniu do znaku podkreślenia w zakresie globalnym nie tylko blokuje on wartość, ale także przestaje przechowywać najnowsze dane wyjściowe. Nie dzieje się tak w przypadku przypisania podkreślnika do funkcji lub pętli.
Specjalne zastosowanie podkreślenia w IPython
from urllib.request import urlopen
from collections import Counter
import re
conn = urlopen('http://textfiles.com/100/dodontae.hum')
lines = conn.readlines()
conn.close()
# readlines() returns byte strings
data = ''.join([line.decode('utf-8') for line in lines])
# replace non-letters with a space
re.sub('[^A-Za-z]', ' ', data)
# condense successive whitespace into a single space
# the underscore retrieves the most recent output
re.sub('\s+', ' ', _)
# normalize the text by lowercasing and removing leading and trailing whitespace
_.lower().strip()
# split into words on space
words = _.split(' ')
from collections import Counter
word_count = Counter()
for word in words:
word_count[word[0]] += 1
word_count.most_common()