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()


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow