Enhavolisto

Antaŭa temo

6. Enkonduko al la Pitona lingvo

Sekva temo

8. Funkcioj

7. Regi fluon

7.1. La instrukcio print

La instrukcio print skribas la valoron de la esprimo(j) donita(j). Ĝi malsimilas al la simpla skribado de la esprimo (vidu la kalkulilaj ekzemploj) per la maniero de la traktado de pluraj esprimoj kaj ĉenoj. Ĉenoj estas skribitaj sen limdifinaj citiloj aŭ apostrofoj, kaj unu spaco estas enmetita inter eroj, por ke oni povas agrable formati aĵojn, ekzemple:

>>> i = 256*256
>>> print 'La valoro de i estas', i
La valoro de i estas 65536

Fina komo evitas novlinian signon je la fino de la linio:

>>> a, b = 0, 1
>>> print a,; print b
0 1

7.2. La instrukcio while

Kompreneble, ni povas uzi Pitonon por pli komplika taskoj ol la sumado de du kaj du.

Por ekzemplo, ni povas skribi la komencan sekvencon de la Fibonaĉia serio jene:

>>> # Fibonacci-a serio:
... # la sumo de du eroj difinos la sekvontan
... a, b = 0, 1
>>> while b < 10:
...     print b
...     a, b = b, a+b
...
1
1
2
3
5
8

Ĉi tiu ekzemplo enkondukas kelkajn novajn trajtojn.

  • La iteracio while restas aktiva dum la kondiĉo (b < 10) estas vera. En Pitono, iu ajn ne-nula entjera valoro estas vera; nulo estas malvera. La kondiĉo povas esti ĉeno aŭ lista valoro, fakte iu ajn sekvenco; iu ajn kun ne-nula longeco estas vera, malplena sekvenco estas malvera.

    • La kutimaj komparaj operatoroj estas: < (malpli ol), > (pli ol), == (egala), <= (malpli aŭ egala), >= (pli aŭ egala) kaj != (ne egala).

      Noto

      ĉar <> estas forigita de Pitono 3.x, uzu != por kontroli ne-egalecon (vidu PEP 404)

  • La instrukcioj en la korpo de la iteracio (la kodogrupo) havas pli grandan marĝenon ol la kapa instrukcio. Pitono uzas grandecon de marĝeno por grupi instrukciojn - ĉiu instrukcio en kodogrupo devas havi precize la saman marĝenon.

    • Kiam oni entajpas kodogrupon rekte, oni devas entajpi sekvan vakan linion por indiki, ke la kodogrupo estas kompleta (ĉar la interpretilo ne povas konstati ke oni entajpis la lastan linion).
    • Rimarku, ke la interpretilo enmetas novlinian signon antaŭ ĝi videbligas la venontan inviton se la programo ne jam faris tion.

Noto

Pitonaj kodogrupo baziĝas je marĝeno - la grupo (ekz. iteracia) komeciĝas per dupunkto : kaj etendiĝas ĝis forigo (aŭ malpliiĝo de nivelo) de marĝeno.

7.3. La instrukcio if

Eble la plej konata instrukcio estas la instrukcio if. Same ĉe la instrukcio while, ĉiu instrukcio en kodogrupo devas havi precize la saman marĝenon.

Por ekzemplo:

>>> if a < 0:
...    a = 0
...    print 'Negativaĵo iĝas nulo'
... elif a == 0:
...    print 'Nulo'
... elif a == 1:
...    print 'Unuopa'
... else:
...    print 'Plura'
...
Plura

Povas esti nul aŭ pli partoj elif, kaj la parto else estas laŭbezona. La sekvenco if ... elif ... elif ... estas anstataŭo por la instrukcioj switchcase trovitaj je aliaj lingvoj.

7.4. La instrukcio for

La instrukcio for en Pitono malsamas iomete de tiu al kiu oni alkutimiĝis je aliaj lingvoj. La instrukcio for iteracias unuope laŭ la eroj de iu ajn sekvenco (ekz., listo aŭ ĉeno). Por ekzemplo:

>>> # Mezuru ĉiun ĉenon en listo:
... a = ['kato', 'fenestro', 'elfenestrigi']
>>> for z in a:
...    print z, len(z)
...
kato 4
fenestro 8
elfenestrigi 12

Kiel en la kazoj while kaj for, ĉiu instrukcio en kodogrupo devas havi precize la saman marĝenon.

Ne ŝanĝu sekvencon kiun oni samtempe uzas por iteracii. Se oni bezonas fari tion, faru kopion, kaj uzu kopion por iteracii. La tranĉ-notacio estas speciale konvena por tia:

>>> for p in a[:]: #faru sekcan kopion de la tuta listo
...    if len(p) > 8:
...       a.insert(0, p)
...
>>> a
['elfenestrigi','kato', 'fenestro', 'elfenestrigi']

Noto

TODO:

>>> [p for a if len(p) > 8]

7.5. La funkcio range()

Se oni ja bezonas iteracii laŭ sekvenco de numeroj, la prafunkcio range() estas utila. Ĝi kreis liston kiu enhavas matematikan progreson, ekz.:

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

La finopunkto neniam estas parto de la kreita listo. Oni povas komenci la sekvencon je alia numero, aŭ difini alian pliaĵon (eĉ negativan):

>>> range(5, 10)
[5, 6, 7, 8, 9]
>>> range(0, 10, 3)
[0, 3, 6, 9]
>>> range(-10, -100, -30)
[-10, -40, -70]

Por iteracii laŭ la indicoj de sekvenco, kunmeti funkciojn range() kaj len() jene:

>>> a = ['Maria', 'havas', 'malgrandan', 'ŝafidon']
>>> for i in range(len(a)):
...     print i, a[i]
...
0 Maria
1 havas
2 malgrandan
3 ŝafidon

Noto

Por krei tiajn iteraciojn, rekomendata estas pli facila kaj rapida maniero utiliganta funkcion enumerate() (vidu PEP 279):

>>> for i, e in enumerate(a):
...     print i, e
...
0 Maria
1 havas
2 malgrandan
3 ŝafidon

7.6. La instrukcioj break kaj continue, kaj la frazero else

La instrukcio break ĉesigas la plej internan aktivan iteracion forwhile, kaj saltigas fokuson al la instrukcio post la iteracio.

La instrukcio continue, saltigas fokuson al la fino de la kodogrupo, kaj daŭrigas la iteracion.

Iteracioj povas havi frazeron else: ĝi aktiviĝas kiam la iteracio finas pro ke la sekvenco estas elĉerpita (instrukcio for) aŭ kiam la kondiĉo iĝas malvera (instrukcio while), sed ne se la iteracio finas pro instrukcio break. Oni ekzempligas tion per la jena iteracio, kiu serĉas primajn numerojn:

>>> for n in range(2, 10):
...    for z in range(2, n):
...       if n % z == 0: #vidu termino 'modulo'
...          print n, 'egalas', z, '*', n/z
...          break
...       else:
...          #iteracio finis kaj ne trovis faktoro
...          print n, 'estas prima numero'
...
2 estas prima numero
3 estas prima numero
4 egalas 2 * 2
5 estas prima numero
6 egalas 2 * 3
7 estas prima numero
8 egalas 2 * 4
9 egalas 3 * 3

7.7. La instrukcio pass

La instrukcio pass faras nenion. Oni uzas ĝin kiam instrukcio estas sintakse necesa, sed agado ne estas necesa, ekz:

>>> while True:
...    pass # okupata- atendu klavaran interrompon
...

7.8. Iteraciaj teknikoj

Kiam oni iteracias tra vortaro, oni povas ricevi la parojn (ŝlosilo kaj ĝia valoro) samtempe per la metodo items()

>>> kavaliroj = {'galahado': 'la pura', 'robino': 'la kuraĝa'}
>>> for k, v in kavaliroj.items():
...    print k, v
...
galahado la pura
robino la kuraĝa

Kiam oni iteracias tra sekvenco, oni povas ricevi la pozician indicon kaj la respondan valoron per la metodo enumerate(). Ĉi tiu funkcio kreas pli klaran kodon ol range(len()).

>>> for i, v in enumerate(['nul', 'unu', 'du']):
...    print i, v
...
0 nul
1 unu
2 du

Por iteracii tra du aŭ pli sekvencoj samtempe, oni povas pari la erojn per la funkcio zip().

>>> demandoj = ['nomo', 'serĉo', 'preferata koloro']
>>> respondoj = ['lanceloto', 'la sankta gralo', 'bluo']
>>> for d, r in zip(demandoj, respondoj):
...    print 'Kio estas onia '+d+'?',
...    print 'Estas '+r+'.'
...
Kio estas via nomo? Estas lanceloto.
Kio estas via serĉo? Estas la sankta gralo.
Kio estas via preferata koloro? Estas bluo.