User Tools

Site Tools


intro-si-sintaxa

Introducere și sintaxă

De ce Python?

Python este un limbaj de programare dinamic, de nivel înalt, ce pune accent pe expresivitatea și înțelegerea ușoară a codului. Sintaxa sa permite implementări echivalente cu alte limbaje în mai puține linii de cod. Datorită acestui fapt, Python este foarte răspândit atât în programarea de aplicații, căt și în zona de scripting.

Limbajul facilitează mai multe paradigme de programare, în special paradigma imperativa (C) și pe cea orientată pe obiecte (Java). Spre deosebire de C, Python nu este um limbaj compilat, ci interpretat. Acest fapt are atât avantaje, căt și dezavantaje. Pe de-o parte, Python este mai lent decât C. Pe de altă parte, aplicațiile Python sunt foarte ușor de depanat, codul putând fi ușor inspectat în timpul rulării. De asemenea, este foarte ușor de experimentat cu mici fragmente de cod folosind interpretorul Python.

Datorită aspectului dinamic al limbajului, codul Python nu conține declarații de tipuri. Astfel, dacă în C am fi scris:

int a = 3;

… în Python scriem:

a = 3

În Python nu putem declara o variabilă fără să îi atribuim o valoare, cum am fi făcut în C:

int a;

Sintaxa este gândita în așa fel încât programele Python să fie ușor de citit. Acest lucru este obținut prin folosirea de cuvinte în locul semnelor (de exemplu, and în loc de &&) și prin includerea indentării în limbaj. Astfel, în Python nu se folosesc acolade (ca în C/C++, Java), ci blocurile de cod se delimitează prin indentare. Programele Python sunt, de multe ori, foarte aproape de o “implementare” echivalentă în pseudocod.

Python vs C/C++

  • mai ușor de citit
  • debugging ușor
  • utilizatorul nu trebuie să se ocupe de managementul memorie
  • testare ușoară
  • biblioteci externe accesibile
  • mai puțin cod
  • erorile de sintaxă se găsesc mai ușor în C

Python vs pseudocod

  • codul arată aproape la fel
  • codul Python poate fi rulat, în timp ce pseudocodul are doar utilitate didactică

Lucrul cu interpretorul

Cum am spus în introducere, limbajul Python este interpretat, nu compilat. Asta înseamnă că programele Python sunt transformate într-un limbaj intermediar. Acest lucru permite codul să fie ușor de portat pe diverse sisteme de operare și arhitecturi hardware.

Codul este executat linie cu linie. Astfel, dacă - de exemplu - apelăm o funcție care nu există, vom primi un mesaj de eroare abia când se încearcă executarea liniei respective. Erorile de sintaxă sunt raportate însă înainte de rularea programului.

Pentru a exersa sintaxa și elementele de bază ale limbajului, vom folosi direct interpretorul Python.

Python poate fi instalat conform ghidului de aici. După instalare, putem porni aplicația “IDLE”, care ne oferă un interpretor Python în mediul grafic.

Interpretorul seamăna foarte mult cu o linie de comanda (cmd.exe, bash). Prompt-ul (>>>) apare când se așteaptă input din partea utilizatorului. După ce este introdusă o instrucțiune, aceasta este evaluată și dacă exista output, este afișat în continuare, începând cu o linie noua. Expresiile sunt evaluate și afișate.

>>> 3 # 3 este o expresie - este evaluata si se afiseaza rezultatul
3
>>> 2 + 4 # alta expresie
6
>>> a = 3 # aceasta instructiune declara variabila a si ii atribuie valoarea 3
>>> a # se va afisa valoarea lui a
3
>>>

Sintaxa

Instrucțiuni si variabile

In Python nu este necesara folosirea de ”;” la sfarsitul unei linii. Folosim o linie pentru fiecare instructiune.

Cum am spus in sectiunea Lucrul cu interpretorul, Python este un limbaj dinamic si nu lucram direct cu tipuri. Ele exista, 2 este in continuare “int”, dar programatorul nu trebuie sa specifice acest lucru.

Comentariile sunt prefixate de caracterul ”#”.

a = 3 # declaram variabila a, cu valoarea 3
b = 4 # declaram variabila b, cu valoarea 4
suma = a + b # declaram variabila suma, cu valoarea sumei dintre a si b

Condiționale

Ca și în C sau C++, în Python există structura if/else.

if conditie:
    succes()
else:
    esec()
    numar_esecuri += 1

După cum se observă, este folosit ”:” în loc de ”{”, iar blocurile de cod ce vor fi executate pe ramurile respective sunt indentate. De asemenea, nu este nevoie de paranteze în jurul condiției verificate.

De multe ori, în C/C++ se folosește un șablon precum:

if (conditie1) {
    functie1();
} else if (conditie2) {
    functie2();
} else if (conditie3) {
    functie3();
} else {
    functie4();
}

Echivalentul Python este:

if conditie1:
    functie1()
elif conditie2:
    functie2()
elif conditie3:
    functie3()
else:
    functie4()

După cum se observa, nu există “else if” în Python, ci “elif”. Acest șablon de cod este aproape identic cu o structura “switch”. În Python nu exista “switch”, folosindu-se blocuri cu “elif”.

Bucle

Pentru a repeta un bloc de cod avem doua opțiuni: while și for.

While

Structura while din Python este la fel ca cea din C, ținând cont de diferențele de sintaxă:

while conditie:
    instructiune1
    instructiune2

For

For este diferit în Python. Sintaxa este:

for elem in colectie:
    instructiune1
    instructiune2

“elem” va lua pe rand ca valoare fiecare element din colecție.

Astfel, codul C:

int i;
for (i = 0; i < 4; i++) {
    instr;
}

este echivalent cu:

for i in [0, 1, 2, 3]:
    instr

Pentru a obține o lista cu numerele de la A la B (fără B), se poate folosi range(A, B). Dacă A este 0, putem folosi direct range(B).

Astfel, codul devine:

for i in range(4):
    instr

Funcția range primește și un parametru opțional ce reprezinta diferența între doua valori consecutive.

De exemplu, pentru a obține:

int i;
for (i = 0; i < 10; i += 2) {
    ...
}

Folosim:

for i in range(0, 10, 2):
    ...

Print

Instrucțiunea print afișează mesaje la standard output. Putem afișa valoarea oricărei expresii:

>>> print 1 + 1
2
>>> print "hello world"
'hello world'
>>> a = 10
>>> print a
10

Tipuri de date

Numere

Cele mai comune tipuri numerice în Python sunt int si float.

2 # int
2.0 # float - similar cu double in C

Tipul int nu are valori minime și maxime, poate fi reprezentată orice valoare întreagă.

Tipuri Boolean

Se numesc True și False, și putem executa operații logice cu ele:

>>> 1 < 2
True
>>> 1 > 2
False
>>> True and 1 < 2
True
>>> True and 1 > 2
False
>>> False or True
True

Șiruri de caractere

Spre deosebire de C, Python oferă suport built-in pentru string-uri. Șirurile date ca intrare pentru o operație nu pot fi modificate, orice operațiune returnează string-uri noi. Pot fi scrise cu ghilimele simple sau duble la alegere.

"hello, world"

String-urile pot fi accesate aleator:

>>> 'hello'[2]
"l"

Nu există tipul “caracter”. Se folosesc string-uri cu un element, sau reprezentările numerice directe. Se poate trece de la caracter la număr și invers folosind funcțiile ord și chr.

>>> ord('a')
97
>>> chr(97)
'a'

String-urile pot fi concatenate folosind operatorul +:

"hello, " + "world" == "hello, world"

Putem construi string-uri folosind operatorul %, asemănător funcțiilor printf și sprintf din biblioteca standard C:

>>> "numar: %d" % 13
'numar: 13'
>>> "string: %s" % "foo"
'string: foo'

Liste (Vectori)

Listele sunt echivalentul vectorilor dinamici din STL (din C++).

Se pot declara folosind sintaxa:

a = [1, 2, 3]

Pot fi concatenate cu +:

>>> [1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]

Pot fi accesate în funcție de index:

>>> [1, 2, 3, 4][2]
3

Se pot adaugă elemente la sfârșit folosind metoda “append”:

>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]

Este de remarcat faptul că elementele unei liste nu trebuie să fie de același tip.

>>> a = [1, "foo"]
>>> a.append(["bar", 22])
>>> a
[1, 'foo', ['bar', 22]]

Dicționare

Dictionarele sunt asocieri “cheie, valoare”, asemanator hashmap-ului din STL. Cheile pot fi string-uri, numere, sau alte obiecte nemodificabile (de exemplu nu putem folosi o listă drept cheie). Valorile pot fi orice.

>>> alex = {"nume": "Alex", "rol": "student", "an": 3}
>>> alex["nume"]
'Alex'
>>> alex["an"]
3
>>> alex["an"] = 4
>>> alex["an"]
4
>>> alex
{'nume': 'Alex', 'rol': 'student', 'an': 4}
>>> alex["medie"] = 10
>>> alex
{'nume': 'Alex', 'rol': 'student', 'medie': 10, 'an': 4}

Fișiere sursă

Pentru experimente simple, putem folosi interpretorul interactiv, dar dacă scriem programe complexe, e mai comod să ne salvăm programul într-un fișier, și să îl executăm de acolo. De exemplu, scriem următorul fișier, cu numele myprogram.py:

print "Hello world!"
language = "python"
print "sunt un fisier cu cod sursa %s" % language

Putem să îl executăm direct, fără pași intermediari de compilare, folosind comanda python:

$ python myprogram.py
Hello world!
sunt un fisier cu cod sursa python

Exerciții

1. Afișați 1000 de mesaje “Hello world”.

2. Plecând de la lista următoare, testați dacă fiecare număr este par, și afișați un mesaj corespunzător:

a = [1, 2, 3, 10, 11, 12, 45, 67, 89, 22, 13, 22]

3. Modificați exercițiul anterior folosind următoarea listă. Ce se întâmplă și de ce?:

a = [1, 2, 3, 'foo', 5, 6]

4. Calculați factorialul următoarelor numere: 9, 100, 20000. Cât de mari sunt rezultatele calculelor?

5. Afișați toți divizorii numărului 83538.

6. Rezolvați problema *Fizzbuzz*: Pentru fiecare număr de la 1 la 100, afișați următoarele:

  • fizz - dacă numărul este divizibil cu 3
  • buzz - dacă numărul este divizibil cu 5
  • fizz buzz - dacă numărul este divizibil și cu 3, și cu 5
  • numărul respectiv - în toate cazurile

7. Scrieți un program care confirmă conjectura Collatz pentru primele 100 de numere naturale. Conjectura Collatz spune că pentru orice număr natural (n), dacă se aplică funcția:

f(n) = 
    n / 2, pt n par
    3n + 1, pt n impar

de oricâte ori, în final se va ajunge la n = 1.

intro-si-sintaxa.txt · Last modified: 2014/04/10 10:54 by anpetre