Páginas

domingo, 3 de março de 2013

skribu-kun-python-cxap06


fonto: http://inventwithpython.com/chapter6.html

Temoj Kovritaj en tiu ĉapitro:

  • La time-modulo.
  • La time.sleep() funkcio.
  • La revena ŝlosilvorto.
  • Kreu niajn proprajn funkciojn kun la def-ŝlosilvorto.
  • La and (kaj) kaj or (aŭ), kaj ne buleaj operatoroj.
  • Veraj tabloj
  • Variablo medio (suma kaj loka)
  • Parametroj kaj argumentoj
  • Fluaj lertoj

Enkondukante Funkcioj

Ni jam uzis du funkcioj en nia antaŭaj programoj: input() kaj print(). 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 ludi kun "Draka Realo"

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 Dosiero, poste alklaku Nova Fenestro. 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

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 Helpo kaj poste Pri vana 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
  1. importi hazarda
  2. importado tempo

  3. def displayIntro ():
  4. presi ('Vi estas en lando, plena de drakoj. Antaŭ vi,')
  5. print ('vi vidas du kavernoj. En unu kavernon, la drako estas amika')
  6. print ('kaj dividos sian trezoron kun vi. La aliaj drako')
  7. presi ('estas avidaj kaj malsata, kaj konsumos vin sur okuloj.')
  8. print ()

  9. def chooseCave ():
  10. kaverno =''
  11. dum kaverno! = '1 'kaj kaverno! = '2':
  12. print ('Kiu kaverno vi iros en? (1 aŭ 2)')
  13. kaverno = input ()

  14. revenu kaverno

  15. def checkCave (chosenCave):
  16. print ('Vi alproksimigi la kaverno ...')
  17. time.sleep (2)
  18. print ('Ĝi estas malluma kaj spooky ...')
  19. time.sleep (2)
  20. print ('Granda drako elsaltas antaŭ vi! Li malfermas siajn makzelojn kaj ...')
  21. print ()
  22. time.sleep (2)

  23. friendlyCave = random.randint (1, 2)

  24. se chosenCave == str (friendlyCave):
  25. presi ('Donas al vi lian trezoron!')
  26. alie:
  27. presi ('Gobbles vin en unu mordo!')

  28. playAgain = 'jes'
  29. dum playAgain == 'jes' aŭ playAgain == 'y':

  30. displayIntro ()

  31. caveNumber = chooseCave ()

  32. checkCave (caveNumber)

  33. presi ('Ĉu vi volas ludi denove? (jes aŭ ne)')
  34. playAgain = input ()

Kiel la Kodo Verkoj

Ni rigardu la fontkodon pli detale.
  1. importi hazarda
  2. importado tempo
Ĉi tie ni havas du importado deklaroj. Ni importi la hazarda modulo kiel ni faris en la Divenu la Numero ludo. En Drako Reĝlando, ni ankaŭ volas iom da tempo-rilataj funkcioj ke la tempo modulo inkludas, do ni havos importi ke tiel.

Difinanta la displayIntro () Funkcio

  1. def displayIntro ():
  2. presi ('Vi estas en lando, plena de drakoj. Antaŭ vi,')
  3. print ('vi vidas du kavernoj. En unu kavernon, la drako estas amika')
  4. print ('kaj dividos sian trezoron kun vi. La aliaj drako')
  5. presi ('estas avidaj kaj malsata, kaj konsumos vin sur okuloj.')
  6. print ()

Figuro 6-1: Partoj de def komunikaĵo.
Figuro 6-1 montras nova tipo de frazo, la def komunikaĵo. La def aserto estas formita de la def ŝlosilvorto, sekvita per funkcio nomon kun parentezoj, kaj poste dupunkto (la: signon). Estas bloko post la deklaro nomas def-bloko.

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

  1. def chooseCave ():
Jen ni estas difinanta alia funkcio nomita chooseCave. La kodo en ĉi tiu funkcio estos instigas al la uzanto elekti kio kaverno ili iru enen.
  1. kaverno =''
  2. dum kaverno! = '1 'kaj kaverno! = '2':
Interne de la chooseCave () funkcio, ni kreu novan variablon nomita kaverno kaj stoki malplenan ĉenon en ĝi. Tiam ni komencos momenton buklo. Tiu dum deklaro de stato enhavas novan operatoro ni ne vidis antaŭe nomita kaj. Ĝuste kiel la -* estas matematikaj operatoroj, kaj == aŭ! = Estas komparo operatoroj, la kaj operatoro estas Bulea operatoro.

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ŭ VeraFalsa. 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:
  1. dum kaverno! = '1 'kaj kaverno! = '2':
Ĉi tiu kondiĉo estas havas du esprimojn konektitaj de la kaj Buleaj operatoro. Ni unue pritaksi tiujn esprimojn por ricevi siajn Bulea (tio estas, VeraFalsa) valorojn. Tiam ni taksi la Bulea valoroj kun la kaj operatoro.
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':
Al malsupren sago
dum''! = '1 'kaj kaverno! = '2':
Al malsupren sago
dum Vera kaj kaverno! = '2 ':
Al malsupren sago
dum Vera kaj''! = '2 ':
Al malsupren sago
dum Vera kaj Vera;
Al malsupren sago
dum Vera:

Spertante la kaj kaj 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 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 operatoro taksas al falsa estas se ambaŭ de la Bulea valoroj estas False.
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

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.
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.

Vero Tabeloj

Se vi iam forgesos kiel la Bulea operatoroj funkcias, vi povas rigardi tiujn lertaj, kiuj estas nomataj vero tabuloj:
Tabelo 6-1: La kaj operatoro vertabelo.
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

Tabelo 6-2: La operatoro de vertabelo.
A B estas Tuta frazo
Vera Vera estas Vera
Vera Falsaj estas Vera
Falsaj Vera estas Vera
Falsaj Falsaj estas Falsaj

Tabelo 6-3: La ne operatoro vertabelo.
ne A estas Tuta frazo
ne Vera estas Falsaj
ne Falsaj estas Vera

Havigo de la ludanto Eniro

  1. dum kaverno! = '1 'kaj kaverno! = '2':
  2. print ('Kiu kaverno vi iros en? (1 aŭ 2)')
  3. kaverno = input ()
On line 14 la ludanto estas petis eniri kiu kaverno ili elektis eniri por tajpi en 1 aŭ 2 kaj bati Eniru. Kion ajn ŝnuro la ludanto tajpis estos stokitaj en kaverno. Post ĉi tiu kodo estas ekzekutita, ni saltas reen al la supro de la dum komunikaĵo kaj recheck la kondiĉo. Memoru ke la linio estis:
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

  1. revenu kaverno
Ĉi tiu estas la reveno ŝlosilvorto, kiu aperas nur ene def-blokojn. Memoru, kiamaniere la enigo () funkcio redonas la kordoj valoro ke la ludanto tajpita en? Aŭ kiel la randint () funkcio estos redoni hazarda entjera valoro? Nia funkcio estos ankaŭ redoni valoro. Denove la ŝnuro kiu estas stokitaj en 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:
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:
  1. kaverno =''
... La variablo kaverno estas difinita.
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

  1. def checkCave (chosenCave):
Nun ni estas difinanta alia funkcio nomata checkCave (). Rimarku ke ni metas la tekston chosenCave en inter la krampoj. La variablo nomoj en inter la krampoj nomiĝas parametroj.
Memoru, por iuj funkcioj kiel la str ()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).
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:
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.
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:
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.
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:
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:
def sayGoodBye ():
print ('revido!')

sayGoodBye ()

Montrante La Ludo Rezultoj

Reen al la ludo fontkodon:
  1. print ('Vi alproksimigi la kaverno ...')
  2. time.sleep (2)
Ni montros iun tekston al la ludanto, kaj poste alvoki time.sleep () funkcio. Memoru, kiamaniere en nia alvoko al randint (), la funkcio randint () estas ene de la hazarda modulo? En la Drako Reĝlando ludo, ni ankaŭ importis la tempo modulo. La tempo modulo havas funkcion nomita dormo () ke volo paŭzo la programo dum kelkaj sekundoj. Ni pasos la entjera valoro 2 kiel argumento al la time.sleep () funkcion por diri ĝin al paŭzo por akurate 2 sekundoj.
  1. print ('Ĝi estas malluma kaj spooky ...')
  2. time.sleep (2)
Ĉi tie ni presi tekston kaj atendi denove por alia 2 sekundoj. Ĉi tiuj mallongaj paŭzoj aldoni ĉesigita al la ludo, anstataŭ montri la tutan tekston cxiuj samtempe. En nia ŝercoj programo, ni nomas la enigo () funkcio atendi ĝis la ludanto premis la Eniga klavo. Tie, la ludanto ne devas fari ion ajn krom atendi.
  1. print ('Granda drako elsaltas antaŭ vi! Li malfermas siajn makzelojn kaj ...')
  2. print ()
  3. time.sleep (2)
Kio okazas nun? Kaj kiel la programo decidi kio okazas?

Decidi Kiu Kaverno havas la Amikoj Drako

  1. friendlyCave = random.randint (1, 2)
Nun ni intencas havi la programon hazarde elektis kiu kaverno havis la amika drako en ĝi. Nia alvoko al la random.randint () funkcio estos redoni ĉu la entjero 1 aŭ la entjero 2, kaj stoki tiu valoro en variablo nomis friendlyCave.
  1. se chosenCave == str (friendlyCave):
  2. presi ('Donas al vi lian trezoron!')
Ĉi tie ni kontrolu ĉu la entjero el la kaverno ni elektis ('1 'aŭ '2') estas egala al la kaverno hazarde elektita por havi la amika drako. Sed atendu, la valoro en chosenCave estis ŝnuro (pro enigo () redonas kordoj) kaj la valoro en friendlyCave estas entjero (ĉar random.randint () redonas entjeroj). Ni ne povas kompari kordoj kaj entjeroj kun la == signo, ĉar ili ĉiam estos malsama ('1 'ne egala 1).
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.
  1. alie:
  2. presi ('Gobbles vin en unu mordo!')
Linio 32 havas novan ŝlosilvorton. La alia ŝlosilvorto ĉiam venas post la se-bloko. La alia-bloko kiu sekvas la alian ŝlosilvorto ekzekutas se la kondiĉo en la se aserto estis Falsa. Pensu pri ĝi kiel programo maniero diri: "Se tiu kondiĉo estas vera tiam ekzekuti la se-bloko alie ekzekuti la alian-bloko."
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

  1. playAgain = 'jes'
Tio estas la unua linio kiu ne estas def deklaro aŭ ene def-bloko. Tiu linio estas kie nia programo vere komencas. La antaŭa def deklaroj simple difinis la funkcioj, ne ruli la kodon ene de la funkcioj. Programoj devas ĉiam difini funkciojn antaŭ la funkcio povas esti nomitaj. Tiu estas ĝuste like how variabloj devas esti difinita per asigno deklaron antaŭ la variablo povas esti uzata en la programo.
  1. dum playAgain == 'jes' aŭ playAgain == 'y':
Jen estas la komenco de tempo buklo. Ni eniras la buklo se playAgain estas egala al ĉu 'jes''y'. La unua fojo ni venis al tiu dum deklaro, ni jxus atribuis la kordoj valoro 'jes' al la playAgain variablo. Tio signifas ĉi tiu kondiĉo estos Vera.

Nomante la Funkcioj en Nia Programo

  1. displayIntro ()
Jen ni nomas la displayIntro () funkcio. Ĉi tio ne estas Python funkcio, ĝi estas nia funkcio kiu ni difinis pli frue en nia programo. Kiam ĉi tiu funkcio estas nomita, la programo ekzekuto saltas al la unua linio en la displayIntro () funkcio sur linio 5. Kiam ĉiuj linioj en la funkcio estas farita, la ekzekuto saltas reen sur la linio post ĉi tiu.
  1. caveNumber = chooseCave ()
Ĉi tiu linio ankaŭ nomitaj funkcio kiu ni kreis. Memoru ke la chooseCave () funkcio permesas al la ludanto tipo en la kaverno ili elektas por iri en. Kiam la reveno kaverno linio en tiu funkcio ekzekutas, la programo ekzekuto saltas reen cxi tie, kaj la parametro kaverno estas valoro estas la reveno valoro de tiu funkcio. La reveno valoro estas stokita en nova variablo nomata caveNumber. Tiam la ekzekuto movas al la sekvanta linio.
  1. checkCave (caveNumber)
Ĉi tiu linio vokas nian checkCave () funkcio kun la argumento caveNumber la valoro. Ne nur ekzekuto salti al linio 20, sed la valoro stokita en caveNumber estas kopiita al la parametro chosenCave ene la checkCave () funkcio. Jen la funkcio kiun montros ĉu 'Donas al vi lian trezoron!''Gobbles vin en unu mordo! Depende de la kaverno la ludanto elektis eniri

Petante la Ludanto al Ludu Denove

  1. presi ('Ĉu vi volas ludi denove? (jes aŭ ne)')
  2. playAgain = input ()
Post la ludo estis ludita, la ludanto demandas se ili volus ludi denove. La variablo playAgain tendencas la kordo, ke la uzanto tajpas in Tiam ni atingas la finon de la tempo-blokon, tiel la programo rechecks dume deklaro de kondiĉo: playAgain == 'jes' aŭ playAgain == 'y'
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''y', tiam ni devus eniri la ciklo denove ĉe linio 38.
Se la ludanto tajpita en 'neniu''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.
Por vidi kio okazas en la ludo, metis fingron sur la "Starto" skatolo kaj sekvu unu sagon el la skatolo al alia skatolo. Via fingro estas speco de kiel la programo ekzekuto. Fingron estos paŭsi el vojon el skatolo por skatolo, ĝis fine vian fingron surteriĝas en la "Fino" skatolo. Kiel vi povas vidi, kiam vi atingos la "Kontroli amikoj aŭ malsata drako" skatolo, la programo povus ĉu iri al la "Ludanto gajnas" skatolo aŭ la "Ludanto malvenkas" skatolo. Either way, both paths will end up at the "Ask to play again" box, and from there the program will either end or show the introduction to the player again.

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