Pythonin sisäänrakennettu enumerate() funktio on yksi kielen hyödyllisimmistä ja käytetyimmistä työkaluista, erityisesti niille, jotka kirjoittavat silmukoita, jotka tarvitsevat sekä sekvenssin kohteet että niiden sijainnit. Sen ytimessä, enumerate() ottaa iteraattorin - kuten listan, tuplen, merkkijonon tai jopa generaattorin - ja palauttaa iteraattorin, joka tuottaa pareja, jotka sisältävät lukumäärän (indeksin) ja vastaavan arvon alkuperäisestä iteraattorista.
Aloittelijoille tämä funktio on käänteentekevä, koska se poistaa tarpeen hallita laskurimuuttujaa manuaalisesti, mikä on yleinen vikojen lähde varhaisessa Python-koodissa. Sen sijaan, että alustetaan indeksi muuttujaa, kasvattaa sitä silmukan sisällä ja huolehtia virheistä, jotka eivät ole yhtä kuin yksi, voit antaa enumerate() hoitaa laskennan puolestasi. Tuloksena on siistimpää, luettavampaa ja “pythonimaisempaa” koodia, joka noudattaa kielen yksinkertaisuuden ja selkeyden filosofiaa.
Tässä kattavassa aloittelijan oppaassa käydään läpi kaikki, mitä sinun tarvitsee tietää seuraavista asioista enumerate(): miksi se on olemassa, miten se toimii konepellin alla, sen syntaksi ja parametrit, käytännön esimerkkejä eri iterableista, yleisiä käyttötapauksia, kehittyneitä malleja, parhaita käytäntöjä ja jopa joitakin vähemmän tunnettuja vinkkejä. Tämän artikkelin loppuun mennessä et ainoastaan ymmärrä enumerate() mutta myös käyttää sitä luottavaisesti omissa projekteissasi.
Miksi käyttää Pythonia enumerate()?
Kun opit Pythonia ensimmäistä kertaa, yksi ensimmäisistä kuvioista, joihin törmäät, on listan läpikäyminen ja samalla jokaisen elementin indeksin tarvitseminen. Tyypillinen aloittelijan ratkaisu näyttää tältä:
python
hedelmät = ['omena', 'banaani', 'kirsikka', 'taateli', 'oravanmarja']
index = 0
for fruit in fruits:
print(f "Kohde {indeksi}: {hedelmä}")
indeksi += 1Lähtö:
Kohta 0: omena
Kohta 1: banaani
Kohta 2: kirsikka
Kohta 3: päivämäärä
Kohta 4: vanhusmarja
Tämä lähestymistapa toimii, mutta siinä on useita haittoja:
- Se on monipolvinen - sinun on ilmoitettava ja hallittava
indeksimuuttuja itse. - Se on virhealtis: unohdetaan kasvattaa arvoa
indeksijohtaa loputtomaan silmukkaan tai väärään tulostukseen. - Se sotkee silmukan rungon, jolloin varsinaista logiikkaa on vaikeampi lukea.
- Jos laskuria on muutettava (esimerkiksi ohitettava tiettyjä indeksejä), koodista tulee nopeasti sotkuista.
enumerate() lisättiin Pythoniin juuri tämän ongelman tyylikkään ratkaisun vuoksi. Se kietoo iteroitavan ja antaa automaattisesti juoksevan indeksin, joka alkaa oletusarvoisesti 0:sta (tai mistä tahansa määrittelemästäsi luvusta).
Syntaksi ja parametrit
Virallinen syntaksi enumerate() on yksinkertainen:
python enumerate(iterable, start=0)
- iterable (vaaditaan): Mikä tahansa objekti, joka tukee iterointia. Tämä sisältää luettelot, tuplet, merkkijonot, joukot, sanakirjat (jotka oletusarvoisesti iteroivat avainten yli), alueobjektit, generaattorit ja jopa mukautetut luokat, jotka toteuttavat iteraattoriprotokollan.
- käynnistä (valinnainen): Kokonaisluku, joka määrittää, mistä laskennan pitäisi alkaa. Oletusarvo on 0, mutta voit asettaa sen arvoksi 1, jos indeksointi perustuu yhteen, 10, jos haluat mukautetun siirtymän, tai tarvittaessa jopa negatiivisen luvun.
Paluuarvo on luetella objekti-iteraattori, joka tuottaa tupleja muodossa (index, item) jokaisella iteraatiokerralla.
Koska se on iteraattori, enumerate() on muistitehokas: se ei luo täydellistä listaa tupleista muistiin etukäteen. Sen sijaan se luo jokaisen parin laiskasti sitä mukaa, kun sen yli käydään silmukassa. Tämä tekee siitä sopivan hyvin suurille tai jopa äärettömille iteraattoreille.
Perusesimerkki: Klassinen käyttötapaus
Näin enumerate() yksinkertaistaa aiempaa esimerkkiä:
python
hedelmät = ['omena', 'banaani', 'kirsikka', 'taateli', 'oravanmarja']
for index, fruit in enumerate(fruits):
print(f "Elementti {indeksi}: {hedelmä}")Lähtö:
Kohta 0: omena
Kohta 1: banaani
Kohta 2: kirsikka
Kohta 3: päivämäärä
Kohta 4: vanhusmarja
Keskeinen parannus on tuplien purkaminen funktiossa varten lausunto: indeksi, hedelmät vastaanottaa suoraan jokaisen tuplan kaksi elementtiä, jotka on tuotettu komennolla enumerate(). Tämä malli on tiivis ja helppolukuinen, ja sitä pidetään Pythonissa vakiotapana käyttää sekä indeksiä että arvoa.
Aloitusindeksin mukauttaminen
Yksi yleisimmistä syistä käyttää käynnistä parametrilla luodaan ihmiselle luettavia numeroituja luetteloita, jotka alkavat 0:n sijasta numerosta 1:
python
shopping_list = ['leipä', 'maito', 'munat', 'voi', 'juusto']
for position, item in enumerate(shopping_list, start=1):
print(f"{position}. {erä.isolla()}")Lähtö:
1. Leipä
2. Maito
3. Munat
4. Voi
5. Juusto
Tätä kaavaa käytetään kaikkialla - komentorivivalikoista raporttien tuottamiseen - ja se tuntuu luonnolliselta muillekin kuin ohjelmoijille, jotka odottavat laskennan alkavan 1:stä.
Voit aloittaa mistä tahansa kokonaisluvusta, jopa negatiivisesta:
python
for i, value in enumerate([10, 20, 30], start=-2):
print(i, arvo)Lähtö:
-2 10
-1 20
0 30
Pythonin Enumerate-olion tarkastelu
Jos haluat nähdä, mitä enumerate() todella tuottaa, voit muuntaa sen luetteloksi:
python värit = ['punainen', 'vihreä', 'sininen'] print(list(enumerate(colors))) # Tulos: [(0, 'red'), (1, 'green'), (2, 'blue')] print(list(enumerate(colors, start=100)))) # Output: [(100, 'punainen'), (101, 'vihreä'), (102, 'sininen')]]
Tämä on hyödyllistä debuggausta varten tai silloin, kun tarvitset kaikki indeksi-arvoparit etukäteen (muista kuitenkin, että suurten iterabelien materialisointi voi kuluttaa paljon muistia).
Miten Python enumerate() Toimii konepellin alla
Sisäisen käyttäytymisen ymmärtäminen auttaa arvostamaan sen eleganssia. Pythonin dokumentaatio kuvaa enumerate() vastaa tätä generaattorifunktiota:
python
def enumerate(iterable, start=0):
count = start
for element in iterable:
(count, element): yield (count, element)
count += 1Tämä yksinkertainen toteutus korostaa useita tärkeitä seikkoja:
- Se käyttää
tuottotehdä siitä generaattori (laiska evaluointi). - Laskuria kasvatetaan 1:llä joka kerta riippumatta iteroitavan muuttujan sisällöstä.
- Se toimii minkä tahansa iteroitavan kanssa, koska se luottaa vain iterointiprotokollaan (
__iter__tai__getitem__).
Koska se on toteutettu C:llä sisäänrakennetussa versiossa, se on myös erittäin nopea - usein nopeampi kuin manuaalinen indeksointi puhtaalla Pythonilla.
Python enumerate() erityyppisillä Iteraaleilla
Yksi vahvuuksista on enumerate() on sen monipuolisuus Pythonin eri tietotyypeissä.
Jousilla
Merkkijonot ovat merkkijonoja, joten enumerate() käsittelee jokaista merkkiä esineenä:
python
message = "Hei, maailma!"
for pos, char in enumerate(message):
Jos char.isupper():
print(f "Iso kirjain '{char}' paikassa {pos}")Lähtö:
Iso kirjain ‘H’ paikassa 0.
Iso kirjain ‘W’ paikassa 7
Iso kirjain ‘L’ paikassa 9
Tämä on hyödyllistä tekstinkäsittelytehtävissä, kuten tiettyjen merkkien paikkojen etsimisessä tai uusien merkkijonojen muodostamisessa indeksien perusteella.
Tuplilla
Tuplat toimivat täsmälleen kuten luettelot:
python
koordinaatit = (10.0, 20.0, 30.0)
for idx, coord in enumerate(coordinates):
print(f "Koordinaatti {idx}: {coord}")Sanakirjojen kanssa
Kun luetteloit sanakirjan, se käy oletusarvoisesti läpi avaimet:
python
student_scores = {'Alice': Charlie': 92} {Alice: 95, Bob: 87, Charlie: 92}
for rank, name in enumerate(student_scores, start=1):
score = student_scores[name]
print(f'{rank}. {name}: {score}')Lähtö:
1. Alice: 95
2. Bob: 87
3. Charlie: 92
Jos tarvitset sekä avaimia että arvoja, yhdistä ne komennolla .items():
python
for i, (name, score) in enumerate(student_scores.items(), start=1):
{i}. {nimi} saavutti {pisteet}")Sarjojen kanssa
Joukot ovat järjestämättömiä, mutta enumerate() määrittää indeksit edelleen iterointijärjestyksen perusteella (joka on lisäysjärjestys Python 3.7+:ssa):
python
unique_numbers = {3, 1, 4, 1, 5} # kaksoiskappaleet poistettu
for i, num in enumerate(unique_numbers):
print(i, num)Huomautus: Älä luota set-järjestykseen, jos tarvitset johdonmukaista indeksointia vanhemmissa Python-versioissa.
Range ja generaattorit
Koska alue on jo indeksipohjainen, et ehkä tarvitse enumerate(), mutta se voi olla hyödyllinen yhdistettäessä toiseen iteroitavaan komennolla zip() (käsitellään myöhemmin).
Yleiset reaalimaailman käyttötapaukset
1. Käyttäjäystävällisten numeroitujen valikoiden luominen
Komentoriviohjelmissa on usein numeroituja vaihtoehtoja:
python
options = ['Load file', 'Save file', 'Export data', 'Quit']
print("Valitse vaihtoehto:")
for num, option in enumerate(options, start=1):
print(f" {num}. {option}"))
choice = int(input("Anna numero: "))
selected = options[valinta - 1]2. Tietojenkäsittelyn seurantapaikat
Kun tietoja puhdistetaan tai muunnetaan:
python
raw_data = [' apple ', 'banana', '', 'cherry ']
for i, item in enumerate(raw_data):
puhdistettu = item.strip()
if not cleaned:
print(f "Alkuperäisestä kohdasta {i} löytyi tyhjä merkkijono")3. Kohteen kaikkien esiintymien etsiminen
Toisin kuin list.index() joka palauttaa vain ensimmäisen position, enumerate() antaa sinun löytää kaikki:
python text = "abracadabra" search_char = 'a' positions = [i for i, char in enumerate(text) if char == search_char] print(positions) # [0, 3, 5, 7, 10]
4. Luetteloiden muokkaaminen paikan päällä
Voit käyttää indeksiä elementtien päivittämiseen (vaikka uuden listan luominen on usein parempi vaihtoehto muuttumattomuuden vuoksi):
python
hinnat = [10.99, 15.50, 7.25, 12.00]
for i, price in enumerate(prices):
prices[i] = round(price * 1.1, 2) # apply 10% tax
print(hinnat)5. Uusien sekvenssien rakentaminen indekseillä
Luettelon ymmärrettävyys enumerate() ovat voimakkaita:
python words = ['python', 'on', 'mahtava'] numbered_words = [(i+1, word.upper()) for i, word in enumerate(words)] print(numbered_words) # [(1, 'PYTHON'), (2, 'IS'), (3, 'AWESOME')]
Edistyneet kuviot ja yhdistelmät
Yhdistäminen enumerate() kanssa zip()
Kun iteroidaan useiden sekvenssien yli samanaikaisesti ja tarvitaan indeksejä:
python
names = ['Alice', 'Bob', 'Charlie']
scores = [95, 87, 92]
grades = ['A', 'B', 'A-']
for i, (name, score, grade) in enumerate(zip(names, scores, grades), start=1):
print(f"{i}. {nimi}: {pisteet} ({arvosana})")Käyttämällä enumerate() lajittelussa
Säilyttää alkuperäiset indeksit lajittelun aikana:
python
students = [('Bob', 87), ('Alice', 95), ('Charlie', 92)]
# Lajittele pistemäärän mukaan alenevasti säilyttäen alkuperäisen järjestyksen tasapisteiden varalta
sorted_students = sorted(enumerate(students), key=lambda x: x[1][1], reverse=True)
for original_pos, (name, score) in sorted_students:
print(f "Alkuperäinen sijainti {original_pos+1}: {nimi} ({pisteet})")Käänteisten sekvenssien luetteleminen
python
for i, item in enumerate(reversed(['first', 'second', 'third'])):
print(f "Lopusta: sijainti {i}, kohde {kohde}")Tai mukautetulla käynnistyksellä:
python
for countdown, item in enumerate(reversed(['go', 'set', 'ready']), start=3):
print(f"{countdown}... {item}")Vinkkejä, parhaita käytäntöjä ja yleisiä sudenkuoppia
- Aina mieluummin
enumerate()manuaaliseen indeksointiin verrattuna kun tarvitset sekä indeksin että arvon. - Käytä mielekkäitä muuttujien nimiä: indeksi, kohde tai
i, elemon hyvä, muttasijainti, hedelmättaisijoitus, opiskelijaparantaa luettavuutta. - Muista, että se on laiska: Jos tarvitset satunnaista pääsyä, muuta se listaksi tai käytä muuta lähestymistapaa.
- Älä käytä
enumerate()kun tarvitaan vain arvoja-se lisää tarpeetonta yleiskustannusta. - Ole varovainen muuttaessasi iteroitavaa luettelemisen aikana.-se voi johtaa ohitettuihin tai toistuviin elementteihin.
- Tyhjiä iterableja varten, silmukan runkoa ei yksinkertaisesti koskaan suoriteta - useimmissa tapauksissa ei tarvita erityisiä tarkistuksia.
- Suorituskykyä koskeva huomautus:
enumerate()on erittäin optimoitu ja yleensä nopeampi kuin manuaalinen laskenta puhtaalla Pythonilla.
Johtopäätös
The enumerate() funktio saattaa vaikuttaa pieneltä ja vaatimattomalta, mutta se ilmentää täydellisesti Pythonin suunnittelufilosofiaa: yksinkertaisia, helppolukuisia ja tehokkaita ratkaisuja yleisiin ongelmiin. Kun se tarjoaa automaattisesti indeksit iteroinnin aikana, se poistaa kokonaisen luokan aloittelijoiden virheitä ja edistää samalla puhdasta koodia, jota kokeneet kehittäjät arvostavat.
Olipa kyse sitten yksinkertaisen skriptin rakentamisesta, tietojen käsittelystä, käyttöliittymien luomisesta tai monimutkaisten algoritmien käsittelystä, enumerate() ilmestyy yhä uudelleen ja uudelleen. Sen hallitseminen varhaisessa vaiheessa antaa sinulle vahvan perustan idiomaattiselle Pythonille ja auttaa sinua kirjoittamaan koodia, joka on paitsi virheetöntä myös tyylikästä ja ylläpidettävää.
Käytä aikaa harjoitella tämän oppaan esimerkkejä. Korvaa manuaaliset laskurit enumerate(), kokeile erilaisia iterableja ja lähtöarvoja ja yhdistä se muihin Python-työkaluihin, kuten zip() ja listakäsittelyt. Ennen pitkää, käyttämällä enumerate() tuntuu täysin luonnolliselta - ja ihmettelet, miten olet ikinä loopannut ilman sitä.
Jos haluat soveltaa näitä parhaita käytäntöjä todellisissa projekteissa, Carmatec on luotettu Python kehitys yritys auttaa yrityksiä rakentamaan skaalautuvia ja suorituskykyisiä sovelluksia. Tarvitsitpa sitten asiantuntevaa opastusta, koodin optimointia tai halusitpa tehdä palkata Python-kehittäjiä Carmatec tarjoaa liiketoimintasi tavoitteisiin räätälöityjä ratkaisuja, joilla on käytännön kokemusta puhtaista ja tehokkaista koodausmalleista.