nonlocal ja muuttuva tila
Muokkaa ympäröivää näkyvyysaluetta
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;
nonlocalestää tämän. nonlocalkohdistuu ympäröivän funktion vaikutusalueeseen, kun taasglobalkohdistuu 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())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
- Ensiluokkaiset funktiot
- Sulkeumat ja vapaat muuttujat
- nonlocal ja muuttuva tila
- Osittaiset funktiot