Sunteți pe pagina 1din 107

A Byte of Python Introducere

"A Byte of Python" este o carte liberă despre programare folosind limbaj Python. Acesta servește ca
tutorial sau ghid pentru limbajul Python pentru un public începător. Dacă tot ce știți despre
computere este cum să salvați fișiere text, atunci aceasta este cartea pentru dvs.

Pentru Python versiunea 3

Această carte vă va învăța să utilizați versiunea Python 3. De asemenea, veți avea sfaturi pentru a vă
adapta la versiunea mai veche și mai uzuală - Python 2 - din carte.

Cartea este folosită și de NASA! Este utilizată în laboratorul lor de propulsie cu jet de apă cu proiectul


Deep Space Network.

1 Cursuri academice

Această carte este / a fost folosită ca material didactic în diferite instituții de învățământ:

 Principii de curs de limbi de programare la Universitatea VU Amsterdam

 Curs de Concepte de bază de calcul la Universitatea din California, Davis

 Programul "Programare cu Python" de la Universitatea Harvard

 "Introducere în programare" la Universitatea din Leeds

 "Introducere în programarea aplicațiilor" de la Universitatea din Boston

 Curs "Competențe tehnologice informatice pentru meteorologie" de la Universitatea din


Oklahoma

 Curs "Geoprocessing" de la Universitatea de Stat din Michigan

 "Multi Agent Semantic Web Systems" la Universitatea din Edinburgh

 "Introducere în informatică și programare" la MIT OpenCourseWare

 "Programare de bază la Facultatea de Științe Sociale, Universitatea din Ljubljana, Slovenia"


- Aleš Žiberna spune: "Eu și predecesorul meu folosim cartea ca literatură principală pentru
acest curs"

 "Introducere în programare", Departamentul de Științe ale Informației, Universitatea din


Zadar, Croația - Krešimir Zauder spune "Aș vrea să vă informez că A Byte of Python este o
lectură obligatorie la cursul meu"

Licență

Această carte este licențiată sub licență Creative Commons Attribution-ShareAlike 4.0 International .

Asta înseamnă:

 Sunteți liber să copiați, să distribuiți și să transmiteți această carte

 Sunteți liberi să modificați, adică să faceți schimbări în această carte (în special traducerile)

 Sunteți liber să o utilizați în scopuri comerciale

Vă rugăm să rețineți:
A Byte of Python Introducere

 Vă rugăm să nu vindeți copii electronice sau tipărite ale cărții, cu excepția cazului în care ați
menționat în mod clar și vizibil în descrierea că aceste copii nu sunt de la autorul original al
acestei cărți.

 Atribuirea trebuie să apară în descrierea introductivă și în prima pagină a documentului prin


conectarea la https://python.swaroopch.com/ și indicând în mod clar că textul original poate
fi preluat din această locație.

 Toate codurile / scripturile furnizate în această carte sunt licențiate sub licența BSD cu 3
clase, cu excepția cazului în care se specifică altfel.

Citește acum
2
Puteți să o citiți online la adresa https://python.swaroopch.com/

Cumpărați cartea

Un exemplar tipărit al cărții poate fi achiziționat la adresa https://www.swaroopch.com/buybook/


pentru plăcerea dvs. de citire offline și pentru a sprijini dezvoltarea și îmbunătățirea continuă a
acestei cărți.

Descarcă

Accesați https://www.gitbook.com/book/swaroopch/byte-of-python/details pentru următoarele
tipuri de descărcări:

 PDF (pentru citirea pe desktop etc.)

 EPUB (pentru iPhone / iPad, cititoare de cărți electronice etc.)

 Mobi (pentru Kindle)

Accesați https://github.com/swaroopch/byte-of-python pentru conținutul brut (pentru sugerarea


corecțiilor, modificărilor, traducerilor etc.)

Citiți cartea în limba maternă

Dacă sunteți interesat să citiți sau să contribuiți traducerile acestei cărți la alte limbi umane, vă rugăm
să consultați Traduceri .
A Byte of Python Prefață

Prefață

Python este probabil unul dintre puținele limbaje de programare care este atât simplu, cât și
puternic. Acest lucru este bun atât pentru începători, cât și pentru experți și, mai important, este
distractiv de programat. Această carte are scopul de a vă ajuta să învățați acest limbaj minunat și să
arătați cum să faceți lucrurile rapid și fără durere - în practică, "Anti-veninul la problemele de
programare".

Ce este această carte

Această carte servește drept ghid sau tutorial pentru limbajul de programare Python. Se adresează în
principal începătorilor. Este util și pentru programatori cu experiență.
3
Scopul este că, dacă tot ce știi despre computere este cum să salvezi fișiere text, atunci poți învăța
Python din această carte. Dacă aveți experiență de programare anterioară, atunci puteți învăța de
asemenea Python din această carte.

Dacă aveți experiență de programare anterioară, veți fi interesați de diferențele dintre Python și
limbajul dvs. de programare preferat - am evidențiat multe astfel de diferențe. Un pic de avertizare,
totuși, Python va deveni în curând limbajul dvs. de programare preferat!

Site oficial

Site-ul oficial al cărții este https://python.swaroopch.com/ unde puteți citi întreaga carte online,


descărcați cele mai recente versiuni ale cărții, cumpărați o copie tipărită și trimiteți-mi și feedback.

Ceva la care sa te gândești

Există două moduri de a construi un design de software: o modalitate este de a face atât de simplu că
evident nu există deficiențe; celălalt trebuie să facă atât de complicat că nu există deficiențe
evidente. - CAR Hoare

Succesul în viață este o chestiune nu atât de talentată și de oportunitate, de concentrare și de


perseverență. - CW Wendte
A Byte of Python Despre Python

Despre Python

Python este unul dintre limbajele rare care se pot pretinde a fi atât simple, cât și puternice . Veți găsi
plăcut surprins să vedeți cât de ușor este să vă concentrați asupra soluției la problemă decât asupra
sintaxei și structurii limbii în care programați.

Introducerea oficiala la Python este:

Python este un limbaj de programare ușor de învățat. Are o structură eficientă de date la nivel înalt și
o abordare simplă, dar eficientă, a programării orientate pe obiecte. Sintaxa elegantă și tastarea
dinamică a lui Python, împreună cu natura interpretată, îl fac un limbaj ideal pentru scrierea și
dezvoltarea rapidă a aplicațiilor în multe zone pe majoritatea platformelor.
4
Voi discuta majoritatea acestor caracteristici în detaliu în secțiunea următoare.

Povestea din spatele numelui

Guido van Rossum, creatorul limbajului Python, a numit limbajul după emisiunea BBC "Monty
Python's Circus Flying". Nu-i plac foarte mult șerpii care ucid animalele pentru mâncare prin
înfășurarea trupurilor lor lungi în jurul lor și zdrobirea lor.

Caracteristici ale Python

Simplu

Python este un limbaj simplu și minimalist. Citirea unui bun program Python se simte aproape ca și
citirea limbii engleze, deși este foarte strictă în limba engleză! Această natură pseudo-cod a lui
Python este una dintre cele mai mari forțe ale sale. Vă permite să vă concentrați mai degrabă pe
soluția problemei decât pe limba în sine.

Ușor de învățat

După cum veți vedea, cu Python este extrem de ușor să începeți. Python are o sintaxă extraordinar
de simplă, așa cum am menționat deja.

Gratuit și Open Source

Python este un exemplu de FLOSS (Free / Libré și Open Source Software). În termeni simpli, puteți să
distribuiți gratuit copii ale acestui software, să citiți codul sursă, să efectuați modificări și să folosiți
bucăți din acesta în noile programe gratuite. FLOSS se bazează pe conceptul unei comunități care
împărtășește cunoștințele. Acesta este unul dintre motivele pentru care Python este atât de bun - a
fost creat și este îmbunătățit în mod constant de o comunitate care vrea doar să vadă un Python mai
bun.

Limbă de nivel înalt

Când scrieți programe în Python, nu trebuie niciodată să vă deranjezi detaliile de nivel scăzut, cum ar
fi gestionarea memoriei utilizate de programul dvs. etc.

Portabil

Datorită naturii sale sursă deschisă, Python a fost portat (adică schimbat pentru a face lucrul pe
multe platforme). Toate programele dvs. Python pot funcționa pe oricare dintre aceste platforme
fără a necesita modificări, dacă sunteți suficient de atent pentru a evita orice caracteristici
dependente de sistem.
A Byte of Python Despre Python

Puteți folosi Python pe GNU / Linux, Windows, FreeBSD, Macintosh, Solaris, OS / 2, Amiga, AROS,
AS / 400, BeOS, OS / 390, z / OS, Palm OS, QNX, VMS, Psion, Acorn RISC OS, VxWorks, PlayStation,
Sharp Zaurus, Windows CE și PocketPC!

Puteți chiar utiliza o platformă ca Kivy pentru a crea jocuri pentru computer și pentru iPhone, iPad și
Android.

Interpretat

Acest lucru necesită un pic de explicație.

Un program scris într-un limbaj compilat, cum ar fi C sau C ++, este convertit din limbajul sursă, adică
5 C sau C ++, într-o limbă vorbită de calculator (cod binar ex: 0 și 1) folosind un compilator cu diferite
steaguri și opțiuni. Când rulați programul, software-ul linker / loader copiază programul din hard disk
în memorie și începe să îl ruleze.

Python, pe de altă parte, nu are nevoie de compilare la binar. Tocmai rulați programul direct din


codul sursă. Pe plan intern, Python convertește codul sursă într-o formă intermediară numită
bytecodes și apoi traduce acest lucru în limba maternă a computerului și apoi o execută.  Toate
acestea, de fapt, fac utilizarea lui Python mult mai ușoară, deoarece nu trebuie să vă faceți griji cu
privire la compilarea programului, asigurându-vă că bibliotecile corespunzătoare sunt legate și
încărcate etc. De asemenea, programele dvs. Python sunt mult mai portabile, copiați programul
Python pe alt computer și funcționează!

Obiect orientat

Python susține programarea orientată spre procedură, precum și programarea orientată pe


obiecte. În limbile orientate spre proceduri , programul este construit în jurul unor proceduri sau
funcții care nu sunt decât piese de program reutilizabile. În limbile orientate pe obiecte , programul
este construit în jurul obiectelor care combină date și funcționalități. Python are o modalitate foarte
puternică, dar simplistă de a face OOP, mai ales atunci când este comparată cu limbaje mari precum
C ++ sau Java.

Extensibil

Dacă aveți nevoie de o piesă critică de cod pentru a rula foarte repede sau doriți să nu aveți o bucată
de algoritm care să nu fie deschisă, puteți codifica acea parte a programului în C sau C ++ și apoi să o
utilizați din programul dvs. Python.

încorporabil

Puteți încorpora Python în programele dvs. C / C ++ pentru a oferi capabilități de scripting pentru


utilizatorii programului dvs.

Biblioteci extinse

Biblioteca standard Python este într-adevăr imensă. Acesta vă poate ajuta să faceți diverse lucruri
care implică expresii regulate, generarea de documente, testarea unităților, filetarea, baze de date,
browsere web, CGI, FTP, email, XML, XML-RPC, HTML, WAV, criptografie, și alte chestii dependente
de sistem. Rețineți că toate acestea sunt întotdeauna disponibile oriunde este instalat
Python. Aceasta se numește Filosofia bateriilor incluse în Python.

Pe lângă biblioteca standard, există și alte biblioteci de înaltă calitate pe care le puteți găsi la  Indexul
pachetelor Python .
A Byte of Python Despre Python

Rezumat

Python este într-adevăr un limbaj interesant și puternic. Are combinația potrivită de performanță și


caracteristici care fac programele de scriere în Python atât distractive cât și ușor.

Python 3 versus 2

Puteți ignora această secțiune dacă nu sunteți interesat de diferența dintre "Python versiunea 2" și
"Python versiunea 3". Dar vă rugăm să fiți conștienți de versiunea pe care o utilizați. Această carte
este scrisă pentru Python versiunea 3.

Amintiți-vă că odată ce ați înțeles corect și ați învățat să utilizați o singură versiune, puteți învăța cu
6 ușurință diferențele și utilizați cealaltă. Partea grea este de a învăța programarea și de a înțelege
elementele de bază ale limbajului Python. Acesta este scopul nostru în această carte și odată ce ați
atins acest obiectiv, puteți utiliza cu ușurință Python 2 sau Python 3 în funcție de situația dvs.

Pentru detalii despre diferențele dintre Python 2 și Python 3, consultați:

 Viitorul Python 2

 Portarea Python 2 a codului Python 3

 Cod de scriere care rulează sub ambele Python 2 și 3

 Sprijinirea Python 3: Un ghid aprofundat

Ce spun programatorii

S-ar putea să fie interesant să citiți ce hackeri mari ca ESR au de spus despre Python:

 Eric S. Raymond este autorul "Catedralei și Bazarului" și este, de asemenea, persoana care a


inventat termenul Open Source . El spune că Python a devenit limbajul sau de programare
preferat . Acest articol a fost adevărata inspirație pentru prima mea atingere cu Python.

 Bruce Eckel este autorul faimoaselor cărți "Gândire în Java" și "Gândire în C". El spune că nici
un limbaj nu l-a făcut mai productiv decât Python. El spune că Python este poate singurul
limbaj care se concentrează pe a face lucrurile mai ușor pentru programator. Citiți interviul
complet pentru mai multe detalii.

 Peter Norvig este un bine cunoscut autor Lisp și director al calității căutării la Google
(mulțumită lui Guido van Rossum pentru că a subliniat acest lucru). El spune că scrierea lui
Python este ca scrierea în pseudocod . El spune că Python a fost întotdeauna o parte
integrantă a Google. De fapt, puteți verifica această afirmație vizionând pagina de Lucrări
Google care afișează cunoștințele Python ca cerință pentru inginerii software.
A Byte of Python Instalare

Instalare

Când ne referim la "Python 3" din această carte, vom vorbi despre orice versiune Python egală sau
mai mare decât versiunea Python 3.6.0 .

Instalare pe Windows

Vizitați https://www.python.org/downloads/ și descărcați cea mai recentă versiune. La momentul


acestei scrieri, a fost Python 3.5.1. Instalarea este la fel ca orice alt software bazat pe Windows.

Rețineți că, dacă versiunea dvs. Windows este pre-Vista, trebuie să descărcați Python 3.4 doar ca
versiunile ulterioare necesită versiuni mai noi ale Windows.
7
ATENȚIE: Asigurați-vă că ați bifat opțiunea Add Python 3.5 to PATH.

Pentru a schimba locația de instalare, faceți clic pe Customize installation, apoi pe Next și
introduceți C:\python35(sau o altă locație adecvată) ca locație de instalare.

Dacă nu ați verificat opțiunea Add Python 3.5 PATH mai devreme, verificați Add Python to
environment variables. Acest lucru se întâmplă la fel ca Add Python 3.5 to PATH pe primul ecran de
instalare.

Puteți alege să instalați Launcher pentru toți utilizatorii sau nu, nu contează prea mult. Lansatorul
este folosit pentru a comuta între diferite versiuni de Python instalate.

Dacă calea dvs. nu a fost setată corect (prin bifarea opțiunilor Add Python 3.5 Path sau Add Python to
environment variables), urmați pașii din secțiunea următoare (DOS Prompt) pentru a o remedia.  În
caz contrar, mergeți la secțiunea din acest document Running Python prompt on Windows.

NOTĂ: Pentru persoanele care știu deja programare, dacă sunteți familiarizat cu Docker,
verificați Python în Docker și Docker pe Windows .

DOS Prompt

Dacă doriți să puteți utiliza Python din linia de comandă Windows, adică promptul DOS, trebuie să
setați corespunzător variabila PATH.

Pentru Windows 2000, XP, 2003, faceți clic pe Control Panel-> System-> Advanced-> Environment


Variables. Faceți clic pe variabila numită PATH în secțiunea Variabile sistem , apoi selectați Edit și
adăugați: C:\Python35 (verificați dacă acest director există, va fi diferit pentru versiunile mai noi ale
Python) până la sfârșitul a ceea ce există deja. Desigur, utilizați numele directorului corespunzător.

Pentru versiunile mai vechi de Windows, deschideți fișierul C:\AUTOEXEC.BAT și adăugați linia PATH=


%PATH% C:\Python35 și reporniți sistemul. Pentru Windows NT, utilizați fișierul AUTOEXEC.NT.

Pentru Windows Vista:

 Faceți clic pe Start și alegeți Control Panel

 Faceți clic pe System (Sistem), în partea dreaptă veți vedea "Vizualizarea informațiilor de
bază despre computer"

 În stânga este o listă de sarcini, dintre care ultima este Advanced System settings. Faceți clic
pe acesta.
A Byte of Python Instalare

 Advanced Tab System Properties este afișat caseta de dialog. Faceți clic pe butonul din
dreapta jos Environment Variables.

 În caseta inferioară numită System Variables derulați în jos până la Cale și faceți clic pe
butonul Edit.

 Schimbă-ți calea așa cum trebuie.

 Reporniți sistemul. Vista nu a preluat modificarea variabilei de mediu pentru calea de sistem


până când am repornit.

Pentru Windows 7 și 8:
8
 Faceți clic dreapta pe Computer de pe desktop și selectați Properties sau dați clic Start și
alegeți Control Panel-> System and Security-> System. Faceți clic pe Advanced System
settings în partea stângă și apoi faceți clic pe fila Advanced. În partea de jos faceți clic
pe Environment Variables și sub System variables, căutați CALEA variabila, selectați și apoi
apăsați Edit.

 Mergeți la sfârșitul liniei sub valoarea variabilă și adăugați C:\Python35 (verificați dacă există
acest dosar, acesta va fi diferit pentru versiunile mai noi ale Python) până la sfârșitul a ceea
ce există deja. Desigur, utilizați numele dosarului corespunzător.

 Dacă valoarea ar fi %SystemRoot%\system32; Asta va deveni acum %SystemRoot


%\system32; C:\Python36

 Dați clic OK și ați terminat. Nu este necesară repornirea, însă este posibil să fiți nevoit să
închideți și să redeschideți linia de comandă.

Pentru Windows 10:

Windows Start Menu> Settings> About> System Info (aceasta este tot drumul pe la


dreapta)> Advanced System Settings> Environment Variables (acest lucru este spre partea de jos)>
(apoi evidențiați CALEA variabilă și faceți clic Edit)> New> (tip, indiferent de locația dvs. piton este.
De exemplu, C:\Python35\)

Rularea prompter Python pe Windows

Pentru utilizatorii Windows, puteți rula interpretul în linia de comandă dacă ați setat CALEA
corespunzător variabila .

Pentru a deschide terminalul în Windows, faceți clic pe butonul de pornire și faceți clic pe  Run. În
caseta de dialog, tastați cmd și apăsați [enter].

Apoi, tastați Python și asigurați-vă că nu există erori.

Puteți vedea versiunea Python pe ecran rulând:

$ python3 -V

Python 3.6.0

NOTĂ: $ este solicitarea Shell. Acesta va fi diferit pentru dvs., în funcție de setările sistemului de
operare de pe computer, prin urmare, voi indica promptul doar prin simbolul $.
A Byte of Python Instalare

ATENȚIE: Ieșirea poate fi diferită pe computer, în funcție de versiunea software-ului Python instalat
pe computer. Rezumat De acum înainte, vom presupune că aveți instalat Python pe sistemul dvs.
Apoi, vom scrie primul nostru program Python.

9
A Byte of Python Primii pași

Primii pași
Vom vedea acum cum să rulați un program tradițional "Hello World" în Python.  Acest lucru vă va
învăța cum să scrieți, să salvați și să rulați programele Python.

Există două modalități de utilizare a programului Python pentru a rula programul - utilizând
promptul interpretului interactiv sau utilizând un fișier sursă. Vom vedea acum cum să folosim
ambele metode.

10 Utilizând Promptul Interpretului


Deschideți terminalul din sistemul dvs. de operare (după cum sa discutat anterior
în capitolul Instalare ) și apoi deschideți promptul Python introducând python3 și
apăsând [enter].
Odată ce ați început Python, ar trebui să vedeți de >>>unde puteți începe să scrieți
lucruri. Aceasta se numește promptul interpretului Python .
La promptul interpretului Python, tastați:
print("Hello World")

urmată de [enter]. Ar trebui să vedeți cuvintele Hello World imprimate pe ecran.


Iată un exemplu despre ce ar trebui să vedeți atunci când utilizați un computer Mac OS
X. Detaliile despre software-ul Python vor diferi în funcție de computerul dvs., dar partea
de la prompt (de la >>>începutul anului) ar trebui să fie aceeași, indiferent de sistemul de
operare.

$ python3
Python 3.6.0 (default, Jan 12 2017, 11:26:36)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello World")
Hello World

Observați că Python vă oferă datele de ieșire imediat! Ce ați introdus este o


singură declarație Python . Folosim print(pentru a nu surprinde) orice tip de valoare pe
care o furnizați. Aici, furnizăm textul Hello World și acesta este imprimat cu promptitudine
pe ecran.

Cum să renunțați la solicitarea interpretului


Dacă utilizați linia de comandă pentru Windows, apăsați [ctrl + z]urmat de [enter].
A Byte of Python Primii pași

Alegerea unui editor


Nu putem introduce programul nostru la promptul interpretului de fiecare dată când
dorim să executăm ceva, așa că trebuie să salvăm comenzile în fișiere și să putem rula
programele noastre de câte ori dorim.

Pentru a crea fișierele sursă Python, avem nevoie de un editor în care să-l puteți scrie și
salva. Un editor de programator bun vă va face viața mai ușoară în scrierea fișierelor
sursă. Prin urmare, alegerea unui editor este crucială. Trebuie să alegeți un editor așa cum
ați alege o mașină pe care ați cumpăra-o. Un editor bun vă va ajuta să scrieți ușor
11 programele Python, făcând călătoria dvs. mai confortabilă și vă ajută să ajungeți la
destinație (atingeți obiectivul) într-un mod mult mai rapid și mai sigur.

Una dintre cerințele de bază este sintaxa, evidențiind unde toate părțile diferite ale
programului dvs. Python sunt colorate, astfel încât să puteți  vedea programul dvs. și să
vizualizați funcționarea acestuia.

Dacă nu aveți idee de unde să începeți, aș recomanda utilizarea programului PyCharm


Educational Edition disponibil pe Windows, Mac OS X și GNU / Linux. Detalii în secțiunea
următoare.

Dacă utilizați Windows, nu utilizați Notepad - este o alegere greșită, deoarece nu face
evidențierea sintaxei și, de asemenea, nu este importantă faptul că nu acceptă indentarea
textului, care este foarte importantă în cazul nostru așa cum vom vedea mai
târziu. Editorii buni vor face automat acest lucru.

Dacă sunteți un programator experimentat, atunci trebuie să utilizați


deja Vim sau Emacs . Inutil să spun că acestea sunt doi dintre cei mai puternici editori și
veți beneficia de utilizarea acestora pentru a vă scrie programele Python.  Eu personal
folosesc ambele pentru majoritatea programelor mele și chiar am scris o  carte întreagă
despre Vim .

În cazul în care sunteți dispus să faceți timp pentru a învăța Vim sau Emacs, atunci vă
recomand să învățați să le folosiți pe oricare dintre ele, deoarece va fi foarte util pentru
dvs. pe termen lung. Cu toate acestea, așa cum am menționat mai devreme, începătorii
pot începe cu PyCharm și se concentrează mai degrabă pe Python decât pe editor în acest
moment.

Pentru a reitera, vă rugăm să alegeți un editor adecvat - acesta poate face programele de
scriere Python mai distractive și mai ușor.

PyCharm
PyCharm Educational Edition  este un editor gratuit pe care îl puteți folosi pentru scrierea
programelor Python.

Când deschideți PyCharm, veți vedea acest lucru, faceți clic pe Create New Project :
A Byte of Python Primii pași

12

Selectați Pure Python:

Treceți untitled la locația proiectului helloworld, ar trebui să vedeți detalii similare cu


acestea:
A Byte of Python Primii pași

13

Faceți clic pe butonul Create.


Faceți clic dreapta pe helloworld, bara laterală și selectați New-> Python File:

Vi se va cere să introduceți numele, tastați hello:


A Byte of Python Primii pași

14

Acum puteți vedea un fișier deschis pentru dvs.:

Ștergeți liniile care sunt deja prezente și tastați acum următoarele:


print("hello world")
A Byte of Python Primii pași

Acum faceți clic dreapta pe ceea ce ați tastat (fără a selecta textul) și faceți clic pe  Run
'hello'.

15

A
r trebui să vedeți acum rezultatul (ce se imprimă) al programului dvs.:

Pfui! Acestea au fost câțiva pași pentru a începe, dar de acum încolo, de fiecare dată când
vă cerem să creați un fișier nou, amintiți-vă doar să faceți clic dreapta  pe helloworld pe
stânga -> New-> Python File și să continuați aceiași pași pentru a tasta și a rula după cum
este arătat mai sus .
A Byte of Python Primii pași

Puteți găsi mai multe informații despre PyCharm în pagina de pornire rapidă PyCharm  .

Vim
1. Instalați Vim
o Utilizatorii Mac OS X ar trebui să instaleze macvim pachetul prin HomeBrew
o Utilizatorii de Windows ar trebui să descarce "executabilul de auto-
instalare" de pe site-ul Vim
o Utilizatorii GNU / Linux ar trebui să obțină Vim din depozitele de software
16 ale distribuției, de exemplu utilizatorii Debian și Ubuntu pot instala pachetul vim.
2. Instalați pluginul jedi-vim pentru completarea automată.
3. Instalați jedi python corespunzător :pip install -U jedi

Emacs
1. Instalați Emacs 24+ .
o Utilizatorii Mac OS X ar trebui să primească Emacs de
la http://emacsformacosx.com
o Utilizatorii Windows ar trebui să primească Emacs de
la http://ftp.gnu.org/gnu/emacs/windows/
o Utilizatorii GNU / Linux ar trebui să primească Emacs din depozitele
software ale distribuției lor, de exemplu utilizatorii Debian și Ubuntu pot
instala emacs24pachetul.
2. Instalați ELPY

Utilizarea unui fișier sursă


Acum să revenim la programare. Există o tradiție că, de fiecare dată când învățați un nou
limbaj de programare, primul program pe care îl scrieți și rulați este programul "Hello
World" - tot ce trebuie să faceți este doar să spuneți "Hello World" când îl rulați.  Așa
cum spune Simon Cozens 1 , "incantația tradițională a zeilor programatori este de a vă
ajuta să învățați limbajul mai bine".

Porniți editor ales de dvs., introduceți următorul program și salvați - l ca hello.py.
Dacă utilizați PyCharm, am discutat deja cum să rulați dintr-un fișier sursă  .

Pentru alți editori, deschideți un fișier nou hello.py și tastați-l pe acesta:


print("hello world")

Unde ar trebui să salvați dosarul? În orice dosar pentru care cunoașteți locația
dosarului. Dacă nu înțelegeți ce înseamnă asta, creați un folder nou și utilizați acea locație
pentru a salva și a rula toate programele dvs. Python:

 /tmp/py pe Mac OS X
 /tmp/py pe GNU / Linux
1
autorul uimitoarei cărți "Perl pentru începători"
A Byte of Python Primii pași

 C:\py pe Windows
Pentru a crea dosarul de mai sus (pentru sistemul de operare pe care îl utilizați),
utilizați mkdir, de exemplu, comanda din terminal mkdir /tmp/py.
IMPORTANT: Asigurați-vă întotdeauna că îi dați extensia fișierului .py, de exemplu foo.py.
Pentru a rula programul Python:

1. Deschideți o fereastră terminală (consultați capitolul precedent privind instalarea )


2. Change director la locul în care ați salvat fișierul, de exemplu, cd /tmp/py
3. Rulați programul introducând comanda python hello.py. Ieșirea este așa cum este
arătat mai jos.
17
$ python hello.py
hello world

Dacă ați obținut rezultatul de mai sus, felicitări! - ați executat cu succes primul program
Python. Ați trecut cu succes cea mai grea parte din programele de învățare, adică
începerea primului program!

În cazul în care a apărut o eroare, tastați programul de mai sus  exact așa cum este arătat
mai sus și executați din nou programul. Rețineți că Python este sensibil la minuscule,
adică print nu este același cu Print - notați literele mici p din prima și majusculă P din cea de-
a doua. De asemenea, asigurați-vă că nu există spații sau file înainte de primul caracter
din fiecare rând - vom vedea de ce acest lucru este important  mai târziu.

Cum funcționează
A Byte of Python Primii pași

Un program Python este compus din declarații . În primul nostru program, avem o singură
declarație. În această declarație, numim print declarația la care furnizăm textul "salut
lume".

Obținerea de ajutor
Dacă aveți nevoie de informații rapide despre orice funcție sau instrucțiune din Python,
puteți utiliza funcționalitatea încorporată help. Acest lucru este foarte util, mai ales atunci
când folosiți promptul interpretului. De exemplu, executați help ('len') - aceasta afișează
ajutorul pentru len - funcția care este utilizată pentru a număra numărul de elemente.
18 SFAT: Apăsați q pentru a ieși din ajutor.
În mod similar, puteți obține informații despre aproape orice în Python.  Utilizați help()
pentru a afla mai multe despre utilizarea comenzii help!
În cazul în care trebuie să obțineți ajutor pentru operatori  return, atunci trebuie să puneți
acele citate în interiorul lor, help('return') astfel încât Python să nu se confunde cu ceea ce
încercăm să facem.

rezumat
Acum ar trebui să puteți scrie, salva și executa programe Python în largul tău.

Acum că sunteți utilizator Python, să învățăm mai multe concepte Python.


A Byte of Python Elementele de bază

Elementele de bază
Doar imprimarea hello world nu este de ajuns, nu-i așa? Vrei să faci mai mult de atât - vrei
să introduci date, să le manipulezi și să scoți ceva din ele. Putem realiza acest lucru în
Python folosind constante și variabile și vom învăța și alte concepte în acest capitol.

Comentarii
19 Comentariile reprezintă orice text în partea dreaptă a simbolului # și sunt în principal utile
ca note pentru cititorul programului.
De exemplu:
print('hello world') # Note that print is a function

sau:
# Note that print is a function
print('hello world')

Utilizați cât mai multe comentarii utile în programul dvs. pentru:

 explicați ipotezele
 explică deciziile importante
 explicați detalii importante
 explicați problemele pe care încercați să le rezolvați
 explicați problemele pe care încercați să le depășiți în programul dvs. etc.

Codul vă spune cum, comentariile ar trebui să vă spun de ce .

Acest lucru este util pentru cititorii programului dvs., astfel încât să poată înțelege cu
ușurință ce anume face programul. Amintiți-vă, acea persoană poți fi chiar tu peste șase
luni!

Constante literare
Un exemplu de o constantă literală este un număr similar 5, 1.23 sau un șir de caractere
similar 'This is a string' sau "It's a string!".
Se numește literal, deoarece este literal - folosiți literalmente valoarea sa. Numărul 2
reprezintă întotdeauna însăși și nimic altceva - este o  constantă deoarece valoarea sa nu
poate fi schimbată. Prin urmare, toate acestea sunt denumite constante literale.

Numere
Numerele sunt în principal de două tipuri - întregi și zecimale.
A Byte of Python Elementele de bază

Un exemplu de număr întreg 2 este doar un număr întreg.


Exemple de numere cu puncte variabile (sau zecimale pe scurt) sunt 3.23 și 52.3E-4. E
Notația indică puteri de 10. În acest caz, 52.3E-4înseamnă 52.3 * 10^-4^.
Notă pentru programatorii experimentați

Nu există un long tip separat . Tipul int poate fi un număr întreg de orice dimensiune.

Șiruri de caractere
Un șir este o secvență de caractere .Șirurile sunt de fapt doar o grămadă de cuvinte.
20
Veți folosi șiruri de caractere în aproape fiecare program Python pe care îl scrieți, deci
acordați atenție următoarei părți.

Apostrofe
Aveți posibilitatea să specificați șiruri de caractere utilizând apostrofe, cum ar fi  'Quote me
on this'.
Toate spațiile albe, adică spațiile și filele din cadrul citatelor, sunt păstrate așa cum este.

Ghilimele
Șirurile de caractere intre ghilimele funcționează exact la fel ca șirurile în apostrofe.  Un
exemplu este "What's your name?" .

Ghilimele triple
Puteți specifica șiruri multi-linie utilizând apostrof triplu sau ghilimele triple -
( """sau '''). Puteți utiliza în mod gratuit ghilimele simple și ghilimele duble în cadrul
ghilimelelor triple. Un exemplu este:

'''This is a multi-line string. This is the first line.


This is the second line.
"What's your name?," I asked.
He said "Bond, James Bond."
'''

Șirurile de caractere sunt imuabile


Aceasta înseamnă că odată ce ați creat un șir, nu îl puteți modifica.  Deși acest lucru poate
părea un lucru rău, într-adevăr nu este. Vom vedea de ce aceasta nu este o limitare în
diferitele programe pe care le vedem mai târziu.

Notă pentru programatorii C / C ++


A Byte of Python Elementele de bază

Nu există niciun  tip de date char separat în Python. Nu există o nevoie reală și sunt sigur
că nu o veți pierde.
Notă pentru programatorii Perl / PHP

Amintiți-vă că șirurile cu un intre apostrofe și între ghilimele duble sunt aceleași - nu


diferă deloc.

Metoda de formatare
Uneori este posibil să dorim să construim șiruri din alte informații.  Aici este utilă metoda
21 format().
Salvați următoarele rânduri ca fișier str_format.py:

age = 20
name = 'Swaroop'
print('{0} was {1} years old when he wrote this book'.format(name, age))
print('Why is {0} playing with that python?'.format(name))

ieșire:
$ python str_format.py
Swaroop was 20 years old when he wrote this book
Why is Swaroop playing with that python?

Cum funcționează

Un șir poate folosi anumite specificații și ulterior, metoda  format poate fi apelată pentru a
înlocui aceste specificații cu argumentele corespunzătoare metodei format.
Observați prima utilizare pe care o folosim {0} și aceasta corespunde variabilei name care
este primul argument al metodei formatelor. În mod similar, a doua specificație {1}
corespunde cu age care este al doilea argument al metodei formatelor. Rețineți că Python
începe să numere de la 0, ceea ce înseamnă că prima poziție este la indexul 0, a doua
poziție este la indexul 1 și așa mai departe.
Observați că am fi putut obține același lucru folosind concatenarea șirului:
name + ' is ' + str(age) + ' years old'

dar este mult mai urât și predispus la erori. În al doilea rând, conversia în șir va fi
efectuată automat de metoda format, în loc de conversia explicită în șiruri de caractere
necesare în acest caz. În al treilea rând, atunci când folosim această metodă format, putem
schimba mesajul fără să avem de-a face cu variabilele folosite și invers.
De asemenea, rețineți că numerele sunt opționale, astfel încât ați putea fi, de asemenea,
scrise ca:
age = 20
name = 'Swaroop'
A Byte of Python Elementele de bază

print('{} was {} years old when he wrote this book'.format(name, age))


print('Why is {} playing with that python?'.format(name))

care va oferi aceeași ieșire exactă ca și programul anterior.

Ceea ce face metoda Python în format este că înlocuiește fiecare valoare a argumentului în
locul specificației. Pot exista specificații mai detaliate, cum ar fi:

# decimal (.) precision of 3 for float '0.333'

22 print('{0:.3f}'.format(1.0/3))
# fill with underscores (_) with the text centered
# (^) to 11 width '___hello___'
print('{0:_^11}'.format('hello'))
# keyword-based 'Swaroop wrote A Byte of Python'
print('{name} wrote {book}'.format(name='Swaroop', book='A Byte of Python'))

ieșire:
0.333
___hello___
Swaroop wrote A Byte of Python

Din moment ce discutăm despre formatare, rețineți că print întotdeauna se termină cu un


caracter invizibil "de linie nouă" ( \n), astfel încât apelurile repetate să print fie imprimate
pe fiecare linie separată. Pentru a împiedica imprimarea acestui caracter de linie nouă,
puteți specifica că acesta ar trebui să fie gol end:
print('a', end='')
print('b', end='')

Rezultatul este:
ab
Sau puteți end cu un spațiu:
print('a', end=' ')
print('b', end=' ')
print('c')

Rezultatul este:
abc

Secvențe de ieșire
Să presupunem că doriți să aveți un șir care conține o singură citare ( '), cum veți specifica
acest șir? De exemplu, șirul este "What's your name?" . Nu puteți specifica 'What's your name?'
deoarece Python va fi confuz în ceea ce privește locul în care șirul începe și se
A Byte of Python Elementele de bază

termină. Deci, va trebui să precizați că această cotă unică nu indică sfârșitul șirului.  Acest
lucru se poate face cu ajutorul a ceea ce se numește secvență de ieșire . Specificați citatul
unic ca \': observați întoarcerea. Acum, puteți specifica ca șirul 'What\'s your name?' .
O altă modalitate de a specifica acest șir specific ar fi "What's your name? „utilizarea de
ghilimele duble. În mod similar, trebuie să utilizați o secvență de ieșire pentru a folosi o
dublă citare în sine într-un șir dublu cotat. De asemenea, trebuie să indicați întoarcerea în
sine utilizând secvența de ieșire \\.
Dacă doriți să specificați un șir de două linii? O modalitate este să folosiți un șir de
apostrofe triple, după cum se arată anterior, sau puteți utiliza o secvență de ieșire pentru
caracterul de linie nouă - \n pentru a indica începerea unei noi linii. Un exemplu este:
23 'This is the first line\nThis is the second line'
O altă secvență de ieșire este util să se știe fila: \t. Există mai multe secvențe de ieșire, dar
am menționat doar cele mai utile aici.
Un lucru de reținut este că într-un șir, un caracter backslash la sfârșitul liniei indică faptul
că șirul este continuat în următoarea linie, dar nu se adaugă nicio linie nouă. De exemplu:
"This is the first sentence. \
This is the second sentence."

este echivalent cu
"This is the first sentence. This is the second sentence."

Runda String
Dacă trebuie să specificați niște șiruri de caractere în care nu este tratată nici o prelucrare
specială, cum ar fi secvențele de ieșire, atunci ceea ce aveți nevoie este să specificați
un șir brut prin prefixare r sau R șir. Un exemplu este:
r"Newlines are indicated by \n"

Notă pentru utilizatorii cu expresii regulate

Utilizați întotdeauna șiruri de caractere atunci când se ocupă de expresii regulate.  În caz
contrar, poate fi necesară o mulțime de backwhacking. De exemplu, backreferences pot fi
denumite '\\1'sau r'\1'.

Variabil
Folosind doar constantele literale pot deveni în curând plictisitoare - avem nevoie de o
modalitate de stocare a informațiilor și de manipulare a acestora. Aici variabilele intră în
imagine. Variabilele sunt exact ceea ce implică numele - valoarea lor poate varia, adică
puteți stoca orice folosind o variabilă. Variabilele sunt doar părți ale memoriei
computerului în care stocați anumite informații. Spre deosebire de constantele literale,
aveți nevoie de o metodă de accesare a acestor variabile și, prin urmare, le dați nume.

Denumire Identificator
A Byte of Python Elementele de bază

Variabilele sunt exemple de identificatori. Identificatorii sunt denumiri date pentru a


identifica ceva . Există câteva reguli pe care trebuie să le respectați pentru denumirea
identificatorilor:

 Primul caracter al identificatorului trebuie să fie o literă a alfabetului (ASCII


majusculă sau caractere ASCII sau Unicode) sau o subliniere ( _).
 Restul numelui identificatorului poate fi format din litere (ASCII majuscule sau
caractere ASCII sau Unicode), subliniere ( _) sau cifre (0-9).
 Numele identificatorilor sunt case-sensitive. De exemplu, myname și nu
myName sunt la fel. Rețineți literele mici din prima și cea mai mare din cea de-a doua. nN

24 Exemple de valide nume de identificare sunt i, name_2_3. Exemple de invalid nume
de identificare sunt 2things, this is spaced out, my-name și >a1b2_c3.

Tipuri de Date
Variabilele pot conține valori de diferite tipuri, numite tipuri de date. Tipurile de bază sunt
numerele și șirurile, pe care le-am discutat deja. În capitolele ulterioare vom vedea cum
să creăm propriile noastre tipuri folosind clase .

Obiect
Amintiți-vă, Python se referă la orice lucru folosit într-un program ca  obiect . Aceasta se
înțelege în sens generic. În loc să spui " ceva ", spunem " obiectul ".

Notă pentru utilizatorii de programare orientați pe obiecte :

Python este puternic orientat în obiect în sensul că totul este un obiect care include
numere, șiruri și funcții.
Vom vedea acum cum să folosim variabilele împreună cu constantele literale.  Salvați
următorul exemplu și executați programul.

Cum se scriu programele Python


De acum înainte, procedura standard pentru a salva și a rula un program Python este
după cum urmează:

Pentru PyCharm
1. Deschideți PyCharm .
2. Creați un fișier nou cu numele de fișier menționat.
3. Introduceți codul programului prezentat în exemplu.
4. Faceți clic dreapta și rulați fișierul curent.
A Byte of Python Elementele de bază

NOTĂ: Ori de câte ori trebuie să furnizați argumente pentru linia de comandă  , faceți clic
pe Run-> Edit Configurations și tastați argumentele din Script parameters: secțiune și faceți clic
pe OK butonul:

25

Pentru alți editori


1. Deschideți editorul ales.
2. Introduceți codul programului prezentat în exemplu.
3. Salvați-l ca fișier cu numele de fișier menționat.
4. Rulați interpretul cu comanda python program.py pentru a rula programul.

Exemplu: Folosind variabile și constante literale


Tastați și executați următorul program:
# Filename : var.py
i=5
print(i)
i=i+1
print(i)
s = '''This is a multi-line string.
This is the second line.'''
print(s)

ieșire:
5
A Byte of Python Elementele de bază

6
This is a multi-line string.
This is the second line.

Cum funcționează

Iată cum funcționează acest program. Mai întâi, atribuim valoarea constantă literală 5
variabilei i utilizând operatorul de atribuire ( =). Această linie este numită o instrucțiune
deoarece afirmă că trebuie făcut ceva și în acest caz conectăm numele variabilei  i la
26 valoare 5. Apoi, vom tipări valoarea de i utilizare a instrucțiunii print, care, fără îndoială,
doar imprimă valoarea variabilei pe ecran.
Apoi adăugăm 1la valoarea stocată i și o stocăm înapoi. Apoi îl imprimam și, de așteptat,
obținem valoarea 6.
În mod similar, atribuim șirul literal variabilei s și apoi imprimați.
Notă pentru programatorii de limbaj static

Variabilele sunt utilizate doar prin atribuirea unei valori. Nu este necesară / utilizată nicio
declarație sau definiție de tip de date.

Linie logică și fizică


O linie fizică este ceea ce vedeți când scrieți programul. O linie logică este ceea ce Python
vede ca o singură declarație. Python implicit presupune că fiecare linie fizică corespunde
unei linii logice .

Un exemplu de linie logică este o declarație ca print 'hello world' - dacă aceasta se afla pe o
linie de la sine (după cum o vedeți într-un editor), atunci aceasta corespunde și unei linii
fizice.
Implicit, Python încurajează utilizarea unei singure instrucțiuni per linie care face codul
mai ușor de citit.

Dacă doriți să specificați mai multe linii logice pe o singură linie fizică, atunci trebuie să
specificați în mod explicit acest lucru folosind o punct și virgulă (  ;) care indică sfârșitul
unei linii / instrucțiuni logice. De exemplu:
i=5
print(i)

este în mod efectiv același


i = 5;
print(i);

care este, de asemenea, aceeași ca


i = 5; print(i);

și la fel ca
i = 5; print(i)
A Byte of Python Elementele de bază

Cu toate acestea, vă recomandăm cu insistență să lipiți scris maxim o singură linie logică


pe fiecare linie fizică . Ideea este că nu trebuie să folosiți niciodată punct și virgulă.  De
fapt, niciodată nu am folosit nici măcar un punct și virgulă într-un program Python.

Există un fel de situație în care acest concept este cu adevărat util: dacă aveți o lungă linie
de cod, puteți să-l rupeți în mai multe linii fizice, utilizând întârziere.  Aceasta este
menționată ca o conexiune clară explicită :
s = 'This is a string. \
This continues the string.'
print(s)
27
ieșire:
This is a string. This continues the string.

În mod similar,
i=\
5

este la fel ca
i=5

Uneori există o ipoteză implicită în care nu este nevoie să folosiți o backslash.  Acesta este
cazul în care linia logică are o paranteză de pornire, începând paranteze pătrate sau un
braț de plecare inițial, dar nu una finală. Aceasta se numește asociere implicită . Puteți
vedea acest lucru în acțiune atunci când scriem programe folosind  lista în capitolele
ulterioare.

Indentare 
Spațiul alb este important în Python. De fapt, spațiile albe de la începutul liniei sunt
importante . Aceasta se numește indentare . Spațiul principal (spațiile și filele) de la
începutul liniei logice este utilizat pentru a determina nivelul de indentare al liniei logice,
care la rândul său este folosit pentru a determina gruparea de declarații.

Aceasta înseamnă că declarațiile care merg împreună trebuie să aibă aceeași


indentare. Fiecare astfel de set de declarații se numește bloc . Vom vedea exemple de
blocuri importante în capitolele ulterioare.

Un lucru pe care trebuie să-l amintiți este că o indentare greșită poate da naștere unor
erori. De exemplu:
i=5
# Error below! Notice a single space at the start of the line
print('Value is', i)
print('I repeat, the value is', i)

Când executați acest lucru, veți avea următoarea eroare:


File "whitespace.py", line 3
A Byte of Python Elementele de bază

print('Value is', i)
^
IndentationError: unexpected indent

Observați că există un singur spațiu la începutul liniei a doua.  Eroarea indicată de Python
ne spune că sintaxa programului este nevalidă, adică programul nu a fost scris corect.  Ce
înseamnă pentru tine este ca nu poți începe arbitrar noi blocuri de declarații (cu excepția
blocului principal implicit pe care l-ai folosit de-a lungul operațiunii, desigur).  Cazurile în
care puteți utiliza blocuri noi vor fi detaliate în capitolele ulterioare, cum ar fi  fluxul de
control .
28 Modul de indentare

Utilizați patru spații pentru indentare. Aceasta este recomandarea oficială a limbajului


Python. Editorii buni vor face automat acest lucru pentru dvs.  Asigurați-vă că utilizați un
număr consistent de spații pentru indentare, altfel programul dvs. nu va fi rulat sau va
avea un comportament neașteptat.
Notă pentru programatorii de limbaj static

Python va folosi întotdeauna indentarea pentru blocuri și nu va folosi niciodată


bretele. Rulați from __future__ import braces pentru a afla mai multe.

rezumat
Acum, după ce am trecut prin multe detalii detaliate, putem trece la lucruri mai
interesante, cum ar fi declarațiile de flux de control. Asigurați-vă că vă simțiți confortabil
cu ceea ce ați citit în acest capitol.
A Byte of Python Operatori și expresii

Operatori și expresii
Cele mai multe declarații (linii logice) pe care le scrieți vor conține  expresii . Un exemplu
simplu al unei expresii este 2 + 3. O expresie poate fi împărțită în operatori și operanzi.
Operatorii sunt funcții care fac ceva și pot fi reprezentate prin simboluri precum + sau prin
cuvinte cheie speciale. Operatorii necesită funcționarea unor date și aceste date se
numesc operanzi . În acest caz, 2 și 3sunt operanzii.

29 Operatorii
Vom examina pe scurt operatorii și utilizarea lor.

Rețineți că puteți evalua expresiile date în exemple folosind interpretul interactiv.  De
exemplu, pentru a testa expresia 2 + 3, folosiți promptul interactiv al interpretului Python:
>>> 2 + 3
5
>>> 3 * 5
15
>>>

Iată o prezentare generală rapidă a operatorilor disponibili:

 + (Plus)
o Adaugă două obiecte
o 3 + 5 da 8. 'a' + 'b' da 'ab'.

 - (minus)
o Dă scăderea unui număr de celălalt; dacă primul operand este absent, se
presupune că este zero.
o -5.2 dă un număr negativ și 50 – 24 dă 26.

 * (înmulțește)
o Dă înmulțirea celor două numere sau returnează șirul repetat de mai multe
ori.
o 2 * 3 da 6. 'la' * 3 da 'lalala'.

 ** (putere)
o Returnează x la puterea y
o 3 ** 4 dă 81 (ie 3 * 3 * 3 * 3)
A Byte of Python Operatori și expresii

 / (împarte)
o Împărțiți x cu y
o 13 / 3 dă 4.333333333333333

 // (împărțire și rest)
o Împărțiți x cu y și rotunjește rezultatul până la cea mai apropiată valoare
30 întreagă. Rețineți că dacă una dintre valori este float, rezultatul obținut va fi tot float.
o 13 // 3 dă 4
o -13 // 3 dă -5
o 9//1.81 dă 4.0

 % (Modulo)
o Returnează restul împărțirii
o 13 % 3 da 1. -25.5 % 2.25 da 1.5.

 << (schimbare stânga)
o Se schimbă biții numărului în stânga după numărul de biți
specificați. (Fiecare număr este reprezentat în memorie de biți sau cifre binare, adică 0 și
1)
o 2 << 2 da 8. 2 este reprezentat de 10 biți.
o Transmisia stânga cu 2 biți dă 1000 care reprezintă zecimală 8.

 >> (schimbare dreapta)
o Se schimbă biții numărului în dreapta cu numărul de biți specificați.
o 11 >> 1 da 5.
o 11 este reprezentat în biți prin 1011 care, atunci când dreapta este deplasată
cu 1 biți, 101 care este zecimală 5.

 & (operatorul logic ȘI)


o Din punct de vedere logic ȘI din numere
o 5 & 3 da 1.

 | (operatorul logic OR)
o Bitul OR al numerelor
o 5 | 3 dă 7
A Byte of Python Operatori și expresii


 ^ (operatorul logic XOR)
o Bitul XOR al numerelor
o 5 ^ 3 dă 6
 ~ (inversat în biți)
o Inversiunea logică a lui x este - (x + 1)
o ~5 da -6. Mai multe detalii la http://stackoverflow.com/a/11810203


31 < (mai
mic decât)
o Returnează dacă x este mai mică decât y. Toți operatorii de comparație
returnează True sau False. Rețineți capitalizarea acestor nume.
o 5 < 3 dă False și 3 < 5 dă True.
o Comparațiile pot fi legate în mod arbitrar: 3 < 5 < 7 dă True.

 > (mai mare ca)


o Returnează dacă x este mai mare decât y
o 5 > 3 se întoarce True. Dacă ambii operanzi sunt numere, ele sunt mai întâi
convertite la un tip comun. În caz contrar, returnează întotdeauna False.

 <= (mai mic sau egal cu)


o Returnează dacă x este mai mică sau egală cu y
o x = 3; y = 6; x <= y se întoarce True

 >= (mai mare sau egal cu)


o Returnează dacă x este mai mare sau egal cu y
o x = 4; y = 3; x >= 3  se întoarce True

 == (egal cu)
o Compară dacă obiectele sunt egale
o x = 2; y = 2; x == y se întoarce True
o x = 'str'; y = 'stR'; x == y  se întoarce False
o x = 'str'; y = 'str'; x == y  se întoarce True

 != (diferit)
o Compară dacă obiectele nu sunt egale
A Byte of Python Operatori și expresii

o x = 2; y = 3; x != y  se întoarce True

 not (NU boolean)
o Dacă x este True, se întoarce False. Dacă x este False, se întoarce True.
o x = True; not x se întoarce False.

32

 and (ȘI
boolean)
o x and y returnează False dacă x este False, altfel returnează evaluarea lui y
o x = False; y = True; x and y revine False din moment ce x este Fals. În acest caz,
Python nu va evalua, deoarece știe că partea stângă a expresiei "și" este  False ceea ce
implică faptul că întreaga expresie va fi False indiferent de celelalte valori. Aceasta se
numește evaluare la scurtcircuit.

 or (SAU boolean)
o Dacă x este True, se întoarce True, altfel returnă evaluarea lui y
o x = True; y = False; x or y se întoarce True. Evaluarea la scurtcircuit se aplică și
aici.

Comandă rapidă pentru funcționarea și asignarea


matematică
Este comună rularea unei operații matematice pe o variabilă și apoi asignarea rezultatului
operației la variabila, prin urmare, există o scurtătură pentru astfel de expresii:
a=2
a=a*3

poate fi scris ca:


a=2
a *= 3

Observați că var = var operation expression devine var operation= expression .

Ordin de evaluare
Dacă ați avut o expresie cum ar fi 2 + 3 * 4, este adunarea făcută mai întâi sau
multiplicarea? Matematica noastră de liceu ne spune că multiplicarea ar trebui făcută mai
A Byte of Python Operatori și expresii

întâi. Acest lucru înseamnă că operatorul de multiplicare are o prioritate mai mare decât
operatorul de adunare.
Următorul tabel dă tabelul de priorități pentru Python, de la cea mai mică prioritate (cea
mai puțin obligatorie) la cea mai înaltă prioritate (cel mai mare caracter
obligatoriu). Aceasta înseamnă că într-o expresie dată, Python va evalua mai întâi
operatorii și expresiile mai mici în tabel, înainte de cele listate mai sus în tabel.

Următorul tabel, preluat din manualul de referință Python , este furnizat din motive de
exhaustivitate. Este mult mai bine să utilizați paranteze pentru a grupa operatorii și
operanzii în mod corespunzător pentru a specifica în mod explicit prioritatea. Acest lucru
face programul mai ușor de citit. Consultați Schimbarea ordinii de evaluare de mai jos
33
pentru detalii.

 lambda : Expresia Lambda


 if - else : Expresiecondiționată
 or : Boolean OR
 and : Boolean AND
 not x : Nu este boolean
 in, not in, is, is not, <, <=, >, >=, !=, ==  : Comparații, inclusiv teste de membru și teste de
identitate
 | : OR logic
 ^ : XOR logic
 & : AND logic
 <<, >> : Schimbări
 +, - : Adunare si scădere
 *, /, //, % : Înmulțire, diviziune, diviziune podea și restul
 +x, -x, ~x : Pozitiv, negativ, NOT logic
 ** : Exponențiere
 x[index], x[index:index], x(arguments...), x.attribute  : Subscriere, decupare, apel, referință
atribut
 (expressions...), [expressions...], {key: value...}, {expressions...}  : Afișaj de legare sau tuplu,
afișare listă, afișare dicționar, afișare pe ecran

Operatorii care nu ne-am întâlnit deja vor fi explicați în capitolele ulterioare.

Operatorii cu aceeași prioritate sunt listați în același rând în tabelul de mai sus. De


exemplu, + și - au aceeași prioritate.

Schimbarea ordinii de evaluare


Pentru a face expresiile mai ușor de citit, putem folosi paranteze.  De exemplu, 2 + (3 * 4)
este cu siguranță mai ușor de înțeles decât 2 + 3 * 4 ceea ce necesită cunoașterea
precedentelor operatorului. Ca și în cazul tuturor, parantezele ar trebui să fie utilizate în
mod rezonabil (nu exagerați) și nu ar trebui să fie redundante, ca în (2 + (3 * 4)).
Există un avantaj suplimentar în utilizarea parantezelor - ne ajută să schimbăm ordinea de
evaluare. De exemplu, dacă doriți ca evaluarea suplimentară să fie evaluată înainte de
multiplicarea într-o expresie, atunci puteți scrie ceva asemănător (2 + 3) * 4.
A Byte of Python Operatori și expresii

Asociativitatea
Operatorii sunt, de obicei, asociați de la stânga la dreapta.  Acest lucru înseamnă că
operatorii cu aceeași prioritate sunt evaluați în manieră stânga-dreaptă.  De exemplu, 2 + 3
+ 4 este evaluată (2 + 3) + 4.

Expresii
Exemplu (salvați ca expression.py):
34 length = 5
breadth = 2
area = length * breadth
print('Area is', area)
print('Perimeter is', 2 * (length + breadth))

ieșire:
$ python expression.py
Area is 10
Perimeter is 14

Cum funcționează

Lungimea și lățimea dreptunghiului sunt stocate în variabile cu același nume.  Noi le


folosim pentru a calcula suprafața și perimetrul dreptunghiului cu ajutorul
expresiilor. Stocam rezultatul expresiei length * breadth in variabila area si apoi imprimam
folosind funcția print. În al doilea caz, folosim direct valoarea expresiei 2 * (length + breadth)
în funcția de imprimare.
De asemenea, observați cum Python imprimă destul de frumos rezultatul. Chiar dacă nu
am specificat un spațiu între 'Area is 'și variabila area, Python o pune pentru noi, astfel încât
să obținem o ieșire curată și programul este mult mai ușor de citit în acest fel (deoarece
nu avem nevoie să ne facem griji cu privire la spațierea în șirurile pe care noi utilizare
pentru ieșire). Acesta este un exemplu pentru modul în care Python face viața mai ușoară
pentru programator.

rezumat
Am văzut cum să folosim operatori, operanzi și expresii - acestea sunt elementele de bază
ale oricărui program. Apoi, vom vedea cum să le folosim în programele noastre folosind
declarații.
A Byte of Python Operatori și expresii

35
A Byte of Python Control Flow

Control Flow
În programele pe care le-am văzut până acum, au existat întotdeauna o serie de declarații
executate cu fidelitate de Python în ordinea exactă de sus în jos. Dacă ați fi vrut să
schimbați modul în care funcționează? De exemplu, doriți ca programul să ia anumite
decizii și să facă diferite lucruri în funcție de situații diferite, cum ar fi tipărirea "Bună
dimineața" sau "Bună seara" în funcție de ora din zi?

După cum probabil ați ghicit, acest lucru se realizează utilizând declarații de flux de
36 control. Există trei declarații de flux de control în Python - if, for și while.

Declarația If
Instrucțiunea if este folosită pentru a verifica o condiție: dacă condiția este adevărată,
executăm un bloc de instrucțiuni (numit if-block ), altfel procesăm un alt bloc de
instrucțiuni (numit alt bloc ). Altă clauză este opțională.
Exemplu (salvați ca if.py):

number = 23
guess = int(input('Enter an integer : '))

if guess == number:
# New block starts here
print('Congratulations, you guessed it.')
print('(but you do not win any prizes!)')
# New block ends here
elif guess < number:
# Another block
print('No, it is a little higher than that')
# You can do whatever you want in a block ...
else:
print('No, it is a little lower than that')
# you must have guessed > number to reach here

print('Done')
# This last statement is always executed,
# after the if statement is executed.

ieșire:
$ python if.py
Enter an integer : 50
A Byte of Python Control Flow

No, it is a little lower than that


Done

$ python if.py
Enter an integer : 22
No, it is a little higher than that
Done

37 $ python if.py
Enter an integer : 23
Congratulations, you guessed it.
(but you do not win any prizes!)
Done

Cum funcționează

În acest program, luăm presupuneri de la utilizator și verificăm dacă acesta este numărul
pe care îl avem. Am setat variabila number la orice întreg dorim, sa spunem 23. Apoi, luăm
presupunerea utilizatorului folosind funcția input(). Funcțiile sunt doar programe
reutilizabile. Vom citi mai multe despre ele în capitolul următor .
Furnizăm un șir funcției încorporate input care îl imprimă pe ecran și așteaptă introducerea
de la utilizator. Odată ce introducem ceva și apăsăm [enter], funcția input() returnează
ceea ce am introdus, ca un șir. Apoi convertim acest șir la un întreg folosind int și apoi
stocăm-l în variabila guess. De fapt, aceasta int este o clasă, dar tot ce trebuie să știți chiar
acum este că o puteți folosi pentru a converti un șir la un întreg (presupunând că șirul
conține un întreg valid în text).
Apoi, vom compara estimarea utilizatorului cu numărul pe care l-am ales. Dacă acestea
sunt egale, vom imprima un mesaj de succes. Observați că folosim nivele de indentare
pentru a spune Python care dintre afirmații aparțin blocului. Acesta este motivul pentru
care indentarea este atât de importantă în Python. Sper că vă respectați regula de
"indentare consistentă". Nu-i așa?

Observați modul în care instrucțiunea if are două puncte ”:” la sfârșit - indicăm Python că
urmează un bloc de declarații.
Apoi, verificăm dacă presupunerea este mai mică decât numărul și, dacă da, informăm
utilizatorul că trebuie să ghicească puțin mai mult decât acesta. Ce am folosit aici
este clauza elif care combină de fapt două afirmații înrudite  if else-if else într-o
singură declarație combinată  if-elif-else. Acest lucru face programul mai ușor și reduce
cantitatea de indentare necesară.
Declarațiile elif și declarațiile else trebuie să aibă, de asemenea, semnul două puncte ”:” la
sfârșitul liniei logice urmate de blocul de declarații corespunzător (cu indentare
corespunzătoare, desigur)
Puteți avea o altă declarație if în interiorul blocului if-a unei declarații if și așa mai departe
- aceasta se numește o declarație imbricată if.
A Byte of Python Control Flow

Amintiți-vă că piesele elif și else piesele sunt opționale. O mențiune  if valabilă minimă este:

if True:
print('Yes, it is true')

După ce a terminat Python complet execuția declarației if , împreună cu declarația elif


asociată și clauzele else, se trece la următoarea declarație în blocul care conține declarația
if. În acest caz, este blocul principal (unde începe executarea programului), iar următoarea
declarație afișată este  print('Done'). După aceasta, Python vede sfârșitul programului și pur
și simplu termină.
38 Chiar dacă este un program foarte simplu, am evidențiat multe lucruri pe care ar trebui să
le observați. Toate acestea sunt destul de simple (și surprinzător de simplu pentru cei
dintre voi cu experiență C / C + +). Veți avea nevoie să deveniți conștienți de toate aceste
lucruri inițial, dar, după o anumită practică, veți deveni confortabil cu ei și vă veți simți
"natural".

Notă pentru programatorii C / C ++

Nu există nicio declarație switch în Python. Puteți folosi o declarație if..elif..else pentru a face


același lucru (și, în unele cazuri, utilizați un dicționar pentru a face acest lucru rapid)

Declarația while
Instrucțiunea while vă permite să executați în mod repetat un bloc de declarații atâta timp
cât o condiție este adevărată. O declarație while este un exemplu de ceea ce se numește
o declarație de buclă . O declarație while poate avea o clauză else opțională .
Exemplu (salvați ca while.py):

number = 23
running = True

while running:
guess = int(input('Enter an integer : '))

if guess == number:
print('Congratulations, you guessed it.')
# this causes the while loop to stop
running = False
elif guess < number:
print('No, it is a little higher than that.')
else:
print('No, it is a little lower than that.')
else:
A Byte of Python Control Flow

print('The while loop is over.')


# Do anything else you want to do here
print('Done')

ieșire:
$ python while.py
Enter an integer : 50
No, it is a little lower than that.
39
Enter an integer : 22
No, it is a little higher than that.
Enter an integer : 23
Congratulations, you guessed it.
The while loop is over.
Done

Cum funcționează

În acest program, jucăm încă jocul de ghicit, dar avantajul este că utilizatorul are
permisiunea să păstreze ghicitul până când ghicește corect - nu este nevoie să executați în
mod repetat programul pentru fiecare ghicire, așa cum am făcut în secțiunea
anterioară . Acest lucru demonstrează cu ușurință utilizarea declarației while.
Am mutat declarațiile input și if în interiorul buclei while și setați variabila running la True
înainte de bucla în timp. Mai întâi, verificăm dacă variabila running este True și apoi
continuăm executarea blocului de timp corespunzător. După ce se execută acest bloc, se
verifică din nou condiția care în acest caz este variabila running. Dacă este adevărat,
executăm din nou blocul de timp, altfel vom continua să executăm blocul opțional
altcineva și apoi vom continua cu următoarea instrucțiune.
Blocul else este executat atunci când starea buclei while devine False - aceasta poate fi chiar
și prima dată că această condiție este verificată. Dacă există o clauză else pentru o buclă
while, aceasta este întotdeauna executată dacă nu ieși din bucla cu o instrucțiune break.
True și False sunt numite tipuri Boolean și puteți lua în considerare ca acestea să fie
echivalentă cu valoarea 1și respectiv, 0.
Notă pentru programatorii C / C ++

Amintiți-vă că puteți avea o clauză else pentru buclă while.

Bucla for
Instrucțiunea for..in este o altă instrucțiune looping care repetă o secvență de obiecte,
adică trece prin fiecare element dintr-o secvență. Vom vedea mai multe
despre secvențe în detaliu în capitolele ulterioare. Ceea ce trebuie să știți chiar acum este
că o secvență este doar o colecție ordonată de articole.
A Byte of Python Control Flow

Exemplu (salvați ca for.py):

for i in range(1, 5):


print(i)
else:
print('The for loop is over')

ieșire:
$ python for.py
1
40
2
3
4
The for loop is over

Cum funcționează

În acest program, tipărim o serie de numere. Generăm această secvență de numere


utilizând funcția încorporată range.
Ceea ce facem aici este furnizarea ei două numere și range returnează o serie de numere
începând de la primul număr și până la al doilea număr.  De exemplu, range (1,5) dă
secvența [1, 2, 3, 4]. În mod implicit, range durează un număr de pași de 1. Dacă furnizăm
un al treilea număr range, atunci acesta devine numărul pasului. De exemplu, range (1,5,2)
dă [1,3]. Amintiți-vă că intervalul se extinde până la al doilea număr, adică nu include al
doilea număr.
Rețineți că range() generează doar un singur număr la un moment dat, dacă doriți lista
completă de numere, apelați list() pe de range(), de exemplu, list(range(5)) va avea
ca rezultat [0, 1, 2, 3, 4]. Listele sunt explicate în capitolul structurile de date .
Bucla for iterează apoi peste acest interval - for i in range (1,5) este echivalent cu for i in [1, 2, 3,
4] care este ca atribuirea fiecărui număr (sau obiect) în secvența la i, la un moment dat, iar
apoi executa blocul de declarații pentru fiecare valoare i. În acest caz, vom tipări valoarea
în blocul de instrucțiuni.
Amintiți-vă că partea else este opțională. Când este inclusă, este întotdeauna executată o
dată după terminarea buclei for, cu excepția cazului în care se întâlnește o declarație
de pauză .
Amintiți-vă că bucla for..in funcționează pentru orice secvență. Aici avem o listă de numere
generate de funcția încorporată range, dar, în general, putem folosi orice fel de secvență
de orice fel de obiecte! Vom explora această idee în detaliu în capitolele ulterioare.
Notă pentru programatori C / C ++ / Java / C #

Buclele  For Python sunt radical diferite de bucla  for C / C ++ . Programatorii C # vor


observa că bucla for din Python este similară cu bucla foreach din C #. Programatorii Java
notează că același lucru este similar cu cel for (int i : IntArray) din Java 1.5.
A Byte of Python Control Flow

În C / C ++, dacă doriți să scrieți for (int i = 0; i < 5; i++) , atunci în Python scrieți doar for i in
range (0,5). După cum puteți vedea, bucla for este mai simplă, mai expresivă și mai puțin
predispusă la erori în Python.

Declarația break
Instrucțiunea break este folosită pentru a ieși dintr-o declarație de buclă, adică opriți
executarea unei instrucțiuni de buclă, chiar dacă condiția de buclă nu a devenit  False sau
secvența de elemente nu a fost repetată complet.
O notă importantă este că dacă rupe o instrucțiune for sau buclă while, orice bloc din buclă
41 corespunzătoare else este nu executat.

Exemplu (salvați ca break.py):

while True:
s = input('Enter something : ')
if s == 'quit':
break
print('Length of the string is', len(s))
print('Done')

ieșire:
$ python break.py
Enter something : Programming is fun
Length of the string is 18
Enter something : When the work is done
Length of the string is 21
Enter something : if you wanna make your work also fun:
Length of the string is 37
Enter something : use Python!
Length of the string is 11
Enter something : quit
Done

Cum funcționează

În acest program, luăm în mod repetat intrarea utilizatorului și imprimăm fiecare dată
fiecare lungime. Oferim o condiție specială pentru a opri programul, verificând dacă este
introdusă de utilizator 'quit'. Ne oprim programul de rupere în afara buclei și să ajungă la
sfârșitul programului.
Lungimea șirului de intrare poate fi găsită utilizând funcția încorporată len.
Amintiți-vă că declarația break poate fi utilizată și cu bucla for.
A Byte of Python Control Flow

Swingop's Poetic Python

Intrarea pe care am folosit-o aici este un poem mini pe care l-am scris:
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!

42

Declarația Continue
Instrucțiunea continue este folosită pentru a spune lui Python să ignore restul
instrucțiunilor din blocul actual de buclă și să continue la următoarea iterație a buclă.
Exemplu (salvați ca continue.py):
while True:
s = input('Enter something : ')
if s == 'quit':
break
if len(s) < 3:
print('Too small')
continue
print('Input is of sufficient length')
# Do other kinds of processing here...

ieșire:
$ python continue.py
Enter something : a
Too small
Enter something : 12
Too small
Enter something : abc
Input is of sufficient length
Enter something : quit

Cum funcționează
A Byte of Python Control Flow

În acest program, acceptăm intrarea de la utilizator, dar procesăm șirul de intrare numai
dacă are cel puțin 3 caractere. Deci, folosim funcția încorporată len pentru a obține
lungimea și dacă lungimea este mai mică de 3, vom sări peste restul instrucțiunilor din
bloc utilizând instrucțiunea continue. În caz contrar, restul declarațiilor din buclă sunt
executate, făcând orice fel de procesare pe care dorim să o facem aici.
Rețineți că declarația continue funcționează și cu bucla for.

Rezumat
43 Am văzut cum să folosim cele trei declarații de control al fluxului - if, while și , for împreună
cu cele asociate lor,  declarațiile break și continue. Acestea sunt unele dintre cele mai
frecvent utilizate părți ale Python și, prin urmare, a utilizarea lor într-un mod confortabil
este esențială.

Apoi, vom vedea cum să creați și să utilizați funcții.


A Byte of Python Funcții

Funcții
Funcțiile sunt bucăți de programe reutilizabile. Ele vă permit să dați un nume unui bloc de
declarații, permițându-vă să rulați blocul folosind numele specificat oriunde în program și
de câte ori. Aceasta se numește apelarea funcției. Am folosit deja multe funcții
încorporate, cum ar fi len și range.
Conceptul de funcții este probabil cel mai important element de construcție al oricărui
soft non-trivial (în orice limbaj de programare), așa că vom explora diferite aspecte ale
funcțiilor din acest capitol.
44
Funcțiile sunt definite folosind cuvântul cheie def. După acest cuvânt cheie apare un nume
de identificator pentru funcție, urmat de o pereche de paranteze care pot include unele
nume de variabile și de două puncte (:) care finalizează linia.  În continuare urmează blocul
de instrucțiuni care fac parte din această funcție. Un exemplu va arăta că acest lucru este
de fapt foarte simplu:

Exemplu (salvați ca function1.py):


def say_hello():
# block belonging to the function
print('hello world')
# End of function
say_hello() # call the function
say_hello() # call the function again

ieșire:
$ python function1.py
hello world
hello world

Cum funcționează

Definim o funcție numită say_hello folosind sintaxa așa cum este explicat mai sus. Această
funcție nu are parametri și, prin urmare, nu există variabile declarate în
paranteze. Parametrii funcțiilor sunt doar intrări în funcție, astfel încât să putem
transmite valori diferite și să obținem rezultate corespunzătoare.
Observați că putem numi aceeași funcție de două ori, ceea ce înseamnă că nu trebuie să
scriem din nou același cod.

Parametrii funcțiilor
O funcție poate lua parametri, care sunt valori pe care le furnizați funcției, astfel încât
funcția să poată face ceva folosind aceste valori. Acești parametri sunt la fel ca variabilele,
A Byte of Python Funcții

cu excepția faptului că valorile acestor variabile sunt definite atunci când apelăm funcția
și sunt deja atribuite valori când funcționează funcția.

Parametrii sunt specificați în perechea de paranteze din definiția funcției, separate prin
virgule. Atunci când apelăm funcția, furnizăm valorile în același mod.  Rețineți
terminologia utilizată - numele furnizate în definiția funcției sunt numite parametri, în
timp ce valorile pe care le furnizați în apelul pentru funcții sunt numite argumente .

Exemplu (salvați ca function_param.py):

def print_max(a, b):


45 if a > b:
print(a, 'is maximum')
elif a == b:
print(a, 'is equal to', b)
else:
print(b, 'is maximum')

# directly pass literal values


print_max(3, 4)

x=5
y=7

# pass variables as arguments


print_max(x, y)

ieșire:
$ python function_param.py
4 is maximum
7 is maximum

Cum funcționează

Aici, definim o funcție numită print_max care folosește doi parametri numiți a și b. Aflăm
numărul mai mare folosind o simplă declarație if..else și apoi imprimați numărul mai mare.
Prima dată când numim funcția print_max, furnizăm direct numerele ca argumente. În al
doilea caz, numim funcția cu variabile ca argumente. print_max(x, y) determină valoarea
argumentului x care  va fi atribuită parametrului a și valoarea argumentului care y va fi
alocat parametrului b. Funcția print_max funcționează în același mod , în ambele cazuri.
A Byte of Python Funcții

Variabile locale
Când declarați variabilele în interiorul unei definiții a funcției, ele nu sunt în nici un fel
legate de alte variabile cu aceleași nume folosite în afara funcției - de exemplu, numele
variabilelor sunt locale pentru funcție. Aceasta se numește domeniul de aplicare al
variabilei. Toate variabilele au domeniul de aplicare al blocului în care sunt declarate
începând de la punctul de definire a numelui.

Exemplu (salvați ca function_local.py):

46 x = 50
def func(x):
print('x is', x)
x=2
print('Changed local x to', x)
func(x)
print('x is still', x)

ieșire:
$ python function_local.py
x is 50
Changed local x to 2
x is still 50

Cum funcționează

Prima dată când imprimăm valoarea numelui x cu prima linie din corpul funcției, Python
utilizează valoarea parametrului declarat în blocul principal, deasupra definiției funcției.

În continuare, vom atribui valoarea 2 valoarea  x. Numele x este local pentru funcția
noastră. Deci, când schimbăm valoarea funcției x, definiția x din blocul principal rămâne
neafectată.
Cu ultima instrucțiune print, afișăm valoarea definită x în blocul principal, confirmând astfel
că aceasta nu este efectiv afectată de atribuirea locală în cadrul funcției numite anterior.

Declarația global 
Dacă doriți să atribuiți o valoare unui nume definit la cel mai înalt nivel al programului
(adică nu în interiorul vreunui scop, cum ar fi funcții sau clase), atunci trebuie să îi spuneți
lui Python că numele nu este local, ci este global . Facem asta folosind instrucțiunea
global. Este imposibil să atribuiți o valoare unei variabile definite în afara unei funcții
fără instrucțiunea global.
Puteți utiliza valorile unor astfel de variabile definite în afara funcției (presupunând că nu
există nici o variabilă cu același nume în cadrul funcției). Cu toate acestea, acest lucru nu
este încurajat și ar trebui evitat deoarece nu este clar pentru cititorul programului unde
A Byte of Python Funcții

este definirea acestei variabile. Folosind instrucțiunea global, este clar că variabila este


definită într-un bloc extrem.

Exemplu (salvați ca function_global.py):


x = 50

def func():
global x

print('x is', x)
x=2
47 print('Changed global x to', x)

func()
print('Value of x is', x)

ieșire:
$ python function_global.py
x is 50
Changed global x to 2
Value of x is 2

Cum funcționează

Instrucțiunea global este folosită pentru a declara că x este o variabilă globală - prin
urmare, atunci când atribuim o valoare în interiorul funcției x, acea modificare se reflectă
atunci când folosim valoarea din blocul principal x.
Puteți specifica mai mult de o variabilă globală folosind aceeași  instrucțiune global, de
ex global x, y, z.

Valori implicite ale argumentelor


Pentru unele funcții, este posibil să doriți să faceți opțional anumiți parametri și să utilizați
valorile implicite în cazul în care utilizatorul nu dorește să furnizeze valori pentru
acestea. Aceasta se face cu ajutorul valorilor implicite ale argumentului. Puteți specifica
valorile implicite ale parametrilor prin adăugarea la numele parametrului în definiția
funcției operatorul de atribuire ( =) urmat de valoarea implicită.
Rețineți că valoarea argumentului implicit ar trebui să fie constantă.  Mai precis, valoarea
argumentului implicit ar trebui să fie imuabilă - acest lucru este explicat în detaliu în
capitolele ulterioare. Pentru moment, amintiți-vă doar acest lucru.

Exemplu (salvați ca function_default.py):


def say(message, times=1):
print(message * times)
say('Hello')
say('World', 5)
A Byte of Python Funcții

ieșire:
$ python function_default.py
Hello
WorldWorldWorldWorldWorld

Cum funcționează

Funcția denumită say este utilizată pentru a imprima un șir de câte ori este specificat. Dacă
48 nu furnizăm o valoare, atunci, implicit, șirul este imprimat o singură dată.  Acest lucru se
realizează prin specificarea valorii argumentului implicit a lui 1 parametrului times.
În prima utilizare a lui say, furnizăm numai șirul și imprimă șirul o singură dată. În cea de-a
doua utilizare say, furnizăm atât șirul, cât și un argument 5care spune că dorim
să spunem mesajul de șir de 5 ori.

ATENȚIE

Numai acei parametri care se află la sfârșitul listei de parametri pot primi valori implicite
ale parametrilor, adică nu puteți avea un parametru cu o valoare implicită a unui
argument înainte de un parametru fără o valoare de argument implicită în lista de
parametri a funcției.

Acest lucru se datorează faptului că valorile sunt atribuite parametrilor după poziție. De
exemplu, def func(a, b=5) este valid, dar nu def func(a=5, b) este valid .

Argumente pentru cuvinte cheie


Dacă aveți unele funcții cu mai mulți parametri și doriți să specificați doar câteva dintre
ele, atunci puteți da valori pentru acești parametri prin denumirea acestora - acest lucru
se numește argumente de cuvinte cheie - vom folosi numele (cuvântul cheie) în loc de
poziția au folosit tot timpul) pentru a specifica argumentele funcției.

Există două avantaje - unu, folosind funcția este mai ușoară, deoarece nu avem nevoie să
ne îngrijorăm de ordinea argumentelor. Doi, putem da valori numai acelor parametri la
care dorim, cu condiția ca ceilalți parametri să aibă valori implicite ale argumentului.

Exemplu (salvați ca function_keyword.py):


def func(a, b=5, c=10):
print('a is', a, 'and b is', b, 'and c is', c)

func(3, 7)
func(25, c=24)
func(c=50, a=100)
A Byte of Python Funcții

ieșire:
$ python function_keyword.py
a is 3 and b is 7 and c is 10
a is 25 and b is 5 and c is 24
a is 100 and b is 5 and c is 50

Cum funcționează

49 Funcția numită func are un parametru fără o valoare de argument implicită, urmată de doi
parametri cu valorile implicite ale argumentului.
În prima utilizare, func(3, 7) parametrul a obține valoarea 3, parametrul b obține valoarea 7
și c primește valoarea implicită 10.
În a doua utilizare func (25, c=24), variabila a obține valoarea de 25 datorită poziției
argumentului. Apoi, parametrul c obține valoarea 24 datorată numirii argumentelor
cuvintelor cheie. Variabila b obține valoarea implicită de 5.
În a treia utilizare func(c=50, a=100), folosim argumentele cuvintelor cheie pentru toate
valorile specificate. Observați că specificăm valoarea pentru parametru c înainte de
aceea, a chiar dacă a este definită anterior c în definiția funcției.

Parametrii VarArgs
Uneori s-ar putea dori să definească o funcție care poate lua orice număr de parametri,
adică numărul variabil de argumente, acest lucru poate fi realizat prin utilizarea de steluțe
( salvați ca function_varargs.py):

def total(a=5, *numbers, **phonebook):


print('a', a)
#iterate through all the items in tuple
for single_item in numbers:
print('single_item', single_item)
#iterate through all the items in dictionary
for first_part, second_part in phonebook.items():
print(first_part,second_part)
print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))

ieșire:
$ python function_varargs.py
a 10
single_item 1
single_item 2
A Byte of Python Funcții

single_item 3
Inge 1560
John 2231
Jack 1123
None

Cum funcționează

Atunci când declarăm un parametru marcat ca stea *param, atunci toate argumentele


50
poziționale de la acel punct până la final sunt colectate ca un tuplu numit "param".
În mod similar, atunci când declarăm un parametru cu stea dublă **param, atunci toate
argumentele cuvintelor cheie de la acest punct până la sfârșit sunt colectate ca un
dicționar numit "param".
Vom explora tuple și dicționare într-un capitol ulterior .

Declarația return
Instrucțiunea return este utilizată pentru a reveni dintr-o funcție, adică a ieși din
funcție. Putem returna opțional o valoare din funcție, de asemenea.
Exemplu (salvați ca function_return.py):
def maximum(x, y):
if x > y:
return x
elif x == y:
return 'The numbers are equal'
else:
return y
print(maximum(2, 3))

ieșire:
$ python function_return.py
3

Cum funcționează

Funcția maximum returnează maximul parametrilor, în acest caz, numerele furnizate


funcției. Utilizează o instrucțiune  if..else simplă pentru a găsi valoarea mai mare și
apoi returnează acea valoare.
Rețineți că o declarație return fără valoare este echivalentă cu return None. None este un tip
special în Python care reprezintă nimic. De exemplu, este folosit pentru a indica faptul că
o variabilă nu are valoare dacă are o valoare de None.
A Byte of Python Funcții

Fiecare funcție implică implicit o declarație return None la sfârșit dacă nu ați scris propria
voastră declarație return. Puteți vedea acest lucru executând în print(some_function()) cazul în
care funcția some_function nu utilizează instrucțiunea return, cum ar fi:
def some_function():
pass

Instrucțiunea pass este utilizată în Python pentru a indica un bloc gol de instrucțiuni.


SFAT: Există o funcție încorporată numită max care implementează deja funcționalitatea
"găsește maximum", deci utilizați această funcție încorporată ori de câte ori este posibil.

51 DocStrings
Python are o caracteristică minuțioasă numită șiruri de documentație , de obicei
menționată prin docstrings de nume mai scurte . DocStrings este un instrument important
pe care ar trebui să-l utilizați, deoarece ajută la documentarea mai bună a programului și
îl face mai ușor de înțeles. În mod surprinzător, putem obține chiar și docstring-ul, de
exemplu, o funcție, atunci când programul este de fapt rulat!

Exemplu (salvați ca function_docstring.py ):

def print_max(x, y):


'''Prints the maximum of two numbers.
The two values must be integers.'''
# convert to integers, if possible
x = int(x)
y = int(y)
if x > y:
print(x, 'is maximum')
else:
print(y, 'is maximum')
print_max(3, 5)
print(print_max.__doc__)

ieșire:
$ python function_docstring.py
5 is maximum
Prints the maximum of two numbers.
The two values must be integers.

Cum funcționează

Un șir pe prima linie logică a unei funcții este docstring pentru această funcție. Rețineți că


DocStrings se aplică și modulelor și claselor pe care le vom învăța în capitolele respective.
A Byte of Python Funcții

Convenția urmată pentru un docstring este un șir multi-linie în care prima linie începe cu
o literă de majuscule și se termină cu un punct. Apoi, a doua linie este goală, urmată de
orice explicație detaliată pornind de la a treia linie. Vă recomandăm cu tărie să urmați
această convenție pentru toate docstrings dvs. pentru toate funcțiile dvs. non-banale.

Putem accesa docstring-ul funcției print_max utilizând atributul ( __doc__ observați dublu-


underscores ) (numele aparținând) funcției. Amintiți-vă că Python tratează totul ca un
obiect și acesta include funcții. Vom afla mai multe despre obiectele din capitolul
despre clase .
Dacă ați folosit help() în Python, ați văzut deja utilizarea docstrings! Ceea ce face este să
aducă atributul __doc__ acelei funcții și să o afișeze într-o manieră clară pentru tine.  Puteți
52
să-l încercați pe funcția de mai sus - includeți doar help(print_max) în programul dvs. Nu
uitați să apăsați tasta q pentru a ieși din help.
Instrumentele automate pot prelua documentația din programul dvs. în acest mod.  Prin
urmare, vă recomandăm cu insistență să utilizați docstrings pentru orice funcție non-
trivială pe care o scrieți. Comanda pydoc care vine cu o distribuție Python funcționează
în mod similar cu help() utilizarea docstrings.

rezumat
Am văzut atât de multe aspecte ale funcțiilor, dar rețineți că încă nu le-am acoperit toate
aspectele. Cu toate acestea, am acoperit deja cele mai multe dintre ceea ce veți folosi în
ceea ce privește funcțiile Python în fiecare zi.

Apoi vom vedea modul de utilizare și crearea modulelor Python.


A Byte of Python Module

Module
Ați văzut cum puteți reutiliza codul în programul dvs. prin definirea funcțiilor o dată.  Dacă
doriți să reutilizați o serie de funcții în alte programe pe care le scrieți?  După cum probabil
ați ghicit, răspunsul este modulul.

Există diferite metode de scriere a modulelor, dar cea mai simplă modalitate este de a
crea un fișier cu o extensie .py care conține funcții și variabile.
O altă metodă este de a scrie modulele în limbajul nativ în care a fost scris interpretul
53 Python. De exemplu, puteți scrie module în limbajul de programare C și când sunt
compilate, ele pot fi folosite din codul dvs. Python când utilizați interpretul standard
Python.

Un modul poate fi importat de un alt program pentru a-și folosi funcționalitatea. Acesta


este modul în care putem folosi și biblioteca standard Python. În primul rând, vom vedea
cum să folosim modulele standard de bibliotecă.

Exemplu (salvați ca module_using_sys.py ):

import sys
print('The command line arguments are:')
for i in sys.argv:
print(i)
print('\n\nThe PYTHONPATH is', sys.path, '\n')

ieșire:
$ python module_using_sys.py we are arguments # each arg is separated by white space
The command line arguments are:
module_using_sys.py
we
are
arguments

The PYTHONPATH is ['/tmp/py',


# many entries here, not shown here
'/Library/Python/2.7/site-packages',
'/usr/local/lib/python2.7/site-packages']

Cum funcționează

În primul rând, vom importa modulul sys  folosind declarația import. Practic, acest lucru ne


face să spunem Python că vrem să folosim acest modul Sys. Modulul conține
funcționalități legate de interpret Python și mediul său și anume sys dic.
A Byte of Python Module

Atunci când Python execută instrucțiunea import sys, ea caută modulul sys. În acest caz,
acesta este unul dintre modulele încorporate și, prin urmare, Python știe de unde să o
găsească.
Dacă nu a fost un modul compilat, adică un modul scris în Python, interpretul Python îl va
căuta în directoarele listate în variabila sa  sys.path. Dacă modulul este găsit, atunci se
execută instrucțiunile din corpul acelui modul și modulul este disponibil pentru
utilizare. Rețineți că inițializarea se face numai pentru prima dată când importăm un
modul.
Variabila argv în sys modulul este accesat cu ajutorul ex : notație punctata sys.argv. Aceasta
indică în mod clar faptul că acest nume face parte din modulul sys. Un alt avantaj al
54 acestei abordări este că numele nu contravine nici unei argv variabile utilizate în
programul dvs. sys.argv
Variabila este o listă de șiruri (liste sunt explicate în detaliu într - un capitol ulterior  ). Mai
exact, sys.argv conține lista argumentelor liniei de comandă, adică argumentele transmise
programului dvs. folosind linia de comandă.
Dacă utilizați un IDE pentru a scrie și a rula aceste programe, căutați o modalitate de a
specifica argumentele liniei de comandă la program din meniuri.

Aici, când executam python module_using_sys.py we are


arguments, executam modulul module_using_sys.py cu comanda python iar celelalte lucruri care
urmează sunt argumentele transmise programului. Python stochează argumentele liniei
de comandă în variabila sys.argv pe care o putem folosi.
Rețineți că numele scriptului care rulează este întotdeauna primul element din  lista
sys.argv. Deci, în acest caz , vom avea la 'module_using_sys.py' la fel ca sys.argv[0], 'we'
cât sys.argv[1], 'are' ca sys.argv[2] și 'arguments' cum sys.argv[3]. Observați că Python începe să
numere de la 0 și nu 1.
sys.path conține lista de nume de director în cazul în care modulele sunt importate din
aceasta. Observați că primul șir de caractere sys.path este gol - acest șir gol indică faptul că
directorul curent este, de asemenea, o parte a acestui sys.path care este aceeași
cu variabila de mediu PYTHONPATH. Aceasta înseamnă că puteți importa direct modulele
aflate în directorul curent. În caz contrar, va trebui să plasați modulul într-unul din
directoarele listate în sys.path.
Rețineți că directorul curent este directorul din care este lansat programul. Rulați import
os; print(os.getcwd()) pentru a afla directorul actual al programului dvs.

Fișierele Byte-compilat.pyc
Importul unui modul este o afacere relativ costisitoare, astfel încât Python face câteva
trucuri pentru a-l face mai rapid. O modalitate este de a crea fișiere compilate byte cu
extensia .pyc care este o formă intermediară pe care Python o transformă în program
(amintiți-vă la secțiunea introductivă  despre modul în care funcționează Python?). Acest
fișier .pyc este util atunci când importați modulul data viitoare dintr-un program diferit - va
fi mult mai rapid deoarece o parte din procesul de procesare necesar pentru importarea
unui modul este deja realizat. De asemenea, aceste fișiere compilate de octeți sunt
independente de platformă.
A Byte of Python Module

NOTĂ: Aceste fișiere .pyc sunt de obicei create în același director ca fișierele .py


corespunzătoare . Dacă Python nu are permisiunea de a scrie fișiere în acel director,
atunci fișierele .pyc nu vor fi create.

Instrucțiunea de la import
Dacă doriți să importați direct variabila argv în programul dvs. (pentru a evita tastarea sys.
oricând pentru aceasta), atunci puteți utiliza instrucțiunea from sys import argv .
AVERTISMENT: În general, evitați utilizarea instrucțiunii from..import, utilizați în schimb
instrucțiunea import. Acest lucru se datorează faptului că programul dvs. va evita
55 confruntările cu nume și va fi mai ușor de citit.

Exemplu:
from math import sqrt
print("Square root of 16 is", sqrt(16))

__name__ (numele) modulului

Fiecare modul are un nume și declarațiile dintr-un modul pot afla numele modulului
lor. Acest lucru este util pentru scopul special de a afla dacă modulul este rulat
independent sau fiind importat. După cum sa menționat anterior, atunci când un modul
este importat pentru prima dată, codul pe care îl conține este executat.  Putem folosi
acest mod pentru a face ca modulul să se comporte în moduri diferite, în funcție de
utilizarea acestuia sau de importul acestuia dintr-un alt modul. Acest lucru poate fi
realizat folosind atributul modulului __name__.
Exemplu (salvați ca module_using_name.py):

if __name__ == '__main__':
print('This program is being run by itself')
else:
print('I am being imported from another module')

ieșire:
$ python module_using_name.py
This program is being run by itself

$ python
>>> import module_using_name
I am being imported from another module
>>>
A Byte of Python Module

Cum funcționează

Fiecare modul Python are definit __name__. În acest caz, acest lucru '__main__' implică
faptul că modulul este rulat în mod autonom de către utilizator și putem lua măsuri
adecvate.

Efectuarea propriilor module


Crearea propriilor module este ușoară, ați făcut-o tot timpul!  Acest lucru se datorează
faptului că fiecare program Python este, de asemenea, un modul. Trebuie doar să vă
56 asigurați că are o extensie .py. Următorul exemplu ar trebui să clarifice.
Exemplu (salvați ca mymodule.py):

def say_hi():
print('Hi, this is mymodule speaking.')

__version__ = '0.1'

Cele de mai sus au fost un modul de eșantionare . După cum puteți vedea, nu există nimic
deosebit în legătură cu acesta, comparativ cu programul nostru obișnuit Python.  Vom
vedea în continuare modul de utilizare a acestui modul în celelalte programe Python.

Amintiți-vă că modulul trebuie plasat fie în același director ca și programul din care îl
importăm, fie într-unul din directoarele listate în sys.path.
Un alt modul (salvat ca mymodule_demo.py):

import mymodule
mymodule.say_hi()
print('Version', mymodule.__version__)

ieșire:
$ python mymodule_demo.py
Hi, this is mymodule speaking.
Version 0.1

Cum funcționează

Observați că folosim aceeași notație punctată pentru a accesa membrii modulului.  Python
face o reutilizare reușită a aceleiași notații pentru a da o simțire distinctivă "Pythonic",
astfel încât să nu mai trebuie să învățăm noi modalități de a face lucruri.

Iată o versiune care utilizează sintaxa from..import (salvați ca mymodule_demo2.py):


from mymodule import say_hi, __version__
A Byte of Python Module

say_hi()
print('Version', __version__)

Valoarea de ieșire mymodule_demo2.py este aceeași cu cea a lui mymodule_demo.py.


Observați că, dacă există deja un __version__ nume declarat în modulul care importa
mymodule, ar exista o eroare. Acest lucru este probabil, de asemenea, deoarece este o
practică obișnuită pentru fiecare modul să declare numerele versiunii sale utilizând acest
nume. Prin urmare, este întotdeauna recomandat să preferați declarația import chiar dacă
aceasta ar putea face programul dvs. un pic mai mult.
De asemenea, puteți utiliza:

57 from mymodule import *


Acest lucru va importa toate numele publice, cum ar fi, say_hi dar nu ar importa, __version__
deoarece începe cu dublă subliniere.

AVERTISMENT: Amintiți-vă că ar trebui să evitați utilizarea starului de import, adică  from


mymodule import * .

Zen din Python

Unul dintre principiile directoare ale Python este că "Explicitul este mai bun decât
Implicit". Rulați import this în Python pentru a afla mai multe.

Funcția dir 
Funcția dir() încorporată returnează lista de nume definite de un obiect. Dacă obiectul este
un modul, această listă include funcții, clase și variabile definite în interiorul acelui modul.
Această funcție poate accepta argumente. Dacă argumentul este numele modulului,
funcția returnează lista de nume din modulul specificat. Dacă nu există niciun argument,
funcția returnează lista de nume din modulul curent.

Exemplu:
$ python
>>> import sys
# get names of attributes in sys module
>>> dir(sys)
['__displayhook__', '__doc__',
'argv', 'builtin_module_names',
'version', 'version_info']
# only few entries shown here
# get names of attributes for current module
>>> dir()
['__builtins__', '__doc__',
'__name__', '__package__', 'sys']
# create a new variable 'a'
A Byte of Python Module

>>> a = 5
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'sys', 'a']
# delete/remove a name
>>> del a
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'sys']

58 Cum funcționează

În primul rând, vedem modul de utilizare a modulului dir importat sys. Putem vedea lista


imensă de atribute pe care le conține.
Apoi, folosim funcția dir fără a trece parametrii. În mod implicit, returnează lista de
atribute pentru modulul curent. Observați că lista modulelor importate face parte și din
această listă.
Pentru a observa acțiunea dir, definim o nouă variabilă a și îi atribuim o valoare și apoi
verificăm dir și observăm că există o valoare suplimentară în lista cu același
nume. Eliminăm variabila / atributul modulului curent utilizând instrucțiunea del și
modificarea se reflectă din nou în ieșirea funcției dir.
O notă pe această declarație del- este utilizată pentru a șterge o variabilă / nume și după
executarea instrucțiunii, în acest caz după executarea del a nu mai puteți accesa
variabila a- este ca și cum nu ar fi existat deloc.
Rețineți că funcția dir()funcționează pe orice obiect. De exemplu, executați dir(str) pentru
atributele clasei (șir)str.
Există, de asemenea, o funcție vars() care vă poate oferi atribute și valori, dar nu va
funcționa pentru toate cazurile.

Pachete
Până acum, trebuie să fi început să observați ierarhia organizării programelor.  Variabilele
intră, de obicei, în interiorul funcțiilor. Funcțiile și variabilele globale intră, de obicei, în
interiorul modulelor. Dacă ați fi vrut să organizați module? Aici intră pachetele în imagine.

Pachetele sunt doar dosare de module cu un fișier special  __init__.py care indică Python că
acest dosar este special deoarece conține module Python.
Să presupunem că doriți să creați un pachet numit "lume" cu subpachete "asia", "africa"
etc., iar aceste subpachete conțin, la rândul lor, module ca "India", "Madagascar" etc.

Acesta este modul în care veți structura folderele:


- <some folder present in the sys.path>/
- world/
- __init__.py
- asia/
- __init__.py
- india/
- __init__.py
A Byte of Python Module

- foo.py
- africa/
- __init__.py
- madagascar/
- __init__.py
- bar.py
Pachetele sunt doar o convenție pentru organizarea ierarhică a modulelor. Veți vedea
multe exemple de acest lucru în biblioteca standard  .

Rezumat
59 La fel cum funcțiile sunt părți reutilizabile ale programelor, modulele sunt programe
reutilizabile. Pachetele reprezintă o altă ierarhie pentru organizarea modulelor. Biblioteca
standard care vine cu Python este un exemplu de astfel de pachete și module.

Am văzut cum să folosim aceste module și să creăm module proprii.

În continuare, vom afla despre câteva concepte interesante numite structuri de date.
A Byte of Python Structuri de date

Structuri de date
Structurile de date sunt, în principiu, doar că sunt structuri care pot conține unele date
împreună. Cu alte cuvinte, ele sunt folosite pentru a stoca o colecție de date conexe.

Există patru structuri de date încorporate în Python - listă, tuplu, dicționar și set . Vom
vedea cum să folosim fiecare dintre ele și cum ne ușurează viața.

60 Listă
Structura list este o structură de date care deține o colecție ordonată de elemente, adică
puteți stoca o serie de elemente dintr-o listă. Acest lucru este ușor de imaginat dacă vă
puteți gândi la o listă de cumpărături în care aveți o listă de articole de cumpărat, cu
excepția faptului că probabil aveți fiecare articol pe o linie separată în lista dvs. de
cumpărături, în timp ce în Python puneți virgule între ele.
Lista articolelor trebuie să fie închisă în paranteze pătrate, astfel încât Python înțelege că
specificați o listă. Odată ce ați creat o listă, puteți să adăugați, să eliminați sau să căutați
elemente din listă. Din moment ce putem adăuga și elimina elemente, spunem că o listă
este un tip de date mutabil, adică acest tip poate fi modificat.

Introducere rapidă la obiecte și clase


Deși am întârziat în general discuția despre obiecte și clase până acum, este necesară o
mică explicație chiar acum, pentru a înțelege mai bine listele. Vom explora acest subiect
în detaliu într-un capitol ulterior .

O listă este un exemplu de utilizare a obiectelor și a claselor.  Atunci când folosim o


variabilă i îi și atribuim o valoare acesteia, să spunem 5 întreg , putem să ne gândim la ea
ca la crearea unui obiect (adică exemplu) i de clasă (adică tip) int. De fapt, puteți
citi help(int) pentru a înțelege mai bine acest lucru.
O clasă poate avea, de asemenea, metode, adică funcții definite pentru utilizare numai în
acea clasă. Puteți folosi aceste funcții doar atunci când aveți un obiect al clasei
respective. De exemplu, Python oferă o metodă append pentru clasă list, care vă permite să
adăugați un element la sfârșitul listei. De exemplu, mylist.append('an item') va adăuga acel șir
în lista mylist. Notați utilizarea notației punctate pentru accesarea metodelor obiectelor.
O clasă poate avea, de asemenea, câmpuri care nu sunt altceva decât variabile definite
pentru utilizare numai pentru acea clasă. Puteți utiliza aceste variabile / nume numai
atunci când aveți un obiect din acea clasă. Câmpurile sunt de asemenea accesate prin
notația punctată, de exemplu mylist.field,.

Exemplu (salvați ca ds_using_list.py):


# This is my shopping list
shoplist = ['apple', 'mango', 'carrot', 'banana']
print('I have', len(shoplist), 'items to purchase.')
print('These items are:', end=' ')
A Byte of Python Structuri de date

for item in shoplist:


print(item, end=' ')
print('\nI also have to buy rice.')
shoplist.append('rice')
print('My shopping list is now', shoplist)
print('I will sort my list now')
shoplist.sort()
print('Sorted shopping list is', shoplist)

61 print('The first item I will buy is', shoplist[0])


olditem = shoplist[0]
del shoplist[0]
print('I bought the', olditem)
print('My shopping list is now', shoplist)

ieşire:

$ python ds_using_list.py
I have 4 items to purchase.
These items are: apple mango carrot banana
I also have to buy rice.
My shopping list is now ['apple', 'mango', 'carrot', 'banana', 'rice']
I will sort my list now
Sorted shopping list is ['apple', 'banana', 'carrot', 'mango', 'rice']
The first item I will buy is apple
I bought the apple
My shopping list is now ['banana', 'carrot', 'mango', 'rice']

Cum funcționează

Variabila shoplist este o listă de cumpărături pentru cineva care merge pe piață. În shoplist,


stocăm doar șiruri de caractere ale numelor articolelor de cumpărat, dar puteți
adăuga orice fel de obiect la o listă care include numere și chiar și alte liste.
Am folosit, de asemenea, bucla for..in pentru a itera prin elementele din listă. Până acum,
trebuie să fi realizat că o listă este și o secvență. Specialitatea secvențelor va fi discutată
într-o secțiune ulterioară .
Observați că utilizarea parametrului end din apel să facă să funcționeze print pentru a
indica că dorim să terminăm ieșirea cu un spațiu în loc de ruperea obișnuită a liniei.
Apoi, adăugăm un element în listă utilizând metoda append obiectului listă, așa cum am
discutat deja. Apoi, verificăm dacă elementul a fost adăugat într-adevăr într-o listă prin
A Byte of Python Structuri de date

imprimarea conținutului listei prin simpla trecere a listei la funcția print care o imprimă cu
ușurință.
Apoi, sortăm lista utilizând metoda sort din listă. Este important să înțelegeți că această
metodă afectează lista în sine și nu returnează o listă modificată - aceasta este diferită de
modul în care lucrează șirurile. Aceasta este ceea ce înțelegem prin a spune că listele
sunt mutabile și că șirurile sunt imuabile .
Apoi, când încheiem cumpărarea unui element pe piață, dorim să îl eliminăm din
listă. Realizăm acest lucru utilizând declarația del. Aici, menționăm ce element al listei pe
care dorim să-l eliminăm și del instrucțiunea o elimină din listă pentru noi. Specificăm că
vrem să eliminăm primul element din listă și de aceea folosim del shoplist[0] (rețineți că
62 Python începe să numere de la 0).
Dacă doriți să cunoașteți toate metodele definite de obiectul de listă, consultați  detaliile
help(list) .

Tuplu
Tuplurile sunt folosite pentru a reține obiecte multiple. Gândiți-vă la ele ca fiind la fel de
asemănătoare cu listele, dar fără funcționalitatea extinsă pe care o oferă clasa de listă.  O
caracteristică majoră a tuplurilor este că ele sunt imuabile ca șiruri de caractere, adică nu
puteți modifica tuplurile.

Tuplurile sunt definite prin specificarea elementelor separate prin virgule într-o pereche
opțională de paranteze.

În mod obișnuit, căutările sunt folosite în cazurile în care o declarație sau o funcție
definită de utilizator poate presupune în siguranță că colecția de valori (adică tuplul
valorilor utilizate) nu se va schimba.

Exemplu (salvați ca ds_using_tuple.py):


# I would recommend always using parentheses
# to indicate start and end of tuple
# even though parentheses are optional.
# Explicit is better than implicit.
zoo = ('python', 'elephant', 'penguin')
print('Number of animals in the zoo is', len(zoo))

new_zoo = 'monkey', 'camel', zoo # parentheses not required but are a good idea
print('Number of cages in the new zoo is', len(new_zoo))
print('All animals in new zoo are', new_zoo)
print('Animals brought from old zoo are', new_zoo[2])
print('Last animal brought from old zoo is', new_zoo[2][2])
print('Number of animals in the new zoo is',
len(new_zoo)-1+len(new_zoo[2]))

ieşire:
A Byte of Python Structuri de date

$ python ds_using_tuple.py
Number of animals in the zoo is 3
Number of cages in the new zoo is 3
All animals in new zoo are ('monkey', 'camel', ('python', 'elephant', 'penguin'))
Animals brought from old zoo are ('python', 'elephant', 'penguin')
Last animal brought from old zoo is penguin
Number of animals in the new zoo is 5

63 Cum funcționează

Variabila zoo se referă la o mulțime de elemente. Vedem că funcția len poate fi folosită


pentru a obține lungimea tuplului. Acest lucru indică, de asemenea, că un tuplu este și
o secvență .
Acum deplasăm aceste animale într-o grădină zoologică nouă, deoarece vechea grădină
zoologică este închisă. Prin urmare, tuplul new_zoo conține câteva animale care sunt deja
acolo împreună cu animalele aduse din vechea grădină zoologică.  Înapoi la realitate,
rețineți că un tuplu într-un tuplu nu-și pierde identitatea.
Putem accesa elementele din trupă, specificând poziția elementului într-o pereche de
paranteze pătrate, la fel ca în cazul listelor. Acesta este numit operatorul
de indexare. Accesăm cel de-al treilea element new_zoo prin specificarea new_zoo[2] și
accesând al treilea element din cel de-al treilea element din new_zoo trupă,
specificând new_zoo[2][2]. Acest lucru este destul de simplu odată ce ați înțeles idiomul.
Tuple cu 0 sau 1 elemente

O un tuplu gol este construit de o pereche goală de paranteze cum ar fi myempty =


(). Totuși, un tuplu cu un singur element nu este atât de simplu. Trebuie să o specificați
folosind o virgulă care urmează primului (și numai) element astfel încât Python să poată
face diferența între un tuplu și o pereche de paranteze care înconjoară obiectul într-o
expresie adică trebuie să specificați singleton = (2 , )dacă vrei să spui că vrei un tuplu care
conține elementul 2.
Notă pentru programatorii Perl

O listă dintr-o listă nu-și pierde identitatea, adică listele nu sunt aplatizate ca în
Perl. Același lucru este valabil și pentru un tuplu dintr-un tuplu sau un tuplu dintr-o listă
sau o listă în cadrul unui tuplu etc. În ceea ce privește Python, ele sunt doar obiecte
stocate folosind un alt obiect, asta-i tot.

Dicţionar
Un dicționar este ca o agendă de adrese unde puteți găsi adresa sau datele de contact ale
unei persoane, cunoscând doar numele acesteia, adică asociem cheile(numele)
cu valorile (detalii). Rețineți că cheia trebuie să fie unică, așa cum nu puteți afla
informațiile corecte dacă aveți două persoane cu același nume.
A Byte of Python Structuri de date

Rețineți că puteți utiliza numai obiecte imuabile (ca șiruri de caractere) pentru cheile unui
dicționar, dar puteți utiliza obiecte imuabile sau mutabile pentru valorile
dicționarului. Acest lucru se traduce, în principiu, pentru a spune că ar trebui să utilizați
doar obiecte simple pentru chei.

Perechi de chei și valori sunt specificate într-un dicționar folosind notația  d = {key1 : value1,
key2 : value2 } . Observați că perechile cheie-valoare sunt separate de punct și virgulă și că
perechile sunt separate prin virgule și toate acestea sunt închise într-o pereche de
acolade.
Rețineți că perechile cheie-valoare dintr-un dicționar nu sunt ordonate în nici un fel.  Dacă
doriți o anumită comandă, atunci va trebui să le sortați înainte de a le folosi.
64
Dicționarele pe care le veți folosi sunt instanțe / obiecte ale clasei dict.

Exemplu (salvați ca ds_using_dict.py):


# 'ab' is short for 'a'ddress'b'ook

ab = {
'Swaroop': 'swaroop@swaroopch.com',
'Larry': 'larry@wall.org',
'Matsumoto': 'matz@ruby-lang.org',
'Spammer': 'spammer@hotmail.com'
}

print("Swaroop's address is", ab['Swaroop'])

# Deleting a key-value pair


del ab['Spammer']

print('\nThere are {} contacts in the address-book\n'.format(len(ab)))

for name, address in ab.items():


print('Contact {} at {}'.format(name, address))

# Adding a key-value pair


ab['Guido'] = 'guido@python.org'

if 'Guido' in ab:
print("\nGuido's address is", ab['Guido'])

ieşire:
$ python ds_using_dict.py
A Byte of Python Structuri de date

Swaroop's address is swaroop@swaroopch.com

There are 3 contacts in the address-book

Contact Swaroop at swaroop@swaroopch.com


Contact Matsumoto at matz@ruby-lang.org
Contact Larry at larry@wall.org

65 Guido's address is guido@python.org

Cum funcționează

Creăm dicționarul ab utilizând notația deja discutată. Apoi, accesăm perechile cheie-


valoare specificând cheia folosind operatorul de indexare așa cum este discutat în
contextul listelor și tuplurilor. Observați sintaxa simplă.
Putem șterge perechi cheie-valoare folosind vechiul nostru prieten – instrucțiunea del. Pur
și simplu specificăm dicționarul și operatorul de indexare pentru cheia care trebuie
îndepărtată și trecem la instrucțiunea del. Nu este nevoie să cunoașteți valoarea
corespunzătoare cheii pentru această operație.
Apoi, accesăm fiecare pereche cheie-valoare a dicționarului folosind  metoda items a
dicționarului care returnează o listă de tupluri unde fiecare tuplu conține o pereche de
elemente - cheia urmată de valoare. Obținem această pereche și îi atribuim
variabilelor name și, în mod corespunzător address, pentru fiecare pereche folosind bucla
for..in și apoi tipărim aceste valori în for-block.
Putem adăuga noi perechi de chei-valoare prin simpla utilizare a operatorului de indexare
pentru a accesa o cheie și a atribui acea valoare, așa cum am făcut-o pentru Guido în cazul
de mai sus.

Putem verifica dacă există o pereche cheie-valoare utilizând operatorul in.


Pentru lista metodelor din clasa dict, a se vedea help(dict).

Argumente și dicționare pentru cuvinte cheie

Dacă ați utilizat argumentele cuvintelor cheie în funcțiile dvs., ați folosit deja
dicționare! Gândește-te doar la asta - perechea cheie-valoare este specificată de tine în
lista de parametri a definiției funcției și atunci când accesezi variabilele în cadrul funcției
tale, este doar o accesare cheie a unui dicționar (care se numește  tabelul simbolului în
designul compilatorului terminologie).

Secvenţă
Liste, tuple și șiruri de caractere sunt exemple de secvențe, dar care sunt secvențele și
ceea ce este atât de special în privința lor?
A Byte of Python Structuri de date

Caracteristicile majore sunt testele de membru (adică expresiile inși not inexpresiile)


și operațiile de indexare , care ne permit să preluăm direct un anumit element în
secvență.
Cele trei tipuri de secvențe menționate mai sus - liste, tupluri și șiruri de caractere, au de
asemenea o operație de tăiere care ne permite să preluăm o felie a secvenței, adică o
parte a secvenței.

Exemplu (salvați ca ds_seq.py):


shoplist = ['apple', 'mango', 'carrot', 'banana']
name = 'swaroop'

66 # Indexing or 'Subscription' operation #


print('Item 0 is', shoplist[0])
print('Item 1 is', shoplist[1])
print('Item 2 is', shoplist[2])
print('Item 3 is', shoplist[3])
print('Item -1 is', shoplist[-1])
print('Item -2 is', shoplist[-2])
print('Character 0 is', name[0])

# Slicing on a list #
print('Item 1 to 3 is', shoplist[1:3])
print('Item 2 to end is', shoplist[2:])
print('Item 1 to -1 is', shoplist[1:-1])
print('Item start to end is', shoplist[:])

# Slicing on a string #
print('characters 1 to 3 is', name[1:3])
print('characters 2 to end is', name[2:])
print('characters 1 to -1 is', name[1:-1])
print('characters start to end is', name[:])
ieşire:
$ python ds_seq.py
Item 0 is apple
Item 1 is mango
Item 2 is carrot
Item 3 is banana
Item -1 is banana
Item -2 is carrot
Character 0 is s
Item 1 to 3 is ['mango', 'carrot']
Item 2 to end is ['carrot', 'banana']
Item 1 to -1 is ['mango', 'carrot']
Item start to end is ['apple', 'mango', 'carrot', 'banana']
characters 1 to 3 is wa
characters 2 to end is aroop
characters 1 to -1 is waroo
characters start to end is swaroop
Cum funcționează

În primul rând, vom vedea cum să folosim indexurile pentru a obține elemente individuale
dintr-o secvență. Aceasta este denumită și operația de abonament . Ori de câte ori
specificați un număr unei secvențe în paranteze pătrate așa cum se arată mai sus, Python
vă va prelua elementul corespunzător acelei poziții în secvență. Amintiți-vă că Python
A Byte of Python Structuri de date

începe numărarea numerelor de la 0. Prin urmare, shoplist[0]preia primul element


și shoplist[3]preia cel de-al patrulea element din shoplist secvență.
Indicele poate fi, de asemenea, un număr negativ, caz în care poziția se calculează de la
sfârșitul secvenței. Prin urmare, shoplist[-1]se referă la ultimul element din secvență
și shoplist[-2]preia ultimul al doilea element din secvență.
Operația de tăiere este utilizată specificând numele secvenței, urmată de o pereche
opțională de numere separate printr-un colon în paranteze drepte. Rețineți că aceasta
este foarte asemănătoare cu operația de indexare pe care ați utilizat-o până
acum. Amintiți-vă că numerele sunt opționale, dar nu este colonul.

Primul număr (înainte de colon) în operația de tăiere se referă la poziția de la care începe
67
slice-ul, iar al doilea număr (după colon) indică unde se va opri slice-ul.  Dacă primul
număr nu este specificat, Python va începe la începutul secvenței. Dacă al doilea număr
este lăsat afară, Python se va opri la sfârșitul secvenței. Rețineți că partea
întoarsă pornește în poziția inițială și se va termina chiar înainte de poziția finală , adică se
include poziția de pornire, dar poziția finală este exclusă de la secțiunea de secvență.

Astfel, shoplist[1:3]se întoarce o felie a secvenței începând din poziția 1, include poziția 2,


dar se oprește la poziția 3 și, prin urmare, se întoarce o bucată de două elemente. În mod
similar, shoplist[:]returnează o copie a întregii secvențe.
Poți de asemenea să faci felii cu poziții negative. Numerele negative sunt utilizate pentru
pozițiile de la sfârșitul secvenței. De exemplu, shoplist[:-1]vom returna o felie a secvenței
care exclude ultimul element al secvenței, dar conține totul.
De asemenea, puteți oferi un al treilea argument pentru felie, care este  pasul pentru
decupare (în mod prestabilit, mărimea pasului este 1):
>>> shoplist = ['apple', 'mango', 'carrot', 'banana']
>>> shoplist[::1]
['apple', 'mango', 'carrot', 'banana']
>>> shoplist[::2]
['apple', 'carrot']
>>> shoplist[::3]
['apple', 'banana']
>>> shoplist[::-1]
['banana', 'carrot', 'mango', 'apple']
Observați că atunci când pasul este 2, obținem elementele cu poziția 0, 2, ... Când
dimensiunea pasului este de 3, obținem elementele cu poziția 0, 3 etc.

Încercați diverse combinații de astfel de specificații pentru slice folosind interpretul


Python interactiv, adică promptul, astfel încât să puteți vedea imediat rezultatele. Lucru
minunat despre secvențe este că puteți accesa, în același fel, tupluri, liste și șiruri de
caractere!

A stabilit
Seturile sunt colecții neordonate de obiecte simple. Acestea sunt folosite atunci când
existența unui obiect dintr-o colecție este mai importantă decât ordinea sau de câte ori
apare.
A Byte of Python Structuri de date

Folosind seturi, puteți testa pentru apartenență, indiferent dacă este vorba de un subset
al altui set, găsiți intersecția dintre două seturi și așa mai departe.
>>> bri = set(['brazil', 'russia', 'india'])
>>> 'india' in bri
True
>>> 'usa' in bri
False
>>> bric = bri.copy()
>>> bric.add('china')
>>> bric.issuperset(bri)
True
68 >>> bri.remove('russia')
>>> bri & bric # OR bri.intersection(bric)
{'brazil', 'india'}
Cum funcționează

Dacă vă amintiți matematica bazată pe teoria seturilor de la școală, atunci acest exemplu
este destul de explicativ. Dar dacă nu, puteți face Google "teoria seturilor" și "diagrama
Venn" pentru a înțelege mai bine utilizarea seturilor în Python.

Referințe
Când creați un obiect și îl atribuiți unei variabile, variabila se referă numai la obiect și nu
reprezintă obiectul însuși! Aceasta înseamnă că numele variabilei indică acea parte a
memoriei computerului în care este stocat obiectul. Aceasta se numește legarea numelui
de obiect.

În general, nu trebuie să vă îngrijorați, dar există un efect subtil datorită referințelor pe


care trebuie să le cunoașteți:

Exemplu (salvați ca ds_reference.py):


print('Simple Assignment')
shoplist = ['apple', 'mango', 'carrot', 'banana']
# mylist is just another name pointing to the same object!
mylist = shoplist

# I purchased the first item, so I remove it from the list


del shoplist[0]

print('shoplist is', shoplist)


print('mylist is', mylist)
# Notice that both shoplist and mylist both print
# the same list without the 'apple' confirming that
# they point to the same object

print('Copy by making a full slice')


# Make a copy by doing a full slice
mylist = shoplist[:]
# Remove first item
del mylist[0]

print('shoplist is', shoplist)


print('mylist is', mylist)
A Byte of Python Structuri de date

# Notice that now the two lists are different


ieşire:
$ python ds_reference.py
Simple Assignment
shoplist is ['mango', 'carrot', 'banana']
mylist is ['mango', 'carrot', 'banana']
Copy by making a full slice
shoplist is ['mango', 'carrot', 'banana']
mylist is ['carrot', 'banana']
Cum funcționează

69 Majoritatea explicațiilor sunt disponibile în comentarii.


Rețineți că dacă doriți să faceți o copie a unei liste sau a unor astfel de secvențe sau
obiecte complexe (nu obiecte simple cum ar fi numere întregi), atunci trebuie să utilizați
operația de decupare pentru a face o copie. Dacă doar atribuiți numele variabilei unui alt
nume, ambele vor "referi" la același obiect și acest lucru ar putea fi dificil dacă nu sunteți
atent.

Notă pentru programatorii Perl

Rețineți că o instrucțiune de atribuire pentru liste nu creează o copie. Trebuie să utilizați


operația de tăiere pentru a face o copie a secvenței.

Mai multe despre șir


Am discutat deja în detaliu șirurile în detaliu mai devreme. Ce mai poate fi să știți? Știați
că șirurile sunt, de asemenea, obiecte și au metode care fac totul, de la verificarea unei
părți a unui șir la spațiile de delimitare? De fapt, ați folosit deja o metodă de șir ...
metoda format!
Șirurile pe care le folosiți în programe sunt toate obiectele din clasă str. Unele metode
utile din această clasă sunt demonstrate în următorul exemplu. Pentru o listă completă a
acestor metode, a se vedea help(str).

Exemplu (salvați ca ds_str_methods.py):


# This is a string object
name = 'Swaroop'

if name.startswith('Swa'):
print('Yes, the string starts with "Swa"')

if 'a' in name:
print('Yes, it contains the string "a"')

if name.find('war') != -1:
print('Yes, it contains the string "war"')

delimiter = '_*_'
mylist = ['Brazil', 'Russia', 'India', 'China']
print(delimiter.join(mylist))
ieşire:
A Byte of Python Structuri de date

$ python ds_str_methods.py
Yes, the string starts with "Swa"
Yes, it contains the string "a"
Yes, it contains the string "war"
Brazil_*_Russia_*_India_*_China
Cum functioneaza

Aici vedem o mulțime de metode de șir în acțiune. startswithMetoda este folosită pentru a


afla dacă șirul începe cu șirul dat. inOperatorul este utilizat pentru a verifica dacă un șir
dat este o parte din șirul.
findMetoda este utilizată pentru a localiza poziția subșirul dată în șir; findreturnează -1
70 dacă nu reușește să găsească substringul. strClasa are , de asemenea , o metodă elegant
pentru joinelementele dintr - o secvență cu care acționează șir ca delimitator între fiecare
element al secvenței și returnează un șir mai mare generat de aceasta.

rezumat
Am explorat în detaliu diferitele structuri de date construite din Python.  Aceste structuri
de date vor fi esențiale pentru scrierea de programe de dimensiuni rezonabile.

Acum că avem multe dintre elementele de bază ale Python, vom vedea în continuare cum
să proiectăm și să scriem un program Python în lumea reală.
A Byte of Python Rezolvarea problemelor

# Rezolvarea problemelor

Am explorat diferite părți ale limbajului Python și acum ne vom uita la modul în care toate
aceste părți se potrivesc împreună, prin proiectarea și scrierea unui program
care face ceva util. Ideea este să învățați cum să scrieți un script Python pe cont propriu.

Problema

Problema pe care vrem să o rezolvăm este:

71 Vreau un program care să creeze o copie de siguranță a tuturor fișierelor mele


importante.

Deși este o problemă simplă, nu avem suficiente informații pentru a începe


soluția. Este necesară o analiză mai detaliată . De exemplu, cum să specificăm ce fișiere
trebuie să fie salvate? Cum sunt stocate? Unde sunt depozitate?

După analizarea corectă a problemei, proiectăm programul nostru. Facem o listă de


lucruri despre cum ar trebui să funcționeze programul nostru. În acest caz, am creat
următoarea listă cu privire la modul eu vreau să lucrez. Dacă faceți acest design, este
posibil să nu faceți același tip de analiză, deoarece fiecare persoană are propriul mod de a
face lucrurile, deci este perfect bine.

 Fișierele și directoarele care trebuie copiate în siguranță sunt specificate într-o


listă.
 Backup-ul trebuie să fie stocat într-un director principal de backup.
 Fișierele sunt susținute într-un fișier zip.
 Numele arhivei zip este data și ora curente.
 Utilizăm comanda  zip standard disponibilă în mod implicit în orice distribuție
standard GNU / Linux sau Unix. Rețineți că puteți utiliza orice comandă de arhivare
pe care o doriți, atâta timp cât are o interfață de linie de comandă.

Soluția

Deoarece proiectarea programului nostru este acum rezonabil stabilă, putem scrie codul
care este o implementare a soluției noastre.

Salvați ca backup_ver1.py:

import os
import time

# 1. The files and directories to be backed up are


# specified in a list.
# Example on Windows:
A Byte of Python Rezolvarea problemelor

# source = ['"C:\\My Documents"']


# Example on Mac OS X and Linux:
source = ['/Users/swa/notes']
# Notice we have to use double quotes inside a string
# for names with spaces in it. We could have also used
# a raw string by writing [r'C:\My Documents'].

72 # 2. The backup must be stored in a

# main backup directory


# Example on Windows:
# target_dir = 'E:\\Backup'
# Example on Mac OS X and Linux:
target_dir = '/Users/swa/backup'
# Remember to change this to which folder you will be using

# 3. The files are backed up into a zip file.


# 4. The name of the zip archive is the current date and time
target = target_dir + os.sep + \
time.strftime('%Y%m%d%H%M%S') + '.zip'

# Create target directory if it is not present


if not os.path.exists(target_dir):
os.mkdir(target_dir) # make directory

# 5. We use the zip command to put the files in a zip archive


zip_command = 'zip -r {0} {1}'.format(target,
' '.join(source))

# Run the backup


print('Zip command is:')
print(zip_command)
print('Running:')
A Byte of Python Rezolvarea problemelor

if os.system(zip_command) == 0:
print('Successful backup to', target)
else:
print('Backup FAILED')
ieşire:
$ python backup_ver1.py
Zip command is:
73 zip -r /Users/swa/backup/20140328084844.zip /Users/swa/notes

Running:
adding: Users/swa/notes/ (stored 0%)
adding: Users/swa/notes/blah1.txt (stored 0%)
adding: Users/swa/notes/blah2.txt (stored 0%)
adding: Users/swa/notes/blah3.txt (stored 0%)
Successful backup to /Users/swa/backup/20140328084844.zip

Acum, ne aflăm în faza de testare în care testăm că programul nostru funcționează


corect. Dacă nu se comportă așa cum era de așteptat, atunci trebuie
să debugăm programul nostru, adică să eliminăm bug - urile (erorile) din program.

Dacă programul de mai sus nu funcționează pentru dvs., copiați linia imprimată după  Zip
command islinie în ieșire, lipiți-o în coajă (pe GNU / Linux și Mac OS X) /  cmd(pe
Windows), vedeți ce este eroarea și încercați repara-l. Verificați, de asemenea, manualul
de comandă a zipului cu privire la ceea ce ar putea fi greșit. Dacă această comandă
reușește, atunci problema ar putea fi în programul Python în sine, deci verificați dacă se
potrivește exact cu programul scris mai sus.

Cum functioneaza

Veți observa modul în care am transformat designul în cod într-o manieră pas cu pas.

Folosim modulele osși timemodulele le importăm mai întâi. Apoi, specificăm fișierele și


directoarele care vor fi salvate în sourcelistă. Directorul țintă este locul în care stocăm
toate fișierele de rezervă și acest lucru este specificat în target_dirvariabilă. Numele
arhivei zip pe care o vom crea este data și ora curente pe care le generăm
utilizând time.strftime()funcția. De asemenea, va avea .zipextensia și va fi stocată
în target_dirdirector.

Observați utilizarea os.sepvariabilei - aceasta oferă separatorul de directoare în funcție de


sistemul dvs. de operare, adică va fi '/'în GNU / Linux, Unix, MacOS și va fi '\\'în
Windows. Utilizarea os.sepîn loc de aceste caractere direct va face programul nostru
portabil și de lucru în toate aceste sisteme.
A Byte of Python Rezolvarea problemelor

time.strftime()Funcția are o specificație , cum ar fi cel care le - am folosit în programul


de mai sus. %YCaietul de sarcini va fi înlocuit cu anul cu secolul. %mCaietul de sarcini va fi
înlocuită cu luna ca număr zecimal între 01și 12și așa mai departe. Lista completă a
acestor specificații poate fi găsită în Manualul de Referință Python  .

Creăm numele fișierului țintă zip folosind operatorul de adunare care concatează șirurile,


adică se alătură celor două șiruri împreună și returnează unul nou.  Apoi, vom crea un
șir zip_commandcare conține comanda pe care o vom executa. Puteți verifica dacă
această comandă funcționează pornind-o în shell (terminalul GNU / Linux sau promptul
DOS).
74
zipComanda pe care le folosim are unele opțiuni disponibile, iar una dintre aceste opțiuni
este -r. -rSpecifică faptul că comanda zip ar trebui să funcționeze  r ecursively pentru
directoare, adică ar trebui să includă toate subdirectoarele și fișierele. Opțiunile sunt
urmate de numele arhivei zip pentru a crea, urmată de lista fișierelor și directoarelor de
rezervă. Convertim sourcelista într-un șir folosind joinmetoda de șiruri pe care am văzut
deja cum să o folosim.

Apoi, în cele din urmă vom rula comanda folosind os.systemfuncția care se execută


comanda ca acesta ar fi executat din sistem , adică în coajă - returnează în 0cazul în
care comanda a fost cu succes, altfel returnează un număr de eroare.

În funcție de rezultatul comenzii, imprimați mesajul potrivit că backupul a eșuat sau a


reușit.

Asta e, am creat un script pentru a face o copie de siguranță a fișierelor noastre


importante!

Notă pentru utilizatorii Windows

În loc de secvențe de evacuare duble înapoi, puteți utiliza, de asemenea, șiruri brute.  De
exemplu, utilizați 'C:\\Documents'sau r'C:\Documents'. Cu toate
acestea, nu utilizați 'C:\Documents'deoarece ați terminat folosind o secvență de evacuare
necunoscută \D.

Acum, că avem un script de salvare de rezervă, îl putem folosi ori de câte ori dorim să
facem o copie de rezervă a fișierelor. Aceasta se numește faza de operare sau faza
de implementare a software-ului.

Programul de mai sus funcționează corect, dar (de obicei) primele programe nu
funcționează exact așa cum vă așteptați. De exemplu, s-ar putea să existe probleme dacă
nu ați proiectat corect programul sau dacă ați făcut o greșeală atunci când tastați codul
etc. În mod corespunzător, va trebui să reveniți la faza de proiectare sau va trebui să
depanați programul.

A doua versiune
A Byte of Python Rezolvarea problemelor

Prima versiune a scenariului nostru funcționează. Cu toate acestea, putem face unele
rafinări pentru a-l, astfel încât să poată funcționa mai bine zilnic. Aceasta se numește faza
de întreținere a software-ului.

Unul dintre îmbunătățirile pe care le-am simțit era util este un mecanism mai bun de
denumire a fișierelor - folosind timpul ca numele fișierului într-un director
cu data curentă ca un director din directorul principal de backup. Primul avantaj este că
backup-urile sunt stocate într-o manieră ierarhică și, prin urmare, este mult mai ușor de
gestionat. Al doilea avantaj este că numele de fișiere sunt mult mai scurte. Al treilea
avantaj este că directoarele separate vă vor ajuta să verificați dacă ați făcut o copie de
75 rezervă pentru fiecare zi de când directorul va fi creat numai dacă ați făcut o copie de
rezervă pentru acea zi.

Salvați ca backup_ver2.py:

import os

import time

# 1. The files and directories to be backed up are

# specified in a list.

# Example on Windows:

# source = ['"C:\\My Documents"', 'C:\\Code']

# Example on Mac OS X and Linux:

source = ['/Users/swa/notes']

# Notice we had to use double quotes inside the string

# for names with spaces in it.

# 2. The backup must be stored in a

# main backup directory

# Example on Windows:

# target_dir = 'E:\\Backup'

# Example on Mac OS X and Linux:


A Byte of Python Rezolvarea problemelor

target_dir = '/Users/swa/backup'

# Remember to change this to which folder you will be using

# Create target directory if it is not present

if not os.path.exists(target_dir):

os.mkdir(target_dir) # make directory


76

# 3. The files are backed up into a zip file.

# 4. The current day is the name of the subdirectory

# in the main directory.

today = target_dir + os.sep + time.strftime('%Y%m%d')

# The current time is the name of the zip archive.

now = time.strftime('%H%M%S')

# The name of the zip file

target = today + os.sep + now + '.zip'

# Create the subdirectory if it isn't already there

if not os.path.exists(today):

os.mkdir(today)

print('Successfully created directory', today)

# 5. We use the zip command to put the files in a zip archive

zip_command = 'zip -r {0} {1}'.format(target,


A Byte of Python Rezolvarea problemelor

' '.join(source))

# Run the backup

print('Zip command is:')

print(zip_command)

77 print('Running:')
if os.system(zip_command) == 0:

print('Successful backup to', target)

else:

print('Backup FAILED')

ieşire:

$ python backup_ver2.py

Successfully created directory /Users/swa/backup/20140329

Zip command is:

zip -r /Users/swa/backup/20140329/073201.zip /Users/swa/notes

Running:

adding: Users/swa/notes/ (stored 0%)

adding: Users/swa/notes/blah1.txt (stored 0%)

adding: Users/swa/notes/blah2.txt (stored 0%)

adding: Users/swa/notes/blah3.txt (stored 0%)

Successful backup to /Users/swa/backup/20140329/073201.zip

Cum functioneaza

Majoritatea programelor rămân aceleași. Modificările constau în faptul că verificăm dacă


există un director cu ziua curentă ca nume în directorul principal de rezervă
utilizând os.path.existsfuncția. Dacă nu există, o creăm folosind os.mkdirfuncția.
A Byte of Python Rezolvarea problemelor

A treia versiune

Cea de-a doua versiune funcționează bine atunci când fac multe backup-uri, dar când
există o mulțime de copii de siguranță, mi se pare greu să diferențiez ce au făcut backup-
urile! De exemplu, s-ar fi putut face unele modificări majore la un program sau o
prezentare, apoi vreau să asociez ce sunt aceste schimbări cu numele arhivei zip.  Acest
lucru poate fi ușor realizat prin atașarea unui comentariu furnizat de utilizator la numele
arhivei zip.

AVERTISMENT: Următorul program nu funcționează, așa că nu fi alarmat, vă rog să urmați,


78 deoarece există o lecție aici.

Salvați ca backup_ver3.py:

import os

import time

# 1. The files and directories to be backed up are

# specified in a list.

# Example on Windows:

# source = ['"C:\\My Documents"', 'C:\\Code']

# Example on Mac OS X and Linux:

source = ['/Users/swa/notes']

# Notice we had to use double quotes inside the string

# for names with spaces in it.

# 2. The backup must be stored in a

# main backup directory

# Example on Windows:

# target_dir = 'E:\\Backup'

# Example on Mac OS X and Linux:


A Byte of Python Rezolvarea problemelor

target_dir = '/Users/swa/backup'

# Remember to change this to which folder you will be using

# Create target directory if it is not present

if not os.path.exists(target_dir):

os.mkdir(target_dir) # make directory


79

# 3. The files are backed up into a zip file.

# 4. The current day is the name of the subdirectory

# in the main directory.

today = target_dir + os.sep + time.strftime('%Y%m%d')

# The current time is the name of the zip archive.

now = time.strftime('%H%M%S')

# Take a comment from the user to

# create the name of the zip file

comment = input('Enter a comment --> ')

# Check if a comment was entered

if len(comment) == 0:

target = today + os.sep + now + '.zip'

else:

target = today + os.sep + now + '_' +

comment.replace(' ', '_') + '.zip'


A Byte of Python Rezolvarea problemelor

# Create the subdirectory if it isn't already there

if not os.path.exists(today):

os.mkdir(today)

print('Successfully created directory', today)

80 # 5. We use the zip command to put the files in a zip archive


zip_command = "zip -r {0} {1}".format(target,

' '.join(source))

# Run the backup

print('Zip command is:')

print(zip_command)

print('Running:')

if os.system(zip_command) == 0:

print('Successful backup to', target)

else:

print('Backup FAILED')

ieşire:

$ python backup_ver3.py

File "backup_ver3.py", line 39

target = today + os.sep + now + '_' +

SyntaxError: invalid syntax

Cum funcționează acest lucru (nu)


A Byte of Python Rezolvarea problemelor

Acest program nu funcționează!  Python spune că există o eroare de sintaxă care


înseamnă că scriptul nu satisface structura pe care Python se așteaptă să o vadă.  Când
observăm eroarea dată de Python, ea ne spune și locul în care a detectat eroarea.  Așa că
începem să debugăm programul nostru de pe acea linie.

O observație atentă vedem că linia logică unică a fost împărțită în două linii fizice, dar nu
am specificat că aceste două linii fizice aparțin împreună. Practic, Python a găsit
operatorul de adăugare ( +) fără nici un operand în acea linie logică și, prin urmare, nu știe
cum să continue. Amintiți-vă că putem preciza că linia logică continuă în următoarea linie
fizică prin folosirea unei lunete din urmă la sfârșitul liniei fizice.  Deci, facem această
81 corecție programului nostru. Această corecție a programului când găsim erori se
numește fixarea erorilor .

A patra versiune

Salvați ca backup_ver4.py:

import os

import time

# 1. The files and directories to be backed up are

# specified in a list.

# Example on Windows:

# source = ['"C:\\My Documents"', 'C:\\Code']

# Example on Mac OS X and Linux:

source = ['/Users/swa/notes']

# Notice we had to use double quotes inside the string

# for names with spaces in it.

# 2. The backup must be stored in a

# main backup directory

# Example on Windows:

# target_dir = 'E:\\Backup'
A Byte of Python Rezolvarea problemelor

# Example on Mac OS X and Linux:

target_dir = '/Users/swa/backup'

# Remember to change this to which folder you will be using

# Create target directory if it is not present

82 if not os.path.exists(target_dir):
os.mkdir(target_dir) # make directory

# 3. The files are backed up into a zip file.

# 4. The current day is the name of the subdirectory

# in the main directory.

today = target_dir + os.sep + time.strftime('%Y%m%d')

# The current time is the name of the zip archive.

now = time.strftime('%H%M%S')

# Take a comment from the user to

# create the name of the zip file

comment = input('Enter a comment --> ')

# Check if a comment was entered

if len(comment) == 0:

target = today + os.sep + now + '.zip'

else:

target = today + os.sep + now + '_' + \

comment.replace(' ', '_') + '.zip'


A Byte of Python Rezolvarea problemelor

# Create the subdirectory if it isn't already there

if not os.path.exists(today):

os.mkdir(today)

print('Successfully created directory', today)

83
# 5. We use the zip command to put the files in a zip archive

zip_command = 'zip -r {0} {1}'.format(target,

' '.join(source))

# Run the backup

print('Zip command is:')

print(zip_command)

print('Running:')

if os.system(zip_command) == 0:

print('Successful backup to', target)

else:

print('Backup FAILED')

ieşire:

$ python backup_ver4.py

Enter a comment --> added new examples

Zip command is:

zip -r /Users/swa/backup/20140329/074122_added_new_examples.zip /Users/swa/notes

Running:
A Byte of Python Rezolvarea problemelor

adding: Users/swa/notes/ (stored 0%)

adding: Users/swa/notes/blah1.txt (stored 0%)

adding: Users/swa/notes/blah2.txt (stored 0%)

adding: Users/swa/notes/blah3.txt (stored 0%)

Successful backup to /Users/swa/backup/20140329/074122_added_new_examples.zip

84 Cum functioneaza
Acest program funcționează acum! Să trecem prin îmbunătățirile reale pe care le-am făcut
în versiunea 3. Noi luăm în considerare comentariile utilizatorului folosind  inputfuncția și
apoi verificăm dacă utilizatorul a introdus de fapt ceva prin aflarea lungimii intrării
utilizând lenfuncția. Dacă utilizatorul tocmai a apăsat enterfără să introducă nimic (poate
că a fost doar o copie de rezervă de rutină sau nu au fost făcute schimbări speciale),
atunci procedăm așa cum am făcut înainte.

Cu toate acestea, dacă a fost furnizat un comentariu, atunci acesta este atașat la numele
arhivei zip chiar înainte de .zipextensie. Observați că înlocuim spațiile din comentariu cu
sublinierile - aceasta este pentru că gestionarea numelor de fișiere fără spații este mult
mai ușoară.

Mai multe îmbunătățiri

A patra versiune este un script de lucru satisfăcător pentru majoritatea utilizatorilor, dar
există întotdeauna loc pentru îmbunătățire. De exemplu, puteți include un nivel
de verbositate pentru comanda zip prin specificarea unei -vopțiuni pentru a face
programul dvs. să devină mai vorbăreț sau o -qopțiune pentru a face liniște .

O altă posibilitate de îmbunătățire ar fi să permiteți trimiterea de fișiere și directoare


suplimentare la scriptul de la linia de comandă. Putem obține aceste nume
din sys.argvlistă și le putem adăuga pe sourcelista noastră folosind extendmetoda oferită
de listclasă.

Cea mai importantă rafinare ar fi să nu folosiți os.systemmodul de creare a arhivelor și, în


schimb, să utilizați modulele built-in zipfile sau tarfile pentru a crea aceste arhive. Acestea
fac parte din biblioteca standard și sunt disponibile deja pentru a putea fi utilizate fără
dependențe externe din programul zip pentru a fi disponibile pe computer.

Cu toate acestea, am folosit os.systemmodul de a crea o copie de rezervă în exemplele de


mai sus pur și simplu în scopuri pedagogice, astfel încât exemplul este suficient de simplu
pentru a fi înțeles de toată lumea, dar suficient de real pentru a fi util.

Puteți încerca să scrieți a cincea versiune care folosește  modulul zipfile în loc


de os.systemapel?
A Byte of Python Rezolvarea problemelor

Procesul de dezvoltare software

Am trecut prin diferitele etape ale procesului de scriere a unui software. Aceste faze pot fi


rezumate după cum urmează:

1. Ce (analiză)
2. Cum (Design)
3. Face-o (punerea în aplicare)
4. Testarea (testarea și depanarea)
5. Utilizare (operare sau desfășurare)
85 6. Mențineți (perfecționarea)

O modalitate recomandată de scriere a programelor este procedura pe care am urmat-o


în crearea scriptului de backup: Faceți analiza și designul. Începeți implementarea cu o
versiune simplă. Testați și depanați-l. Utilizați-l pentru a vă asigura că funcționează
conform așteptărilor. Acum, adăugați toate caracteristicile pe care le doriți și continuați să
repetați ciclul Do It-Test-Use de câte ori este necesar.

Tine minte:

Software-ul este cultivat, nu construit. - Bill de hóra

rezumat

Am văzut cum să creați propriile noastre programe / scenarii Python și diferitele etape
implicate în scrierea unor astfel de programe. S-ar putea să fiți util să vă creați propriul
program, așa cum am făcut în acest capitol, pentru a vă familiariza cu Python, precum și
pentru rezolvarea problemelor.

Apoi, vom discuta despre programarea orientată pe obiecte.


A Byte of Python Rezolvarea problemelor

86
A Byte of Python Programarea orientată pe obiecte

Programarea orientată pe obiecte

În toate programele pe care le-am scris până acum, am proiectat programul nostru în
jurul funcțiilor, adică blocuri de declarații care manipulează date.  Aceasta se
numește procedură orientată spre programare. Există și o altă modalitate de organizare a
programului dvs., care este de a combina datele și funcționalitatea și a le înfășura în
interiorul unui element numit un obiect. Aceasta se numește paradigma de
programare orientată obiect . De cele mai multe ori puteți utiliza programarea
procedurală, dar când scrieți programe mari sau aveți o problemă mai potrivită acestei
metode, puteți utiliza tehnici de programare orientate obiect.
87
Clasele și obiectele sunt cele două aspecte principale ale programării orientate
obiect. O clasă creează un tip nou unde obiectele sunt instanțe ale clasei. O analogie este
că puteți avea variabile de tip intcare se traduce prin a spune că variabilele care stochează
numere întregi sunt variabile care sunt instanțe (obiecte) ale intclasei.

Notă pentru Programatorii de limbi statice

Rețineți că chiar și numerele întregi sunt tratate ca obiecte (din  intclasă). Acest lucru este
diferit de C ++ și Java (înainte de versiunea 1.5) unde întregi sunt tipuri primitive
primitive.

Consultați help(int)mai multe detalii despre clasă.

Programatorii C # și Java 1.5 vor găsi acest lucru similar cu conceptul de box și unboxing .

Obiectele pot stoca date folosind variabile obișnuite care aparțin obiectului. Variabilele


care aparțin unui obiect sau unei clase sunt denumite câmpuri . Obiectele pot avea
funcționalitate și prin utilizarea funcțiilor care aparțin unei clase. Astfel de funcții sunt
numite metode ale clasei. Această terminologie este importantă deoarece ne ajută să
facem diferența între funcții și variabile care sunt independente și cele care aparțin unei
clase sau unui obiect. În mod colectiv, câmpurile și metodele pot fi denumite atribute ale
clasei respective.

Câmpurile sunt de două tipuri - pot aparține fiecărui exemplu / obiect al clasei sau pot
aparține clasei în sine. Acestea se numesc variabile de instanță și respectiv variabile de
clasă .

Se creează o clasă utilizând classcuvântul cheie. Câmpurile și metodele din clasă sunt


listate într-un bloc indentat.

self

Metodele de clasă au o singură diferență specifică față de funcțiile obișnuite - acestea


trebuie să aibă un prim nume suplimentar care trebuie adăugat la începutul listei de
parametri, dar nu dați o valoare pentru acest parametru atunci când apelați metoda,
Python va furniza aceasta. Această variabilă specifică se referă la obiectul însuși și, prin
convenție, îi este dată numele self.
A Byte of Python Programarea orientată pe obiecte

Deși puteți da orice nume pentru acest parametru, este foarte recomandat să folosiți
numele self- orice alt nume este cu siguranta încruntat. Există numeroase avantaje pentru
utilizarea unui nume standard - orice cititor al programului dvs. o va recunoaște imediat și
chiar IDE-urile specializate (medii integrate de dezvoltare) vă pot ajuta dacă utilizați  self.

Notă pentru programatori C ++ / Java / C #

selfÎn Python este echivalent cu thisindicatorul în C ++ și thistrimiterea în Java și C #.

Trebuie să vă întrebați cum îi dă Python valoarea selfși de ce nu aveți nevoie să oferiți o


88 valoare pentru ea. Un exemplu va face acest lucru clar. Spuneți că aveți o clasă
numită MyClassși o instanță a acestei clase numită myobject. Când apelați o metodă a
acestui obiect ca myobject.method(arg1, arg2)aceasta, aceasta este convertită în mod
automat de Python în MyClass.method(myobject, arg1, arg2)- acesta este tot
ce selfeste special .

Acest lucru înseamnă, de asemenea, că, dacă aveți o metodă care nu are argumente,
trebuie să aveți încă un argument - self.

Clase

Cea mai simplă clasă posibilă este prezentată în exemplul următor (salvând
ca oop_simplestclass.py).

class Person:

pass # An empty block

p = Person()

print(p)

ieşire:

$ python oop_simplestclass.py

<__main__.Person instance at 0x10171f518>

Cum functioneaza

Creați o nouă clasă utilizând classinstrucțiunea și numele clasei. Acesta este urmat de un


bloc de declarații care formează corpul clasei. În acest caz, avem un bloc gol care este
indicat folosind passinstrucțiunea.

Apoi, vom crea un obiect / instanță din această clasă utilizând numele clasei urmat de o
pereche de paranteze. (Vom afla mai multe despre instanțiere  în secțiunea
A Byte of Python Programarea orientată pe obiecte

următoare). Pentru verificarea noastră, confirmăm tipul de variabilă prin simpla


imprimare. Aceasta ne spune că avem un exemplu de Personclasă în __main__modul.

Observați că este imprimată și adresa memoriei computerului în care este stocat


obiectul. Adresa va avea o valoare diferită pe computerul dvs., deoarece Python poate
stoca obiectul oriunde găsește spațiu.

metode

Am discutat deja că clasele / obiectele pot avea metode la fel ca și funcțiile, cu excepția
89 faptului că avem o selfvariabilă suplimentară . Vom vedea acum un exemplu (cu excepția
ca oop_method.py).

class Person:

def say_hi(self):

print('Hello, how are you?')

p = Person()

p.say_hi()

# The previous 2 lines can also be written as

# Person().say_hi()

ieşire:

$ python oop_method.py

Hello, how are you?

Cum functioneaza

Aici vedem selfacțiunea. Observați că say_himetoda nu ia parametri, dar are


încă selfdefiniția funcției.

__init__metoda

Există multe nume de metode care au o semnificație specială în clasele Python. Vom


vedea semnificația __init__metodei acum.

__init__Metoda este rulat de îndată ce un obiect al unei clase este instantiat ( de  exemplu
, create). Metoda este utilă pentru a face orice inițializare (adică trecerea valorilor inițiale
A Byte of Python Programarea orientată pe obiecte

în obiectul dvs.) pe care doriți să o faceți cu obiectul dvs. Observați dublul subliniere atât
la începutul, cât și la sfârșitul numelui.

Exemplu (salvați ca oop_init.py):

class Person:

def __init__(self, name):

self.name = name
90

def say_hi(self):

print('Hello, my name is', self.name)

p = Person('Swaroop')

p.say_hi()

# The previous 2 lines can also be written as

# Person().say_hi()

ieşire:

$ python oop_init.py

Hello, my name is Swaroop

Cum functioneaza

Aici, definim __init__metoda ca luând un parametru name(împreună cu cel


obișnuit self). Aici, noi creăm doar un câmp nou numit și el name. Observați că acestea
sunt două variabile diferite, chiar dacă ambele sunt numite "nume".  Nu există nici o
problemă deoarece notația punctată self.nameînseamnă că există ceva numit "nume"
care face parte din obiectul numit "sine", iar celălalt nameeste o variabilă locală. Dat fiind
faptul că indicăm în mod explicit numele la care ne referim, nu există confuzie.

La crearea unei instanțe noi p, a clasei Person, facem acest lucru folosind numele clasei
urmat de argumentele din paranteze: p = Persoană ("Swaroop").

Nu numim în mod explicit __init__metoda. Aceasta este semnificația deosebită a acestei


metode.
A Byte of Python Programarea orientată pe obiecte

Acum, putem folosi self.namecâmpul în metodele noastre, care este demonstrat


în say_himetodă.

Variabile de clasă și obiect

Am discutat deja despre funcționalitatea clasei și a obiectelor (adică metodele), acum să


învățăm despre partea de date. Partea de date, adică câmpurile, nu sunt decât variabile
ordinare care sunt legate de spațiile de nume ale clasei și obiectelor. Aceasta înseamnă că
aceste nume sunt valabile doar în contextul acestor clase și obiecte. De aceea se
numesc spații de nume .
91
Există două tipuri de câmpuri - variabilele de clasă și variabilele de obiect care sunt
clasificate în funcție de faptul dacă clasa sau obiectul deține variabilele.

Variabilele de clasă sunt partajate - pot fi accesate de toate instanțele acelei clase. Există


o singură copie a variabilei de clasă și atunci când un obiect face o schimbare la o variabilă
de clasă, acea modificare va fi văzută de toate celelalte instanțe.

Obiect variabile sunt deținute de fiecare obiect / instanță individuale ale clasei. În acest
caz, fiecare obiect are o copie proprie a câmpului, adică nu sunt partajate și nu sunt legate
în niciun fel cu câmpul cu același nume într-o altă instanță. Un exemplu va face acest lucru
ușor de înțeles (salvare ca oop_objvar.py):

class Robot:

"""Represents a robot, with a name."""

# A class variable, counting the number of robots

population = 0

def __init__(self, name):

"""Initializes the data."""

self.name = name

print("(Initializing {})".format(self.name))

# When this person is created, the robot

# adds to the population


A Byte of Python Programarea orientată pe obiecte

Robot.population += 1

def die(self):

"""I am dying."""

print("{} is being destroyed!".format(self.name))

92
Robot.population -= 1

if Robot.population == 0:

print("{} was the last one.".format(self.name))

else:

print("There are still {:d} robots working.".format(

Robot.population))

def say_hi(self):

"""Greeting by the robot.

Yeah, they can do that."""

print("Greetings, my masters call me {}.".format(self.name))

@classmethod

def how_many(cls):

"""Prints the current population."""

print("We have {:d} robots.".format(cls.population))


A Byte of Python Programarea orientată pe obiecte

droid1 = Robot("R2-D2")

droid1.say_hi()

Robot.how_many()

93
droid2 = Robot("C-3PO")

droid2.say_hi()

Robot.how_many()

print("\nRobots can do some work here.\n")

print("Robots have finished their work. So let's destroy them.")

droid1.die()

droid2.die()

Robot.how_many()

ieşire:

$ python oop_objvar.py

(Initializing R2-D2)

Greetings, my masters call me R2-D2.

We have 1 robots.

(Initializing C-3PO)

Greetings, my masters call me C-3PO.


A Byte of Python Programarea orientată pe obiecte

We have 2 robots.

Robots can do some work here.

Robots have finished their work. So let's destroy them.

94 R2-D2 is being destroyed!


There are still 1 robots working.

C-3PO is being destroyed!

C-3PO was the last one.

We have 0 robots.

Cum functioneaza

Acesta este un exemplu lung, dar ajută la demonstrarea naturii variabilelor de clasă și de
obiect. Aici, populationaparține Robotclasei și, prin urmare, este o variabilă de
clasă. nameVariabila aparține obiectului (este atribuit folosind self) și , prin urmare , este
o variabilă obiect.

Astfel, ne referim la populationvariabila de clasă ca Robot.populationși


nu self.population. Referindu-ne la variabila obiect namefolosind self.namenotarea în
metodele acelui obiect. Rețineți această diferență simplă între variabilele de clasă și
obiect. De asemenea, rețineți că o variabilă de obiect cu același nume ca o variabilă de
clasă va ascunde variabila de clasă!

În loc de Robot.population, am fi putut folosi, de asemenea,


pentru self.__class__.populationcă fiecare obiect se referă la clasa sa prin
intermediul self.__class__atributului.

Este de how_manyfapt o metodă care aparține clasei și nu obiectului.  Aceasta înseamnă


că o putem defini fie ca o, classmethodfie staticmethodîn funcție de faptul dacă trebuie să
știm de ce clasă facem parte. Deoarece ne referim la o variabilă de clasă, să
folosim classmethod.

Am marcat how_manymetoda ca metodă de clasă folosind un decorator .

Decoratorii pot fi imaginați ca o comandă rapidă pentru a apela o funcție de împachetare


(adică o funcție care "înfășoară" în jurul unei alte funcții, astfel încât să poată face ceva
înainte sau după funcția interioară), astfel încât aplicarea @classmethoddecoratorului
este aceeași ca și apelarea:
A Byte of Python Programarea orientată pe obiecte

how_many = classmethod(how_many)

Observați că __init__metoda este utilizată pentru a inițializa Robotinstanța cu un


nume. În această metodă, mărim populationnumărarea cu 1 deoarece avem încă un robot
adăugat. De asemenea, observați că valorile self.namesunt specifice fiecărui obiect care
indică natura variabilelor obiectului.

Rețineți că trebuie să vă referiți la variabilele și metodele aceluiași obiect


folosind self singura . Aceasta se numește referință de atribut .

95 În acest program, vedem, de asemenea, utilizarea docstrings pentru clase, precum și


metode. Putem accesa docstring de clasă la timpul de execuție folosind  Robot.__doc__și
metoda docstring caRobot.say_hi.__doc__

În cadrul diemetodei, pur și simplu scădem Robot.populationnumărătoarea cu 1.

Toți membrii clasei sunt publici. O excepție: dacă utilizați membri de date cu nume
folosind prefixul dublu de subliniere, cum ar fi __privatevar, Python folosește numele-
mangling pentru a face efectiv o variabilă privată.

Astfel, convenția urmată este aceea că orice variabilă care trebuie utilizată numai în
cadrul clasei sau al obiectului trebuie să înceapă cu o subliniere și toate celelalte nume
sunt publice și pot fi folosite de alte clase / obiecte. Rețineți că aceasta este doar o
convenție și nu este impusă de Python (cu excepția prefixului dublu de subliniere).

Notă pentru programatori C ++ / Java / C #

Toți membrii clasei (inclusiv membrii de date) sunt publici și toate metodele


sunt virtuale în Python.

Moştenire

Unul dintre beneficiile majore ale programării orientate obiect este reutilizareacodului și


unul dintre modurile în care acest lucru se realizează este prin mecanismul
de moștenire . Moștenirea poate fi cel mai bine imaginată ca implementând o relație tip
și subtip între clase.

Să presupunem că doriți să scrieți un program care să țină evidența profesorilor și


studenților dintr-un colegiu. Ele au anumite caracteristici comune, cum ar fi numele,
vârsta și adresa. De asemenea, ele au caracteristici specifice, cum ar fi salariul, cursurile și
concediile pentru profesori, precum și notele și taxele pentru studenți.

Puteți crea două clase independente pentru fiecare tip și le puteți procesa, dar adăugarea
unei noi caracteristici comune ar însemna adăugarea la ambele clase independente. Acest
lucru devine rapid greu.
A Byte of Python Programarea orientată pe obiecte

O modalitate mai bună ar fi să creeze o clasă comună numită SchoolMemberși apoi să


aibă clasele profesor și student moștenite din această clasă, adică vor deveni subtipuri de
acest tip (clasă) și apoi putem adăuga caracteristici specifice acestor subtipuri.

Există multe avantaje pentru această abordare. Dacă adăugăm / schimbăm orice


funcționalitate SchoolMember, aceasta se reflectă automat și în subtipuri. De exemplu,
puteți adăuga un nou câmp de carduri de identitate atât pentru profesori, cât și pentru
studenți prin adăugarea lor la clasa SchoolMember. Cu toate acestea, schimbările în
subtipuri nu afectează alte subtipuri. Un alt avantaj este că vă puteți referi la un obiect de
profesor sau student ca SchoolMemberobiect care ar putea fi util în anumite situații, cum
96 ar fi numărarea numărului de membri ai școlii. Aceasta se numește polimorfism în care un
subtip poate fi înlocuit în orice situație în care se așteaptă un tip parent, adică obiectul
poate fi tratat ca o instanță a clasei părinte.

De asemenea, observați că reutilizăm codul clasei părinte și nu este nevoie să o repetăm


în diferitele clase, așa cum ar fi trebuit să procedăm în cazul în care am folosit clase
independente.

SchoolMemberClasa în această situație este cunoscută sub numele de  clasa


de bazăsau superclasa . TeacherȘi Studentclase sunt numite clase derivate sau subclase .

Vom vedea acum acest exemplu ca un program (cu excepția ca oop_subclass.py):

class SchoolMember:

'''Represents any school member.'''

def __init__(self, name, age):

self.name = name

self.age = age

print('(Initialized SchoolMember: {})'.format(self.name))

def tell(self):

'''Tell my details.'''

print('Name:"{}" Age:"{}"'.format(self.name, self.age), end=" ")

class Teacher(SchoolMember):
A Byte of Python Programarea orientată pe obiecte

'''Represents a teacher.'''

def __init__(self, name, age, salary):

SchoolMember.__init__(self, name, age)

self.salary = salary

print('(Initialized Teacher: {})'.format(self.name))

97
def tell(self):

SchoolMember.tell(self)

print('Salary: "{:d}"'.format(self.salary))

class Student(SchoolMember):

'''Represents a student.'''

def __init__(self, name, age, marks):

SchoolMember.__init__(self, name, age)

self.marks = marks

print('(Initialized Student: {})'.format(self.name))

def tell(self):

SchoolMember.tell(self)

print('Marks: "{:d}"'.format(self.marks))

t = Teacher('Mrs. Shrividya', 40, 30000)

s = Student('Swaroop', 25, 75)


A Byte of Python Programarea orientată pe obiecte

# prints a blank line

print()

members = [t, s]

98 for member in members:


# Works for both Teachers and Students

member.tell()

ieşire:

$ python oop_subclass.py

(Initialized SchoolMember: Mrs. Shrividya)

(Initialized Teacher: Mrs. Shrividya)

(Initialized SchoolMember: Swaroop)

(Initialized Student: Swaroop)

Name:"Mrs. Shrividya" Age:"40" Salary: "30000"

Name:"Swaroop" Age:"25" Marks: "75"

Cum functioneaza

Pentru a folosi moștenirea, specificăm numele clasei de bază într-un tuplu după numele
clasei din definiția clasei (de exemplu, class Teacher(SchoolMember)). Apoi, observăm
că __init__metoda clasei de bază este denumită în mod explicit folosindself  variabila
astfel încât să putem inițializa partea de clasă de bază a unei instanțe din subclasă.  Acest
lucru este foarte important de reținut - Deoarece definim o__init__  metodă Teacher și
o Student subclasă, Python nu sună automat constructorul clasei de bază SchoolMember,
trebuie să-l numiți în mod explicit.

În schimb, dacă nu am definit o __init__ metodă într-o subclasă, Python va apela automat


constructorul clasei de bază.
A Byte of Python Programarea orientată pe obiecte

În timp ce am putea trata cazurile de Teachersau Studentcum ar fi o


instanță SchoolMemberși a accesa tellmetoda SchoolMemberprin tastarea pur și
simplu Teacher.tellsau Student.tell, în schimb, definim o altă tellmetodă în fiecare
subclasă (folosind tellmetoda SchoolMemberpentru o parte din ea) pentru ao adapta
pentru acea subclasă. Pentru că am făcut acest lucru, când scriem Teacher.tellPython
folosește tellmetoda pentru acea subclasă față de superclaj. Cu toate acestea, dacă nu am
avea o tellmetodă în subclasă, Python ar folositellîn superclase. Python începe
întotdeauna să caute mai întâi metode în tipul de subclasă actuală și, dacă nu găsește
nimic, începe să privească metodele din clasele de bază ale subclaselor, unul câte unul, în
ordinea în care sunt specificate în tuplu au o clasă de bază, dar puteți avea mai multe
99 clase de bază) în definiția clasei.

O notă privind terminologia - dacă mai multe clase sunt listate în macheta de moștenire,
atunci se numește moștenire multiplă .

endParametrul este utilizat în printfuncție în superclasa a tell()metodei pentru a imprima


o linie și să permită următoarea imprimare să continue pe aceeași linie. Acesta este un
truc pentru a printnu imprima un \nsimbol (newline) la sfârșitul imprimării.

rezumat

Am explorat acum diferitele aspecte ale clasei și obiectelor, precum și diferitele


terminologii asociate cu ea. De asemenea, am văzut beneficiile și capcanele programării
orientate pe obiecte. Python este foarte orientat spre obiect și înțelegerea acestor
concepte cu atenție vă va ajuta foarte mult pe termen lung.

Apoi, vom învăța cum să facem față cu intrarea / ieșirea și cum să accesăm fișierele din
Python.
A Byte of Python Intrare și ieșire

Intrare și ieșire

Vor exista situații în care programul dvs. trebuie să interacționeze cu utilizatorul.  De
exemplu, doriți să primiți informații de la utilizator și apoi să imprimați unele rezultate
înapoi. Putem realiza acest lucru folosind input()funcția și printrespectiv funcția.

Pentru ieșire, putem folosi și diferitele metode ale strclasei (șir). De exemplu, puteți
utiliza rjustmetoda pentru a obține un șir care este corect justificat la o lățime
specificată. Vedeți help(str)mai multe detalii.

100 Un alt tip comun de intrare / ieșire se ocupă de fișiere. Abilitatea de a crea, citi și scrie
fișiere este esențială pentru multe programe și vom explora acest aspect în acest capitol.

Intrare de la utilizator

Salvați acest program ca io_input.py:

def reverse(text):

return text[::-1]

def is_palindrome(text):

return text == reverse(text)

something = input("Enter text: ")

if is_palindrome(something):

print("Yes, it is a palindrome")

else:

print("No, it is not a palindrome")

ieşire:

$ python3 io_input.py

Enter text: sir


A Byte of Python Intrare și ieșire

No, it is not a palindrome

$ python3 io_input.py

Enter text: madam

Yes, it is a palindrome

101
$ python3 io_input.py

Enter text: racecar

Yes, it is a palindrome

Cum functioneaza

Utilizăm caracteristica de tăiere pentru a inversa textul. Am văzut deja cum putem
face felii din secvențe  utilizând seq[a:b]codul pornind de la poziția ala poziția b. Putem de
asemenea să furnizăm un al treilea argument care determină pasul prin care se face
felierea. Pasul implicit se 1datorează faptului că returnează o parte continuă a
textului. Dacă faceți un pas negativ, adică -1veți returna textul în sens invers.

input()Funcția are un șir de caractere ca argument și îl afișează utilizatorului. Apoi


așteaptă ca utilizatorul să introducă ceva și apasă tasta de întoarcere.  Odată ce
utilizatorul a introdus și a apăsat tasta de returnare, input()funcția va returna textul
introdus de utilizator.

Luăm textul și îl inversăm. Dacă textul original și textul inversat sunt egale, atunci textul
este un palindrom .

Exerciții fizice

Verificarea dacă un text este un palindrom ar trebui să ignore și punctuația, spațiile și


cazul. De exemplu, "Rise to vote, d-le." este, de asemenea, un palindrom, dar programul
nostru actual nu spune că este. Puteți îmbunătăți programul de mai sus pentru a
recunoaște acest palindrom?

Dacă aveți nevoie de un indiciu, ideea este că ... 1

Fișiere

Puteți deschide și utiliza fișiere pentru citire sau scriere prin crearea unui obiect
al fileclasei și utilizarea acesteia read, readlinesau writemetode în mod corespunzător
pentru a citi sau scrie la dosar. Capacitatea de a citi sau de a scrie în fișier depinde de
A Byte of Python Intrare și ieșire

modul pe care l-ați specificat pentru deschiderea fișierului. Apoi, în cele din urmă, când ați
terminat cu fișierul, apelați closemetoda de a spune Python că am terminat folosind
fișierul.

Exemplu (salvați ca io_using_file.py):

poem = '''\

Programming is fun

102 When the work is done


if you wanna make your work also fun:

use Python!

'''

# Open for 'w'riting

f = open('poem.txt', 'w')

# Write text to file

f.write(poem)

# Close the file

f.close()

# If no mode is specified,

# 'r'ead mode is assumed by default

f = open('poem.txt')

while True:

line = f.readline()

# Zero length indicates EOF

if len(line) == 0:
A Byte of Python Intrare și ieșire

break

# The `line` already has a newline

# at the end of each line

# since it is reading from a file.

print(line, end='')

103 # close the file


f.close()

ieşire:

$ python3 io_using_file.py

Programming is fun

When the work is done

if you wanna make your work also fun:

use Python!

Cum functioneaza

Rețineți că putem crea un nou obiect de fișier prin simpla openmetodă. Deschidem (sau


creăm, dacă nu există deja) acest fișier utilizând funcția încorporată openși specificând
numele fișierului și modul în care dorim să deschidem fișierul. Modul poate fi modul de
citire ( 'r'), modul de scriere ( 'w') sau modul de adăugare ( 'a'). De asemenea, putem
specifica dacă citim, scriem sau adăugăm în modul text ( 't') sau în modul binar
( 'b'). Există, de fapt, mai multe moduri disponibile și vă help(open)vor oferi mai multe
detalii despre ele. În mod implicit, open()consideră că fișierul este un fișier t'ext și îl
deschide în modul "r'ead".

În exemplul nostru, vom deschide / crea fișierul în modul de scriere text și vom
folosi writemetoda obiectului de fișier pentru a scrie variabila șir poemla fișier și apoi vom
fi în final closefișierul.

Apoi deschidem din nou același fișier pentru citire. Nu este nevoie să specificăm un mod
deoarece "fișierul de citire a textului" este modul implicit. Citiți în fiecare linie a fișierului
folosind readlinemetoda într-o buclă. Această metodă returnează o linie completă care
include caracterul de linie nouă la sfârșitul liniei. Când un șir gol este returnat, înseamnă
că am ajuns la sfârșitul fișierului și ne "izbucnim" din bucla.

În cele din urmă, vom fi în cele closedin urmă dosarul.


A Byte of Python Intrare și ieșire

Putem vedea din readlinerezultatele noastre că acest program a fost într-adevăr scris și


citit din noul poem.txtdosar.

murătură

Python oferă un modul standard numit pe picklecare îl puteți utiliza pentru a


stoca orice obiect obișnuit Python într-un fișier și apoi pentru a-l returna mai
târziu. Aceasta se numește stocarea persistentă a obiectului .

Exemplu (salvați ca io_pickle.py):


104
import pickle

# The name of the file where we will store the object

shoplistfile = 'shoplist.data'

# The list of things to buy

shoplist = ['apple', 'mango', 'carrot']

# Write to the file

f = open(shoplistfile, 'wb')

# Dump the object to a file

pickle.dump(shoplist, f)

f.close()

# Destroy the shoplist variable

del shoplist

# Read back from the storage

f = open(shoplistfile, 'rb')

# Load the object from the file


A Byte of Python Intrare și ieșire

storedlist = pickle.load(f)

print(storedlist)

ieşire:

$ python io_pickle.py

['apple', 'mango', 'carrot']

105 Cum functioneaza


Pentru a stoca un obiect într - un fișier, trebuie să mai întâi openfișierul în w rit bmodul
inary și apoi apelați dumpfuncția picklemodulului. Acest proces se numește decapare .

Apoi, vom prelua obiectul utilizând loadfuncția picklemodulului care returnează


obiectul. Acest proces se numește răsturnare .

Unicode

Până acum, când scriem și folosim șiruri sau citim și scriem într-un fișier, am folosit numai
caractere simple englezești. Atât caracterele englezești cât și cele non-engleză pot fi
reprezentate în Unicode (pentru mai multe informații, consultați articolele de la sfârșitul
acestei secțiuni), iar Python 3 stochează în mod implicit variabilele de șir (gândiți-vă la
textul pe care l-am scris folosind un singur sau dublu sau triplu citate) în Unicode.

NOTĂ: Dacă utilizați Python 2 și dorim să citim și să scriem alte limbi decât cele din limba
engleză, trebuie să folosim unicodetipul și totul începe cu caracterul u, de ex.u"hello
world"

>>> "hello world"

'hello world'

>>> type("hello world")

<class 'str'>

>>> u"hello world"

'hello world'

>>> type(u"hello world")

<class 'str'>

Atunci când datele sunt transmise prin Internet, trebuie să le trimitem în octeți ... ceva ce
înțelege ușor calculatorul. Regulile pentru traducerea Unicode (ceea ce Python utilizează
A Byte of Python Intrare și ieșire

atunci când stochează un șir) la octeți se numește codificare. O codificare populară de


utilizat este UTF-8. Putem citi și scrie în UTF-8 folosind un argument simplu de cuvinte
cheie în openfuncția noastră .

# encoding=utf-8

import io

106 f = io.open("abc.txt", "wt", encoding="utf-8")


f.write(u"Imagine non-English language here")

f.close()

text = io.open("abc.txt", encoding="utf-8").read()

print(text)

Cum functioneaza

Utilizăm io.openși apoi folosim encodingargumentul în prima instrucțiune deschisă pentru


a codifica mesajul și apoi din nou în cea de-a doua instrucțiune deschisă atunci când
decodificăm mesajul. Rețineți că ar trebui să folosim numai codificarea în instrucțiunea
deschisă atunci când suntem în modul text.

De fiecare dată când scriem un program care utilizează literalmente Unicode (prin
introducerea unui ușir înaintea șirului) așa cum am folosit mai sus, trebuie să ne asigurăm
că Python în sine ni se spune că programul nostru folosește UTF-8 și trebuie să punem  #
encoding=utf-8 comentariu în partea de sus a programului nostru.

Ar trebui să aflați mai multe despre acest subiect prin citirea:

 "Minimul absolut al fiecărui dezvoltator de software Absolut, pozitiv trebuie să știți


despre seturile de unicode și caractere"
 Python Unicode Howto
 Discuție pragmatică despre Unicode de Nat Batchelder

rezumat

Am discutat diverse tipuri de intrări / ieșiri, despre manipularea fișierelor, despre modulul
de pickle și despre Unicode.

Apoi, vom explora conceptul de excepții.


A Byte of Python Intrare și ieșire

107

S-ar putea să vă placă și