12: Patogios smulkmenos

Šioje pamokoje papasakosime keletą dalykėlių, kurie palengvina programų rašymą.

print parametrai

Kaip žinia, print atspausdina keletą reikšmių, atskirdama tarpais. Jos elgesį galima truputį pakoreguoti, naudojant įvardintus argumentus (keyword arguments). print funkcija "žino", kad gali taip pavadintus argumentus gauti, bet jei negauna, naudoja jų numatytas reikšmes.

  • argumentas sep (sutrumpintas "separator") nurodo, kuo atskirti spausdinamas reikšmes.
  • argumentas  end leidžia pakeisti eilutės-pabaigos("end-of-line") simbolį.

Panagrinėkite keletą pavyzdžių, ir suprasite, kaip naudoti įvardintus (vardinius) argumentus.

Pavyzdys
Pavyzdžiai su sep ir end argumentais. Ir ką gi mums atspausdins?

Įvardinami argumentai turi būti pateikti po įprastinių. Kitu atveju sulauksime klaidos pranešimo. Tarpusavy įvardinti argumentai gali būt išdėstyti bet kokia tvarka.

Programavimo pratimas: Abėcėlės aerobika
Pataisykite programą taip, kad ji atspausdintų abėcėlę vienoje eilutėje.

Funkcijų argumentų numatytos reikšmės

Kaip kątik pasiaiškinome, funkcijose kai kurie argumentai gali turėti numatytas (standartines) reikšmes (default values).  Tai patogu, jei argumentų daug ar daugumoje atvejų tinka numatytieji.

Pavyzdys: numatytos argumentų reikšmės

Kai yra keli argumentai su numatytom reikšmėm, pravers vardiniai argumentai:

Pavyzdys: nurodymas vieno iš numatytų argumentų

Tinkami kintamųjų/funkcijų pavadinimai

  • Pavadinimuose gali būti raidės, skaičiai ir apatiniai brūkšniai (_).
  • Pavadinimas negali prasidėti skaičiumi.
  • Pitone yra skirtumas tarp mažųjų ir didžiųjų raidžių.

Taigi mano_3cias_kintamasis yra tinkamas, o 3ias_kintamasis - netinkamas pavadinimas.

Pavyzdys
Didžiosios ir mažosios raidės.

Mažėjanti seka  for cikle ir kt. perrinkimo variacijos

Prisiminkime, kaip, naudodami for ciklą, galime perrinkti skaičius:

Pavyzdys
A for loop

Tačiau, kartais prireikia apsukti tvarką. Kaip parašyti funkciją, kuri perrinks skaičius mažėjančia tvarka? Tam galima iškviesti range ir su trečiu parametru - žingsniu:

Pavyzdys
Intervalo skaičiai mažėjančia tvarka

Pastebėkime, kad range(0, 5) veikia taip pat kaip range(0, 5, 1):  standartinė žingsnio reikšmė yra 1. Bet kuriuo atveju, būkime atsargūs range(start, stop, step) veikia tol, kol nesiekia stop reikšmės. Daugiau informacijos galite rasti Pitono dokumentacijoje.

Programavimo pratimas: Laimingieji septynetai
Parašykite programą, kuri, naudodama for ciklą su žigsnio reikšme 10, atspausdintų visus dviejų skaitmenų skaičius, kurie baigiasi 7-netų.

Panašiai galime naudoti tekstas[x:y:-1], kad gautme apsuktą teksto fragmentą. Arba, jei zodis="Karlson", tai zodis[x:y:2] duos naują žodį, kuriame teliks kas antra raidė x, x+2, x+4, ... -- gausis "alo".

Mažėjančią eilę su for ciklu galima gauti ir taip: reversed(range(x, y)). Ši formuluotė pradės skaičiavimą nuo y-1 ir baigs ties x.

Kompaktiškas kodas

Python kai kuriuos įprastus veiksmus galima užrašyti trumpiau - tai patogu, kai šie veiksmai dažnai kartojasi arba programuotojas nori greit užrašyti programą.

Puslapyje mes šių triukų dažnai nenaudojame, nes nepratusiems būtų sunkiau suprasti.

Reikšmės pakeitimo veiksmai

Pitonas leidžia rašyti "x += 1", tai reiškia tą patį kaip ir "x = x + 1" -- padidina x vienetu :

Pavyzdys
Pavyzdžiai su +=, -=, *=, /=

Analogiškai veikia ir  dalyba be liekanos (//=), liekana (%=), ir  kėlimas laipsniu (**=).

Sudėtiniai sakiniai vienoje eilutėje (inline blocks)

for, if, else, elif, while, ir def priklausantys veiksmai būna išvadinti naujose eilutėse, pvz:

if x==y:
  «veiksmai» # papildomai atitraukta, daug eilučių
Kai priklausančius veiksmus galima išvardinti vienoje eilutėje, Pitonas leidžia naudoti alternatyvų užrašymą:

if x==y: «veiksmai» # vienoje eilutėje
Šiais atvejais, keli nuoseklūs veiksmai gali būti atskirti kabliataškiais. Pavyzdžiui:

Pavyzdys
Inline block statements

Tačiau tam yra apribojimų,  negali būti naudojami veiksmai su dvitaškiu (if, for ir pan.). Pavyzdžiui, if 2>1: if 4>3: print() yra sintaksės klaida.

Priskyrimas iš kart keliems kintamiesiems (multiple assignment)

Pitonas leidžia sujungti kelis priskyrimus į vieną veiksmą:

Pavyzdys
Multiple assignment

Tai leidžia išpręsti pirmose pamokose matytą uždavinį su reikšmių apkeitimu vienoje eilutėje!

Taip pat galima "išpakuoti" sąrašą, jei kintamųjų yra tiek, kiek sąraše reikšmių, pvz:

Pavyzdys
Sąrašo išpakavimas

Palyginimų "grandinė"

Pitonas leidžia apjungti keletą nuoseklių palyginimų į vieną:

Pavyzdys
Comparison Chaining

Reikšmės parinkimas pagal išvadą

Kai tikrinam sąlygą, ir priklausomai nuo jos norim priskirt reikšmę, reikia užrašyti 2 priskyrimus:

Pavyzdys

Arba reikšmę galima parinkti trumpiau - vienoje eilutėje:

 «viena reikšmė»  if «sąlyga» else «kita reikšmė»

 

Pavyzdys: reikšmės parinkimas pagal išvadą

Sąlygų tikrinimas pagal kintamojo reikšmę

Kartais reikia patikrinti, ar kintamasis turi pradinę reikšmę, ar jau pasikeitus. Pradinė reikšmė skaitliukui dažniausiai būna 0, sąrašui - tuščias sąrašas [], o kartais reikšmė None. Šias reikšmes Python supranta, kaip analogiškais loginiam False. Todėl galima trumpint sąlygų užrašymą:

Pavyzdys: Kintamojo reikšmės įvertinimas be palyginimo veiksmo

Numatytos reikšmės range() komandai ir atkarpos galams [:]

range(n) yra trumpesnis būdas parašyti range(0, n) -- 0 yra numatytoji pradžios reikšmė.

Teksto/sąrašo atkarpos galai irgi turi numatyas reikšmes. Standartinė pradžios reikšmė yra 0, o pabaigos - sąrašo/teksto ilgis. Pvz, pilna atkarpa būtų [:].

Pavyzdys
Numatytosios reikšmės range() ir  [:] 

None

Kai kurių funkcijų pagrindinė paskirtis yra grąžinti reikšmę, pavyzdžiui abs(x). Bet tai neprivaloma, kai kurios funkcijos tieisog kažką pakeičia ar atspausdina, jose nėra return komandos (pvz, print() ). Tuomet standartiškai grąžinama None reikšmė.

Pavyzdys
Ką grąžino print?

None  naudojamas įvairiai - kartais juo pasižymima, kad kintamajam prasminga reikšmė dar nepriskirta. Pabandę  type(None) pamatysime, kad yra specialus duomenų tipas NoneType.

Pavyzdys: Duomenų tipų tipai
Bet kuri reikšmė turi tipą -- netgi pats tipas ;)

Dabar užduotis - atidžiai sekite veiksmų eigą su daug type ir print.

Sumaišytų eilučių užduotis: Daug spausdinimo dėl None
Veiksmas print(type(print(type(type(print(print())))))) atspausdins 4 eilutes. Sudėkite jas teisinga tvarka.
  • <class 'type'>
  • «blank line»
  • None
  • <class 'NoneType'>
Teisingai!