fonto: http://inventwithpython.com/chapter6.html
Temoj Kovrite En tiu ĉapitro:
- La tempo modulo.
- La time.sleep () funkcio.
- La reveno ŝlosilvorto.
- Krei nian propran funkcioj kun la def ŝlosilvorto.
- La kaj kaj aŭ, kaj ne Bulea operatoroj.
- Vero tabloj
- Variablo medio (Suma kaj Loka)
- Parametroj kaj Argumentoj
- Fluo lertaj
Enkondukante Funkcioj
Ni jam uzis du funkcioj en nia antaŭaj programoj: input () kaj presita (). En nia antaŭaj programoj, ni nomas tiujn funkciojn por ekzekuti la kodo kiu estas ene tiuj funkcioj. En ĉi tiu ĉapitro, ni skribos nian propran funkcioj por niaj programoj nomi. Funkcio estas kiel mini-programo kiu estas ene de nia programo. Multfoje en programo ni volas lanĉi la ĝusta sama kodo plurfoje. Anstataŭ tajpi tiun kodo plurfoje, ni povas meti tiun kodon ene de funkcio kaj vokas la funkcion plurfoje. Ĉi tio havas la aldonita profito, ke se ni faras eraron, ni nur havas unu loko en la kodo por ŝanĝi ĝin.La ludo ni kreos enkonduki funkcioj estas nomata "Drako Reĝlando", kaj lasas la ludanto faras guess inter du kavernoj kiuj hazarde teni trezoron aŭ iuj pereo.
Kiel Play "Drako Realm"
En tiu ludo, la ludanto estas en lando, plena de drakoj. La drakoj ĉiuj vivas en kavernoj kaj iliaj grandaj amasoj de kolektita trezoro. Iuj drakoj estas amikaj, kaj dividos siajn trezoro kun vi. Aliaj drakoj estas avidaj kaj malsata, kaj konsumos ĉiu kiu eniras sian kavernon. La ludanto estas fronte de du kavernoj, kun amika drako kaj la alia kun malsata drako. La ludanto estas donita elekto inter la du.Malfermi novan dosieron redaktanto fenestro per musklako sur la menuo poste alklaku En la malplenan fenestron kiu aperas tajpu la fontkodon kaj savi la fontkodon kiel dragon.py. Tiam ruli la programaron premante F5.
Specimeno Run de Dragon Reĝlando
Vi estas en lando, plena de drakoj. Antaŭ vi,
vi vidas du kavernoj. En unu kavernon, la drako estas amika
kaj dividos sian trezoron kun vi. La aliaj drako
estas avidaj kaj malsata, kaj konsumos vin sur vidpovon.
Kiu kaverno vi iros en? (1 aŭ 2)
1
Vi alproksimigi la kaverno ...
Ĝi estas malluma kaj spooky ...
Granda drako elsaltas antaŭ vi! Li malfermas la makzeloj kaj ...
Gobbles vin en unu mordo!
Ĉu vi volas ludi denove? (Jes aŭ ne)
neniu
vi vidas du kavernoj. En unu kavernon, la drako estas amika
kaj dividos sian trezoron kun vi. La aliaj drako
estas avidaj kaj malsata, kaj konsumos vin sur vidpovon.
Kiu kaverno vi iros en? (1 aŭ 2)
1
Vi alproksimigi la kaverno ...
Ĝi estas malluma kaj spooky ...
Granda drako elsaltas antaŭ vi! Li malfermas la makzeloj kaj ...
Gobbles vin en unu mordo!
Ĉu vi volas ludi denove? (Jes aŭ ne)
neniu
Drako Reĝlando de Fonta Kodo
Jen la fontkodon por la Drako Reĝlando ludo. Tajpi en la fontkodo estas granda vojo por alkutimiĝi al la kodo. Sed se vi ne volas fari ĉion ĉi tajpadon, vi povas elŝuti la fontkodon de tiu libro de afiŝinto ĉe la URL http://inventwithpython.com/chapter6 . Esas instrukciojn en la retejo kiun mi diros al vi kiel elŝuti kaj malfermu la fontkodo dosiero. Se vi tajpas en la kodo mem, vi povas uzi la interreto malsamoj ilo en la retejo por kontroli por ajna erarojn en via kodo.Unu afero scii kiom vi tralegu la kodon: La blokoj kiuj sekvas la def linioj difini funkcion, sed la kodo en tiu bloko ne kuras ĝis la funkcio estas nomita. La kodo ne ekzekuti ĉiun linion en tiu programo en supro malsupren ordo. Tiu estos klarigita en pli detalo poste en ĉi tiu ĉapitro.
Grava Noto! Nepre kuri ĉi programo kun Python 3, kaj ne Python 2. La programoj en tiu libro uzi Python 3, kaj vi ricevos erarojn se vi provas kuri ilin per Python 2. Vi povas alklaki kaj poste por eltrovi kio versio de Python vi havas.
dragon.py
Tiu kodo estas elŝutebla el http://inventwithpython.com/dragon.py
Se vi ricevas erarojn post tajpi tiun kodon en, kompari ĝin al la libro kodo kun la linio malsamoj ilo en http://inventwithpython.com/diff aŭ retpoŝtu la aŭtoro en al@inventwithpython.com
Tiu kodo estas elŝutebla el http://inventwithpython.com/dragon.py
Se vi ricevas erarojn post tajpi tiun kodon en, kompari ĝin al la libro kodo kun la linio malsamoj ilo en http://inventwithpython.com/diff aŭ retpoŝtu la aŭtoro en al@inventwithpython.com
- importi hazarda
- importado tempo
- def displayIntro ():
- presi ('Vi estas en lando, plena de drakoj. Antaŭ vi,')
- print ('vi vidas du kavernoj. En unu kavernon, la drako estas amika')
- print ('kaj dividos sian trezoron kun vi. La aliaj drako')
- presi ('estas avidaj kaj malsata, kaj konsumos vin sur okuloj.')
- print ()
- def chooseCave ():
- kaverno =''
- dum kaverno! = '1 'kaj kaverno! = '2':
- print ('Kiu kaverno vi iros en? (1 aŭ 2)')
- kaverno = input ()
- revenu kaverno
- def checkCave (chosenCave):
- print ('Vi alproksimigi la kaverno ...')
- time.sleep (2)
- print ('Ĝi estas malluma kaj spooky ...')
- time.sleep (2)
- print ('Granda drako elsaltas antaŭ vi! Li malfermas siajn makzelojn kaj ...')
- print ()
- time.sleep (2)
- friendlyCave = random.randint (1, 2)
- se chosenCave == str (friendlyCave):
- presi ('Donas al vi lian trezoron!')
- alie:
- presi ('Gobbles vin en unu mordo!')
- playAgain = 'jes'
- dum playAgain == 'jes' aŭ playAgain == 'y':
- displayIntro ()
- caveNumber = chooseCave ()
- checkCave (caveNumber)
- presi ('Ĉu vi volas ludi denove? (jes aŭ ne)')
- playAgain = input ()
Kiel la Kodo Verkoj
Ni rigardu la fontkodon pli detale.- importi hazarda
- importado tempo
Difinanta la displayIntro () Funkcio
- def displayIntro ():
- presi ('Vi estas en lando, plena de drakoj. Antaŭ vi,')
- print ('vi vidas du kavernoj. En unu kavernon, la drako estas amika')
- print ('kaj dividos sian trezoron kun vi. La aliaj drako')
- presi ('estas avidaj kaj malsata, kaj konsumos vin sur okuloj.')
- print ()
Figuro 6-1: Partoj de def komunikaĵo. |
def Deklaroj
La def aserto ne estas alvoko al funkcio nomata displayIntro (). Anstataŭe, la def deklaro signifas ke ni kreas, aŭ difini, nova funkcio kiu ni povas nomi poste en nia programo. Post ni difini tiun funkcion, oni povas nomi ĝin la sama maniero ni nomas aliajn funkciojn. Kiam ni nomas tiun funkcion, la kodo ene la def-bloko estos ekzekutita.Ni ankaŭ insistas, ke ni difinas variabloj kiam ni kreas ilin per asigno komunikaĵo. La kodo spamado = 42 difinas la variablon spamado.
Memoru, la def aserto ne ekzekuti la kodo nun, nur difinas kio kodo estas ekzekutita kiam ni nomas la displayIntro () funkcio poste en la programo. Kiam la programo ekzekuto atingas def deklaro, ĝi saltas malsupren al la fino de la def-bloko. Ni salti reen al la supro de la def-bloko kiam la displayIntro () funkcio estas nomita. Ĝi tiam ekzekuti ĉiujn print () deklaroj ene la def-bloko. Do ni nomas tiun funkcion kiam ni volas montri la "Vi estas en lando, plena de drakoj ..." enkonduko al la uzanto.
Kiam ni nomas la displayIntro () funkcio, la programo ekzekuto saltas al la komenco de la funkcio sur linio 5. Kiam la funkcia bloko finiĝas, la programo ekzekuto revenas al la linio kiu nomis la funkcio.
Ni klarigos ĉiujn funkciojn kiuj ĉi programo uzos antaŭ ol ni klarigi la ĉefa parto de la programo. Eble iom konfuza por lerni la programo el la ordo kiu ekzekutas. Sed ĝuste memoru, ke kiam ni difini la funkcioj nur silente sidas ĉirkaŭe atendis esti nomata en ago.
Difinanta la chooseCave () Funkcio
- def chooseCave ():
- kaverno =''
- dum kaverno! = '1 'kaj kaverno! = '2':
Bulea Operacisimboloj
Bulea logiko traktas aferojn kiuj estas ĉu vera aŭ malvera. Jen kial la Bulea datumtipo nur havas du valorojn, Vera kaj Falsa. Bulea esprimoj estas ĉiam aŭ Vera aŭ Falsa. Se la esprimo ne estas vera, tiam ĝi estas falsa. Kaj se la esprimo estas ne Falsa, tiam ĝi estas True.Bulea operatoroj komparas du Buleaj valoroj (ankaŭ nomita bools) kaj taksi al sola Bulea valoro. Ĉu vi memoras kiel la * operatoro estos kombini du entjeraj valoroj kaj produkti novajn entjera valoro (la produkto de la du originalajn entjeroj)? Kaj ĉu vi ankaŭ memoras kiel la + operatoro povas kombini du kordoj kaj produkti novan ĉenon valoro (la kunmeto de la du originalajn kordoj)? La kaj Buleaj operatoro kombinas du Buleaj valoroj por produkti novajn Bulea valoro. Jen kiel la kaj telefonisto verkoj.
Pensu pri la frazo, "Katoj havas barbon kaj hundoj havas voston." Tiu frazo estas vera, ĉar "katoj havas lipharojn" estas vera kaj "hundoj havas vostojn" estas ankaŭ vera.
Sed la frazo, "Katoj havas barbon kaj hundoj havas flugilojn" estus falsaj. Kvankam "katoj havas lipharojn" estas vera, hundoj ne havas flugilojn, do "hundoj havas flugilojn" estas malvera. La tuta frazo estas nur vera se ambaŭ partoj estas vera ĉar la du partoj estas konektitaj de la vorto "kaj." Se unu aŭ ambaŭ partoj estas malvera, tiam la tuta frazo estas malvera.
La kaj telefonisto en Python funkcias tiamaniere ankaŭ. Se la Bulea valoroj sur ambaŭ flankoj de la kaj ŝlosilvorto estas vere, tiam la esprimon kun la kaj telefonisto taksas al True. Se iu el la Bulea valoroj estas False, aŭ ambaŭ de la Bulea valoroj estas False, tiam la esprimo taksas al False.
Taksante la Esprimo Tio Enhavas Bulea Operacisimboloj
Do ni rigardu la linio 13 denove:- dum kaverno! = '1 'kaj kaverno! = '2':
La kordoj valoro stokita en kaverno, kiam ni unue ekzekuti ĉi dum deklaro estas la malplenan ĉenon,''. La malplenan ĉenon ne egala la kordo '1 ', do la maldekstra flanko taksas al True. La malplenan ĉenon ankaŭ ne egala la kordo '2 ', do la dekstra flanko taksas al True. Do la kondiĉo poste igas Vera kaj Vera. Ĉar ambaŭ Bulea valoroj estas Vera, la kondiĉo fine taksas al True. Kaj ĉar la dum deklaro de kondiĉo estas vera, la programo ekzekuto eniras la samtempe-bloko.
Tio ĉio farita de la Python interpretisto, sed estas grave kompreni kiel la interpretisto tion faras. Tiu bildo montras la paŝojn de kiel la interpretisto taksas la kondiĉo (se la valoro de kaverno estas la malplenan ĉenon):
dum kaverno! = '1 'kaj kaverno! = '2':
dum''! = '1 'kaj kaverno! = '2':
dum Vera kaj kaverno! = '2 ':
dum Vera kaj''! = '2 ':
dum Vera kaj Vera;
dum Vera:
dum''! = '1 'kaj kaverno! = '2':
dum Vera kaj kaverno! = '2 ':
dum Vera kaj''! = '2 ':
dum Vera kaj Vera;
dum Vera:
Spertante la kaj kaj aŭ Operacisimboloj
Provu tajpi la sekva en la interaga konko:
>>> Vera kaj Vera
Vera
>>> Vera kaj Falsa
Falsaj
>>> Falsa kaj Vera
Falsaj
>>> Falsa kaj Falsa
Falsaj
Estas du aliaj Bulea operatoroj. La proksima estas la aŭ operatoro. La aŭ operatoro funkcias simila al la kaj, krom tio taksos al Vera se iu el la du Buleaj valoroj estas True. La sola tempo la aŭ operatoro taksas al falsa estas se ambaŭ de la Bulea valoroj estas False. Vera
>>> Vera kaj Falsa
Falsaj
>>> Falsa kaj Vera
Falsaj
>>> Falsa kaj Falsa
Falsaj
La frazo "Katoj havas lipharojn aŭ hundoj havas flugilojn." estas vera. Kvankam hundoj ne havas flugilojn, kiam ni diras "aŭ" ni volas diri, ke unu el la du partoj estas vera. La frazo "Katoj havas lipharojn aŭ hundoj havas voston." Estas ankaŭ vera. (La plejparto de la tempo, kiam ni diras "tiu aŭ alia", ni signifi aĵon estas vera sed la alia afero estas falsaj. En programado, "aŭ" signifas ke iu el la aĵoj estas vera, aŭ eble pri la cirkonstancoj estas veraj ).
Provu tajpi la sekva en la interaga konko:
>>> Vera aŭ Vera
Vera
>>> Vera aŭ Falsa
Vera
>>> Falsa aŭ vera
Vera
>>> Falsa aŭ Falsa
Falsaj
Vera
>>> Vera aŭ Falsa
Vera
>>> Falsa aŭ vera
Vera
>>> Falsa aŭ Falsa
Falsaj
Sperti kun la ne Operatoro
La tria Bulea operatoro estas ne. La ne operatoro estas malsama de ĉiuj aliaj operatoro ni vidis antaŭe, ĉar ĝi nur funkcias en unu valoro, ne du. Estas nur valoro sur la dekstra flanko de la ne ŝlosilvorto, kaj neniu en la maldekstra. La ne operatoro taksos al Vera kiel Falsa kaj taksos Falsa kiel Vera.Provu tajpi la sekva en la interaga konko:
>>> Ne Vera
Falsaj
>>> Ne Falsaj
Vera
>>> Vera ne
SyntaxError: nevalida sintakso (<pyshell#0>, linio 1)
Rimarku ke se ni metas la Bulea valoro sur la maldekstra flanko de la ne operatoro rezultoj en sintaksa eraro. Falsaj
>>> Ne Falsaj
Vera
>>> Vera ne
SyntaxError: nevalida sintakso (<pyshell#0>, linio 1)
Ni povas uzi ambaŭ la kaj kaj ne operatoroj en sola esprimo. Provu tajpi Vera kaj Falsa ne en la ŝelo:
>>> Vera kaj Falsa ne
Vera
Kutime la esprimo Vera kaj Falsa estus taksi al False. Sed la vera kaj ne Falsa esprimo taksas al True. Ĉi tiu estas ĉar ne Falsa taksas al Vera, kiu igas la esprimon en vera kaj Vera, kiu taksas al True. Vera
Vero Tabeloj
Se vi iam forgesos kiel la Bulea operatoroj funkcias, vi povas rigardi tiujn lertaj, kiuj estas nomataj vero tabuloj:A | kaj | B | estas | Tuta frazo |
---|---|---|---|---|
Vera | kaj | Vera | estas | Vera |
Vera | kaj | Falsaj | estas | Falsaj |
Falsaj | kaj | Vera | estas | Falsaj |
Falsaj | kaj | Falsaj | estas | Falsaj |
A | aŭ | B | estas | Tuta frazo |
---|---|---|---|---|
Vera | aŭ | Vera | estas | Vera |
Vera | aŭ | Falsaj | estas | Vera |
Falsaj | aŭ | Vera | estas | Vera |
Falsaj | aŭ | Falsaj | estas | Falsaj |
ne A | estas | Tuta frazo |
---|---|---|
ne Vera | estas | Falsaj |
ne Falsaj | estas | Vera |
Havigo de la ludanto Eniro
- dum kaverno! = '1 'kaj kaverno! = '2':
- print ('Kiu kaverno vi iros en? (1 aŭ 2)')
- kaverno = input ()
Se tiu kondiĉo taksas al Vera, ni eniros en la dum-bloko denove kaj peti la ludanto kaverno nombro eniri. Sed se la ludanto tajpita en 1 aŭ 2, tiam la kaverno valoro estos ĉu esti '1 'aŭ '2'. Tiu kaŭzas la kondiĉo por taksi por Falsa, kaj la programo ekzekuto daŭrigos la pasinteco la dum ciklo.
La kialo ni havas buklo tie estas ĉar la ludanto povas esti tajpita en 3 aŭ 4 aŭ SALUTON. Nia programo ne havas sencon de ĉi tio, do se la ludanto ne eniris 1 aŭ 2, tiam la programo cikloj dorso kaj petas la ludanton denove. Fakte, la komputilo pacience petas la ludanton al la kaverno nombro denove kaj denove ĝis la ludanto tipoj en 1 aŭ 2. Kiam la ludanto faras tion, la dum-bloko la kondiĉo estos Falsa, kaj ni salti malsupren preter la tempo-blokon kaj daŭrigi kun la programo.
Reiri Valoroj
- revenu kaverno
Tio signifas ke se ni havis linion de kodo kiel spamon = chooseCave (), la kodo ene chooseCave () estus ekzekutita kaj la funkcio alvoko taksos al chooseCave () 's reveno valoro. La reveno valoro estos ĉu estos la kordo '1 'aŭ ĉeno '2'. (Nia dum buklo garantias ke chooseCave () nur redoni ĉu '1 'aŭ '2'.)
La reveno ŝlosilvorto estas nur trovis interne def-blokojn. Iam la reveno aserto estas ekzekutita, ni tuj salti el la def-bloko. (Ĉi tio estas kiel kiel la rompo deklaro nin faros salti el tempo-bloko.) La programo ekzekuto movas reen al la linio kiu vokis la funkcio.
Vi povas ankaŭ uzi la reveno ŝlosilvorto por oni nur sian eliron el la funkcio, kiel la rompo ŝlosilvorto rompos el tempo buklo.
Variablo Medio
Ĝuste kiel la valoroj en nia programo variabloj estas forgesitaj post la programo finiĝas, variabloj kreita interne de la funkcio estas forgesitaj post la ekzekuto lasas la funkcio. Ne nur tio, sed kiam ekzekuto estas ene de la funkcio, ni ne povas ŝanĝi la variablojn ekstere de la funkcio, aŭ variabloj ene aliaj funkcioj. La variablo la medio estas ĉi gamo kiu variabloj povas esti modifita in La sola variabloj kiuj povas uzi ene de funkcio estas kiuj ni kreas ene de la funkcio (aŭ la parametron variabloj, priskribita poste). Tio estas, la medio de la variablo estas ene en la funkcia bloko. La medio de variabloj kreita ekstere de funkcioj estas ekstere de ĉiuj funkcioj en la programo.Ne nur tio, sed se ni havas variablo nomata spamado kreita ekstere de funkcio, kaj ni krei variablon nomata spamado ene de la funkcio, la Python interpretisto konsideros ilin kiel du apartaj variabloj. Tio signifas ke ni povas ŝanĝi la valoron de la spam ene de la funkcio, kaj ĉi tio ne ŝanĝas la spamado variablo kiu estas ekstere de la funkcio. Ĉi tiu estas ĉar tiuj variabloj havas malsamaj medioj, la tutmonda medio kaj en la loka amplekso.
Suma Medio kaj Loka Medio
Ni havas nomojn por tiuj medioj. La medio ekstere de ĉiuj funkcioj estas nomata la tutmonda amplekso. La medio interne de funkcio estas nomita la loka amplekso. La tuta programo havas nur unu tutmondan medion, kaj ĉiu funkcio havas lokan medio de lia propra. Medioj estas nomitaj ankaŭ nomspacoj.Variabloj difinita en la tutmonda amplekso povas legi ekstere kaj interne funkcioj, sed nur povas redaktita ekstere de ĉiuj funkcioj. Variabloj difinita en funkcia loka amplekso nur povas legi aŭ redaktita ene tiu funkcio.
Specife, ni povas legi la valoron de tutmonda variabloj de la loka medio, fato provas ŝanĝi la valoron en suma variablo de la loka amplekso lasos la malloka variablo neŝanĝita. Kio Python fakte faras estas krei lokajn variablo kun la sama nomo kiel la tutmonda variablo. Sed Python konsideros tiujn esti du malsamaj variabloj.
Ankaŭ, tutmonda variabloj ne povas legi de loka medion se vi modifas ke variablo interne de la loka amplekso. Ekzemple, se vi havus variablo nomata spamado en la suma amplekso sed ankaŭ modifita variablo nomata spamado en la loka medio (diru, kun atribuo deklaro) tiam la nomon "spamado" povas nur raporti al la loka amplekso variablo.
Rigardu ĉi tiun ekzemplon por vidi kio okazas kiam vi provas ŝanĝi malloka variablo de ene lokan medion. Memoru ke la kodo en la funky () funkcio ne kuri ĝis la funky () funkcio estas nomita. La komentoj klarigi kio okazas:
# Ĉi tiu bloko ne kuras ĝis funky () nomiĝas:
def funky ():
# Ni kreas lokan variablon nomita "spamado"
# Anstataŭ ŝanĝi la valoron de la tutmonda
# Variablo "spamado":
spamado = 99
# La nomo "spamado" nun raportas al la loka
# Variablo nur por la resto de ĉi tiu
# Funkcio:
print (spamado) # 99
# Tutmonda variablo nomita "spamado":
spamado = 42
print (spamado) # 42
# Alvoku la funky () funkcio:
funky ()
# La malloka variablo ne ŝanĝis en funky ():
print (spamado) # 42
Kiam kuri, ĉi tiu kodo estos eliro jeno: def funky ():
# Ni kreas lokan variablon nomita "spamado"
# Anstataŭ ŝanĝi la valoron de la tutmonda
# Variablo "spamado":
spamado = 99
# La nomo "spamado" nun raportas al la loka
# Variablo nur por la resto de ĉi tiu
# Funkcio:
print (spamado) # 99
# Tutmonda variablo nomita "spamado":
spamado = 42
print (spamado) # 42
# Alvoku la funky () funkcio:
funky ()
# La malloka variablo ne ŝanĝis en funky ():
print (spamado) # 42
42
99
42
Estas grave scii kiam variablo estas difinita ĉar tio estas kiel ni konas la variablo la medion. Variablo estas difinita la unua fojo ni uzas ĝin en asigno komunikaĵo. Kiam la programo unue ekzekutas la linion: 99
42
- kaverno =''
Se ni nomas la chooseCave () funkcio dufoje, la valoro stokita en la variablo la unua fojo ne estos memori la dua fojo ĉirkaŭe. Ĉi tiu estas ĉar kiam la ekzekuto forlasis la chooseCave () funkcio (te maldekstra chooseCave () 's loka medio), la kaverno variablo estis forgesita kaj detruita. Sed estos difinita denove kiam ni vokas la funkcion duafoje ĉar linio 12 estos ekzekutita denove.
La grava afero por memori estas ke la valoro de variablo en la loka amplekso ne memoris en inter funkcio alvokoj.
Difinanta la checkCave () Funkcio
- def checkCave (chosenCave):
Memoru, por iuj funkcioj kiel la str () aŭ randint (), ni pasus argumento inter la krampoj:
>>> Str (5)
'5 '
>>> Random.randint (1, 20)
14
Kiam ni nomas checkCave (), ni ankaŭ pasas unu valoro al ĝi kiel argumento. Kiam ekzekuto movas ene la checkCave () funkcion, nova variablo nomata chosenCave estos atribuita ĉi tiu valoro.
Jen kiel ni pasas variablo valoroj al funkcioj de funkcioj ne povas
legi variabloj ekstere de la funkcio (tio estas, ekstere de la funkcia
loka medio). '5 '
>>> Random.randint (1, 20)
14
Parametroj estas lokaj variabloj kiuj get difinita kiam funkcio estas nomita. La valoro stokita en la parametro estas la argumento kiu pasis en la funkcio nomita.
Parametroj
Ekzemple, ĉi tie estas mallonga programo kiu pruvas parametroj. Imagu ni havis mallongan programon kiu aspektis jene:
def sayHello (nomo):
print ('Saluton,' + nomo)
print ('Say hello al Alice.')
fizzy = 'Alico'
sayHello (fizzy)
print ('Ne forgesu diri saluton al Bob.')
sayHello ('Bob')
Se ni kuras koncerna programo, ĝi aspektas jene: print ('Saluton,' + nomo)
print ('Say hello al Alice.')
fizzy = 'Alico'
sayHello (fizzy)
print ('Ne forgesu diri saluton al Bob.')
sayHello ('Bob')
Diru saluton al Alice.
Saluton, Alico
Ne forgesu diri saluton al Bob.
Saluton, Bob
Ĉi tiu programo nomas funkcion ni kreis, sayHello () kaj unue pasas la valoron en la fizzy variablo kiel argumento por tio. (Ni stokas la ĉeno 'Alico' en fizzy.) Poste, la programo vokas la sayHello () funkcio denove, pasante la ĉeno 'Bob' kiel argumento. Saluton, Alico
Ne forgesu diri saluton al Bob.
Saluton, Bob
La valoron en la fizzy variablo kaj la ĉeno 'Bob' estas argumentoj. La nomo variablo en sayHello () estas parametro. La diferenco inter argumentoj kaj parametroj estas ke argumentoj estas la valoroj pasis en funkcio alvoko, kaj parametroj estas la loka variabloj kiuj stokas la argumentojn. Ĝi povus esti pli facile ĝuste memoras, ke la afero inter la krampoj en la def aserto estas parametro, kaj la afero inter la krampoj en la funkcio alvoko estas argumento.
Ni povis esti simple uzis la fizzy variablo ene la sayHello () funkcio anstataŭ uzi parametro. (Ĉi tiu estas ĉar la loka amplekso povas ankoraŭ vidi variabloj en la tutmonda amplekso.) Sed tiam ni devus memori atribui la fizzy variablo ĉenon ĉiu tempo antaŭ ni nomas la sayHello () funkcio. Parametroj fari niaj programoj pli simpla. Rigardu ĉi kodo:
def sayHello ():
print ('Saluton,' + fizzy)
print ('Say hello al Alice.')
fizzy = 'Alico'
sayHello ()
print ('Ne forgesu diri saluton al Bob.')
sayHello ()
Kiam ni kuros ĉi tiu kodo, ĝi aspektas jene: print ('Saluton,' + fizzy)
print ('Say hello al Alice.')
fizzy = 'Alico'
sayHello ()
print ('Ne forgesu diri saluton al Bob.')
sayHello ()
Diru saluton al Alice.
Saluton, Alico
Ne forgesu diri saluton al Bob.
Saluton, Alico
Tiu programo sayHello () funkcio ne havas parametro, sed uzas la malloka variablo fizzy rekte. Memoru, ke vi povas legi tutmondan variabloj ene de funkcioj, vi simple ne povas modifi la valoro stokita en la variablo. Saluton, Alico
Ne forgesu diri saluton al Bob.
Saluton, Alico
Sen parametroj, ni devas memori, por devigadi la fizzy variablo antaux voko sayHello (). En ĉi tiu programo, ni forgesis tion fari, do la dua fojo ni nomas sayHello () la valoro de fizzy estis ankoraŭ 'Alico'. Uzanta parametroj anstataŭ tutmonda variabloj faras funkcio vokas simple fari, speciale kiam niaj programoj estas tre granda kaj havas multajn funkciojn.
Kie Put Funkcio Difinoj
Funkcio de difino (kie ni metas la def deklaro kaj la def-bloko) devas veni antaux vi nomas la funkcio. Ĉi tio estas kiel kiel vi devas atribui valoron al variablo antaŭ ol vi povos uzi la variablo. Se vi metas la funkcio alvoko antaŭ la funkcio difino, vi ricevos eraron. Rigardu ĉi kodo:
sayGoodBye ()
def sayGoodBye ():
print ('revido!')
Se vi provas ruli ĝin, Python donos al vi erarmesagxon, ke aspektas jene: def sayGoodBye ():
print ('revido!')
Traceback (plej lasta alvoko lasta):
Dosieron "C: \ Python31 \ foo.py", linio 1, en <module>
sayGoodBye ()
NameError: nomo 'sayGoodBye' ne estas difinita
Ripari tion, metis la funkcio difino antaŭ la funkcio alvoko: Dosieron "C: \ Python31 \ foo.py", linio 1, en <module>
sayGoodBye ()
NameError: nomo 'sayGoodBye' ne estas difinita
def sayGoodBye ():
print ('revido!')
sayGoodBye ()
print ('revido!')
sayGoodBye ()
Montrante La Ludo Rezultoj
Reen al la ludo fontkodon:- print ('Vi alproksimigi la kaverno ...')
- time.sleep (2)
- print ('Ĝi estas malluma kaj spooky ...')
- time.sleep (2)
- print ('Granda drako elsaltas antaŭ vi! Li malfermas siajn makzelojn kaj ...')
- print ()
- time.sleep (2)
Decidi Kiu Kaverno havas la Amikoj Drako
- friendlyCave = random.randint (1, 2)
- se chosenCave == str (friendlyCave):
- presi ('Donas al vi lian trezoron!')
Komparante valorojn de malsamaj datumtipoj kun la == operatoro estos ĉiam taksi al False.
Do ni pasas friendlyCave al la str () funkcio, kiu redonas la kordoj valoro de friendlyCave.
Kion la kondiĉo en ĉi se aserto estas vere kompari estas la ĉenon en chosenCave kaj la kordoj revenis de la str () funkcio. Ni povis esti ankaŭ havis tiun linion anstataŭ:
se int (chosenCave) == friendlyCave:
Tiam la se aserto estas kondiĉo devus kompari la entjera valoro revenis por la int () funkcion por la entjera valoro en friendlyCave. La reveno valoro de la int () funkcio estas la entjera formo de la ŝnuro stokas en chosenCave. Se la se aserto estas kondiĉo taksas al Vera, ni diru la ludanto ili gajnis la trezoron.
- alie:
- presi ('Gobbles vin en unu mordo!')
Memoru meti la dupunkto (la: signon) post la alia ŝlosilvorto.
La Kolumbo:
Vi eble rimarkis, ke ni ĉiam meti dupunkto fine de se, alie, dum, kaj def deklaroj. La dupunkto markas la finon de la frazo, kaj diras al ni ke la sekva linio devus esti la komenco de nova bloko.Kie la Programo Vere Komencas
- playAgain = 'jes'
- dum playAgain == 'jes' aŭ playAgain == 'y':
Nomante la Funkcioj en Nia Programo
- displayIntro ()
- caveNumber = chooseCave ()
- checkCave (caveNumber)
Petante la Ludanto al Ludu Denove
- presi ('Ĉu vi volas ludi denove? (jes aŭ ne)')
- playAgain = input ()
La diferenco estas, nun la valoro de playAgain estas egala al kiom string la ludanto tajpis in Se la ludanto tajpita en la ĉeno 'jes' aŭ 'y', tiam ni devus eniri la ciklo denove ĉe linio 38.
Se la ludanto tajpita en 'neniu' aŭ 'n' aŭ io stulta kiel 'Abraham Lincoln, tiam la dum deklaro de stato estus Falsa, kaj ni iru al la sekvanta linio post la dum-bloko. Sed ĉar ne plu linioj post la dum-bloko, la programo finiĝas.
Sed memoru, la ĉeno 'JES' estas malsama de la ĉeno 'jes'. Se la ludanto tajpita en la ĉeno 'JES', tiam la dum komunikaĵo la kondiĉo devus taksi al False kaj la programo ankoraŭ finiĝi.
Ni ĵus finis nian duan ludon! En nia Drako Reĝlando ludo, ni uzas multan kion ni lernis en la "Divenu la Numero" ludon kaj reprenita kelkajn novajn trukojn tiel. Se vi ne komprenis kelkajn el la konceptoj en tiu programo, do legi la resumon en la fino de ĉi ĉapitro, aŭ transiru ĉiu linio de la fontkodon denove, aŭ provi ŝanĝi la fontkodon kaj vidi kiel la programo ŝanĝas. En la sekvanta ĉapitro ni ne krei ludon, sed lerni kiel uzi esprimilo de sencela nomata erarserĉilo. La debugger helpos nin kompreni tion kion okazas en nia programo kiel estas kurante.
Ni iris tra la fontkodo de supre ĝis malsupre. Se vi ŝatus iri tra la fontkodon en la ordo, ke la ekzekuto fluas, tiam rigardu la linio strekita retejo por ĉi programo en la URL http://inventwithpython.com/traces/dragon.html .
Desegni la Programo
Drako Reĝlando estis suficxe simpla ludo. La aliaj ludoj en ĉi tiu libro estos iom pli komplika. Ĝi kelkfoje helpas noti ĉio vi volas, ke via ludo aŭ programo por fari antaŭ ol vi komencos skribi kodon. Tio nomiĝas "desegni la programo."Ekzemple, povas helpi desegni fluo abako. Fluo abako estas portreto kiu montras ĉiun eblan agadon kiu povas okazi en nia ludo, kaj en kiu ordo. Kutime ni kreus fluo abako antaŭ skribi nia programo, tiel ke ni memoras skribi kodon por ĉiu aĵo kiu okazas en la ludo. Figuro 6-2 estas fluo abako por Drako Reĝlando.
Figuro 6-2: Flow abako por la Drako Reĝlando ludo.
Resumo
In the "Dragon Realm" game, we created our own functions that the main section of the program called. You can think of functions as mini-programs within our program. The code inside the function is run when our program calls that function. By breaking up our code into functions, we can organize our code into smaller and easier to understand sections. We can also run the same code by placing it inside of a function, instead of typing it out each time we want to run that code.The inputs for functions are the arguments we pass when we make a function call. The function call itself evaluates to a value called the return value. The return value is the output of the function.
We also learned about variable scopes. Variables that are created inside of a function exist in the local scope, and variables created outside of all functions exist in the global scope. Code in the global scope can not make use of local variables. If a local variable has the same name as a variable in the global scope, Python considers it to be a separate variable and assigning new values to the local variable will not change the value in the global variable.
Variable scopes might seem complicated, but they are very useful for organizing functions as pieces of code that are separate from the rest of the function. Because each function has it's own local scope, we can be sure that the code in one function will not cause bugs in other functions.
All nontrivial programs use functions because they are so useful, including the rest of the games in this book. By understanding how functions work, we can save ourselves a lot of typing and make our programs easier to read later on.
Iru al Ĉapitro 5 - Ŝercoj |
Nenhum comentário:
Postar um comentário