Python Academy · Oppitunti

nonlocal ja muuttuva tila

Muokkaa ympäröivää näkyvyysaluetta

Oppitunti 3/413 vaihetta

nonlocal ja muuttuva tila on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Python Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Python Academy-kurssilla on yhteensä 4 oppituntia.

Ympäröivien muuttujien lukeminen ja kirjoittaminen

Sisempi funktio voi vapaasti lukea ympäröivää muuttujaa, mutta jos se yrittää sijoittaa arvon tähän nimeen, Python käsittelee sitä sen sijaan uutena paikallisena muuttujana. Tämä yllättää usein aloittelijat.

def outer():
    count = 0
    def inner():
        return count
    return inner()
print(outer())

Sijoittamisen sudenkuoppa

Jos ympäröivään nimeen sijoitetaan arvoa ilmoittamatta tarkoitusta, nimestä tulee paikallinen, joten ulompaa muuttujaa ei koskaan päivitetä. Tässä muutos menetetään.

def outer():
    count = 0
    def bump():
        count = count + 1
    try:
        bump()
    except UnboundLocalError as e:
        print('Error:', e)
outer()

nonlocal-avainsana

nonlocal ilmoittaa, että nimi viittaa lähimmän ympäröivän funktion vaikutusalueella olevaan muuttujaan. Siksi sijoitukset päivittävät ulompaa muuttujaa uuden paikallisen muuttujan luomisen sijaan.

def outer():
    count = 0
    def bump():
        nonlocal count
        count += 1
    bump()
    bump()
    return count
print(outer())

Laskurina toimiva sulkeuma

nonlocal-avainsanan avulla voitte rakentaa tilallisen laskurin. Jokainen kutsu muuttaa kaapattua muuttujaa ja muistaa sen etenemisen.

def make_counter():
    count = 0
    def increment():
        nonlocal count
        count += 1
        return count
    return increment
c = make_counter()
print(c())
print(c())
print(c())

Itsenäiset laskurit

Jokainen laskuri säilyttää oman tilansa, koska jokainen sulkeuma kaappaa erillisen muuttujan.

def make_counter():
    count = 0
    def inc():
        nonlocal count
        count += 1
        return count
    return inc
a = make_counter()
b = make_counter()
print(a(), a(), b())

nonlocal ja global vertailussa

nonlocal kohdistuu ympäröivän funktion vaikutusalueeseen, kun taas global kohdistuu moduulitasolle. Käyttäkää nonlocalia sulkeumissa ja globalia moduulin laajuisessa tilassa.

total = 0
def add_global(n):
    global total
    total += n
add_global(5)
add_global(3)
print(total)

Muuttuva tila ilman nonlocalia

Jos ympäröivä arvo on muuttuva olio, kuten lista tai sanakirja, voitte muuttaa sitä paikallaan ilman nonlocal-avainsanaa, koska ette sido nimeä uudelleen.

def make_logger():
    history = []
    def log(msg):
        history.append(msg)
        return history
    return log
log = make_logger()
log('start')
print(log('stop'))

Kertymä

nonlocal-avainsanan ja sulkeuman yhdistelmällä saadaan aikaan juokseva kertymä, joka lisää jokaisen arvon muistiin tallennettuun kokonaismäärään.

def make_accumulator():
    total = 0
    def add(n):
        nonlocal total
        total += n
        return total
    return add
acc = make_accumulator()
print(acc(10))
print(acc(5))
print(acc(100))

Yksinkertainen vaihtokytkin

nonlocal helpottaa totuusarvotilan vaihtamista kutsujen välillä.

def make_toggle():
    on = False
    def toggle():
        nonlocal on
        on = not on
        return on
    return toggle
t = make_toggle()
print(t(), t(), t())

Tilan nollaaminen

Voitte tarjota useita sisempiä funktioita, jotka jakavat saman ympäröivän tilan, esimerkiksi yhden lisäämistä ja toisen nollaamista varten.

def make_bank():
    balance = 0
    def deposit(n):
        nonlocal balance
        balance += n
        return balance
    def reset():
        nonlocal balance
        balance = 0
        return balance
    return deposit, reset
deposit, reset = make_bank()
print(deposit(50))
print(reset())

nonlocal edellyttää olemassa olevaa muuttujaa

nonlocal edellyttää, että nimi on jo olemassa ympäröivässä vaikutusalueessa. Muussa tapauksessa Python nostaa SyntaxError-virheen määrittelyhetkellä. Se ei voi luoda uutta ulompaa muuttujaa.

def outer():
    value = 'set'
    def inner():
        nonlocal value
        value = 'changed'
    inner()
    return value
print(outer())

Pikatarkistus

Haluatte sisäkkäisessä funktiossa sijoittaa uuden arvon ympäröivän funktion muuttujaan. Mitä avainsanaa käytätte?

Kertaus: nonlocal ja muuttuva tila

Yhteenveto:

  • Ympäröivään nimeen sijoittaminen luo normaalisti uuden paikallisen muuttujan; nonlocal estää tämän.
  • nonlocal kohdistuu ympäröivän funktion vaikutusalueeseen, kun taas global kohdistuu moduuliin.
  • Muuttuvan olion muuttaminen paikallaan ei edellytä ilmoitusta.
  • nonlocal-avainsanaa käyttävät sulkeumat muodostavat laskureita, kertymiä ja vaihtokytkimiä, jotka muistavat tilansa.
def make_counter():
    n = 0
    def inc():
        nonlocal n
        n += 1
        return n
    return inc
c = make_counter()
print(c(), c())
Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
76
Oppitunnit
320

Usein kysytyt kysymykset

Onko oppitunti ”nonlocal ja muuttuva tila” ilmainen?

Kyllä – oppitunnin ”nonlocal ja muuttuva tila” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Python Academy-kurssin, päivitä CoddyKit PROhon. Python Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”nonlocal ja muuttuva tila”?

Muokkaa ympäröivää näkyvyysaluetta Harjoittelet Python Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Python Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Python Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”nonlocal ja muuttuva tila”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Python Academy-oppitunnilla?

Kyllä. Jokainen Python Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Ensiluokkaiset funktiot
  2. Sulkeumat ja vapaat muuttujat
  3. nonlocal ja muuttuva tila
  4. Osittaiset funktiot
← Takaisin: Python Academy