ipython
IPython-snelkoppelingen, tips en trucs
Zoeken…
Opmerkingen
IPython (en de Jupyter Notebook) definieert een speciale betekenis voor het onderstrepingsteken. Het bevat altijd de meest recente uitvoer. Dit komt van pas bij het verwerken van gegevens in meerdere stappen. Dit wordt aangetoond in het bovenstaande voorbeeld. Om de tekst op te schonen, wordt deze door een paar reguliere expressies doorlopen en vervolgens genormaliseerd voordat deze wordt gesplitst. Buiten IPython zou elk resultaat moeten worden opgeslagen in een nieuwe variabele of moeten de stappen worden genest. In IPython zijn we vaak bezig met het onderzoeken en bijhouden van variabelen of is het reproduceren van een lange reeks geneste oproepen vervelend. Dus dit is waar het onderstrepingsteken verschijnt.
Er is één gotcha. Als u een waarde toewijst aan het onderstrepingsteken in het algemene bereik, veroorzaakt dit onverwacht gedrag. Bijvoorbeeld:
address = ('http://example.com', 80)
(_, port) = address
Hier ben ik alleen geïnteresseerd in het tweede element in de tuple, het poortnummer. Dus volg ik de conventie en wijs ik het eerste element toe aan het onderstrepingsteken om aan te geven dat het een wegwerp is. De waarde van het onderstrepingsteken is nu echter http://example.com
. En als ik meer code zou uitvoeren:
1+4
De verwachte waarde van het onderstrepingsteken is 5. Dit is het echter niet. De waarde is nog steeds het domein van de tuple. Wanneer u het onderstrepingsteken in het algemene bereik toewijst, wordt niet alleen de waarde gecorrumpeerd, maar wordt ook de meest recente uitvoer opgeslagen. Dit is niet het geval als u het onderstrepingsteken binnen een functie of lus toewijst.
Het speciale gebruik van het onderstrepingsteken in 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()