Usporedba osnovnih elemenata C-a i python-a =========================================== Pregled često korištenih tipova podataka ---------------------------------------- Sljedeća tablica prikazuje često korištene tipove podataka u pythonu i referencu na odjeljak gdje se navedeni tip detaljnije diskutira. .. tabularcolumns:: p{ 2.2572893316728933in } p{ 2.2572893316728933in } p{ 2.2572893316728933in } .. list-table:: :header-rows: 1 * - opis - *mutable* - *immutable* * - jednostavni tipovi, brojevi - - :class:`int`, :class:`float`, :class:`complex`, :class:`bool`, :class:`NoneType` (vidi :ref:`osno`) * - niz byteova - :class:`bytearray` - :class:`bytes` (vidi :ref:`datoteke_bin`, :ref:`unicode`) * - niz unicode znakova (=string) - nema, ali :class:`io.StringIO`, :class:`array.array`, :class:`bytearray`, :class:`list` mogu poslužiti - :class:`str` (:ref:`stringovi`, :ref:`stringovi2`, detalji u :ref:`unicode`) * - niz objekata - :class:`list` - :class:`tuple` * - niz objekata određenog tipa ("homogeno" polje) - :class:`array.array` - * - niz objekata bez ponavljanja - :class:`set` - :class:`frozenset` * - rječnik - :class:`dict` (vidi :ref:`rjecnik`) - *Mutable* varijable se mogu mijenjati, *immutable* varijable se ne mogu mijenjati (konstante su). Treba primijetiti da su u C-u primitivni tipovi podataka :class:`int`, :class:`float`, ... *mutable*, a u pythonu su *immutable*. Razlika između *mutable* i *immutable* diskutira se u odjeljku :ref:`pridruzivanjelista`. Osnovne primjere upotrebe možete naći u raznim tutorialima npr.: - http://www.diveintopython3.net/native-datatypes.html Operatori --------- Operatori su slični kao u C-u. Postoje razlike, npr. postoji poseban operator ``//`` za cjelobrojno dijeljenje kao i za potenciranje ``**``. .. tabularcolumns:: p{ 3.4689559983395597in } p{ 3.4689559983395597in } .. list-table:: :header-rows: 1 * - Python - C * - ``and`` - ``&&`` * - ``or`` - ``||`` * - ``a**b`` - ``pow(a,b)`` * - ``a/b`` - ``((double)a)/b`` (dijeljenje s decimalama) * - ``a//b`` - ``a/b`` ako su oba cjelobrojni, inače ``floor(a/b)`` * - ``not`` - ``!`` * - ``id(x)`` - ``&x`` (adresa od x) U pythonu postoji operator ``in`` koji pretražuje postoji li element u skupu. Npr. u sljedećem primjeru provjeravamo jesu li ``1``, ``'1'``, ``''`` elementi liste ``a``: .. literalinclude:: tipovi_in.py.filtered :language: pycon Direktan rad s memorijom u pythonu nije podržan što znači da ne postoji operator za očitavanje vrijednosti na adresi kao ``*`` u C-u. Ne postoji operator za očitavanje adrese objekta ali postoji funkcija ``id()`` koja očitava "identitet" objekta. U CPythonu se kao "identitet" objekta koristi adresa objekta. Popis operatora s jednostavnim primjerima: - https://www.tutorialspoint.com/python/python_basic_operators.htm Korisne kratice ----------------------------- Umnožak stringa i broja slijepi više primjeraka tog stringa npr. ``'xy'*3`` daje ``'xyxyxy'``. Slično za liste i tupleove: ``[1,2]*3`` daje ``[1,2,1,2,1,2]``. Korisne kratice su i: .. tabularcolumns:: p{ 3.4689559983395597in } p{ 3.4689559983395597in } .. list-table:: :header-rows: 1 * - Python - C * - ``a`_ ili `ovdje `_. * - :class:`int` .. literalinclude:: tipovi02.py.filtered :language: pycon .. literalinclude:: tipovi03.py.filtered :language: pycon - Pythonov :class:`int` drži cijele brojeve proizvoljnog broja znamenaka. - C nema ugrađen takav tip. Slični tipovi su ``int``, ``long``, samo oni ne drže proizvoljan broj znamenki. * - :class:`float` .. literalinclude:: tipovi04.py.filtered :language: pycon - Python-ov :class:`float` je implementiran pomoću C-ovog ``double``-a - ``double`` * - :class:`complex` .. literalinclude:: tipovi05.py.filtered :language: pycon - Noviji C prevoditelji podržavaju kompleksne brojeve. Primjeri na: http://stackoverflow.com/questions/6418807/how-to-work-with-complex-numbers-in-c. - ``double complex`` * - :class:`NoneType` .. literalinclude:: tipovi06.py.filtered :language: pycon - Varijabla se postavi na ovaj tip kad je definirana ali nije inicijalizirana. Primjer je funkcija koja zaboravi vratiti vrijednost: .. literalinclude:: tipovi07.py :language: python .. literalinclude:: tipovi07.py.filtered :language: text - Podsjeća na ``void`` u C-u, samo u C-u nisu postojale vrijednosti tipa ``void``, postojao je samo tip ``void``. U pythonu postoji samo jedna moguća vrijednost tipa :class:`NoneType` a to je ``None``. Literatura - https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-long-complex - http://www.tutorialspoint.com/python/python_variable_types.htm - http://www.python-course.eu/sequential_data_types.php Grananje i petlje ----------------- Neke očite sličnosti i razlike C-a i python-a vidimo u sljedećoj tablici. .. tabularcolumns:: p{ 1.7344779991697798in } p{ 1.7344779991697798in } .. list-table:: :header-rows: 1 * - Python - C * - ``break`` - ``break;`` * - ``continue`` - ``continue;`` * - :: if uvjet: radnja - .. code-block:: c if(uvjet){ radnja; } * - :: if uvjet: radnja1 else: radnja2 - .. code-block:: c if(uvjet){ radnja1; } else{ radnja2; } * - :: while uvjet: radnja1 - .. code-block:: c while(uvjet){ radnja1; } Osnovni elementi programa --------------------------------------------------------- .. tabularcolumns:: p{ 5.029986197592361in } p{ 1.907925799086758in } .. list-table:: :header-rows: 1 * - Python - C * - Indentacija .. note:: U pythonu nema vitičastih zagrada, a blok naredbi je definiran time što je uvučen u desno, **relativno na prethodni red**, pomoću razmaka ili tabova. Kako broj razmaka koje tab predstavlja nije fiksan (tj. može se namjestiti u editoru po želji) bitno je to indentiranje raditi uniformno. Preporuča se koristiti isključivo razmake za uvlačenje (npr. 2 ili 4). Da bi se olakšalo upisivanje obično je moguće namjestiti u editoru da pritisak na tab generira npr. 4 razmaka ``' '`` (a ne tab ``'\t'``). .. note:: U C-u se lako moglo definirati prazan blok pomoću ``;`` ili ``{}``. Za tu svrhu u pythonu postoji naredba ``pass`` koja isto tako ne radi ništa. - Vitičaste zagrade * - Svaka naredba u svom redu ili ``;`` - ``;`` * - ``'xx'`` ili ``"xx"`` ili ``"""xx"""`` (trostruki navodnici mogu uključivati više redaka teksta) Kod unosa stringova u pythonu postoje još neke mogućnosti koje postignu dodavanjem slova (tzv. prefiksa) ispred prvih navodnika. Prefiks ``r`` omogućuje upis znaka ``\`` bez potrebe da se piše ``\\``, tj. dovoljno je samo ``r"\"``. Naravno u takvom zapisu ne možemo upisati znak za novi red ``\n`` jer je ``r"\n"`` isto što i ``"\\n"``. Ovakav zapis je koristan kad je potrebno upisivati stringove koji sadrže veliki broj znakova ``\``. Prefiks ``f`` omogućuje lagano ubacivanje vrijednosti varijabli u string, te formatiranje. (Više na https://realpython.com/python-f-strings/) .. literalinclude:: op_fstr.py :language: python .. literalinclude:: op_fstr.py.filtered :language: text Prefiks ``u`` se koristio u pythonu 2. U pythonu 3 se podrazumijeva da su stringovi nizovi unicode znakova. - ``"xx"`` * - Nema tip podataka znak (char). Umjesto toga koristi string duljine 1: ``"x"`` (ili niz byteova duljine 1: ``b"x"``). - ``'x'`` * - Python izvršava kôd naredbu po naredbu. Ne pregledava točnost unaprijed kao C nego tek u trenutku izvršavanja. To znači da ako se program u pythonu uspije pokrenuti, ne znači da u njemu nema tipfelera. - C sve provjerava unaprijed. * - Case sensitive (tj. razlikuje velika i mala slova) - Također case sensitive * - Heksadecimalni brojevi unose se koristeći prefiks ``0x``. Dodatno, radi preglednosti, grupe znamenki se mogu razdvajati znakom ``_``. Npr.: .. literalinclude:: op_grupe.py :language: python .. literalinclude:: op_grupe.py.filtered :language: text - Također ``0x``. ``for`` petlja ---------------------------- .. tabularcolumns:: p{ 5.029986197592361in } p{ 1.907925799086758in } .. list-table:: :header-rows: 1 * - Python - C * - :: for i in range(pocetak,kraj,korak): radnja :func:`range` je oznaka za interval sa zadanim granicama i iznosom koraka. U pythonu 2 rezultat poziva ``range(...)`` je lista brojeva, u pythonu 3 rezultat je objekt tipa ``range``. .. literalinclude:: op1_for_range.py :language: python .. literalinclude:: op1_for_range.py.filtered :language: text Tip ``range`` predstavlja niz podataka (tj. *sequence type*) kao ``tuple`` i ``list``. Može se lako pretvoriti u listu: .. literalinclude:: op1_for_range_seq.py :language: python .. literalinclude:: op1_for_range_seq.py.filtered :language: text Za potrebe for petlje možemo koristiti bilo koji tip koji je niz ili koji se može iterirati. Ne mora nužno biti ``range``. O generatorima/iteratorima vidi napomenu u :ref:`gen`. .. literalinclude:: op1_17.py :language: python .. literalinclude:: op1_17.py.filtered :language: text .. attention:: Bitno je uočiti da su elementi liste uvijek manji od granice ``kraj``. (npr. u gornjem primjeru broj 26 nije u listi) - .. code-block:: c for(i=pocetak; i