Usporedba osnovnih elemenata C-a i python-a

Osnovni tipovi podataka

Python Komentar C

boolean

>>> a = True
>>> print a, type(a)
True <type 'bool'>
Logički tip podataka True, False. U Pythonu None, razne nule (0, 0.0), prazne liste [], stringovi "", itd. kad se koriste kao logički uvjet znače False.

Nema, u C-u se int koristi umjesto boolean (to možemo vidjeti pomoću sizeof(1==0) koji vrati broj 4).

Kad je potrebno držati u memoriji polje boolean vrijednosti, radi štednje memorije možemo koristiti npr. char umjesto int ili radi još veće uštede igrati se s pojedinačnim bitovima kao ovdje ili ovdje.

int

>>> a = -1000
>>> print a, type(a)
-1000 <type 'int'>
Pythonov int je implementiran pomoću C-ovog long-a. long

long

>>> a = 123456789012345678901234567890
>>> print a, type(a)
123456789012345678901234567890 <type 'long'>
Pythonov long drži cijele brojeve proizvoljnog broja znamenaka. C nema ugrađen takav tip.

float

>>> a = 1.0e-300
>>> print a, type(a)
1e-300 <type 'float'>
Python-ov float je implementiran pomoću C-ovog double-a double

complex

>>> a = 1 + 1.0e-300j
>>> print a, type(a)
(1+1e-300j) <type 'complex'>
Noviji C prevoditelji podržavaju kompleksne brojeve. Primjeri na: http://stackoverflow.com/questions/6418807/how-to-work-with-complex-numbers-in-c. double complex

NoneType

>>> a = None
>>> print a, type(a)
None <type 'NoneType'>

Varijabla se postavi na ovaj tip kad je definirana ali nije inicijalizirana. Primjer je funkcija koja zaboravi vratiti vrijednost:

def fun():
  print "funkcija samo ispisuje"
a = fun()
print a, type(a)
funkcija samo ispisuje
None <type 'NoneType'>
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 NoneType a to je None.

Literatura

Osnovni elementi

Neke očite sličnosti i razlike C-a i python-a vidimo u sljedećoj tablici.

Python C
and &&
or ||
a**b pow(a,b)
not !
id(x) &x (adresa od x)
break break;
continue continue;
if uvjet:
  radnja
if(uvjet){
  radnja;
}
if uvjet:
  radnja1
else:
  radnja2
if(uvjet){
  radnja1;
}
else{
  radnja2;
}

U sljedećoj tablici su dane daljnje sličnosti i razlike.

Python C

indentacija

Napomena

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').

Napomena

U C-u se lako moglo definirati prazan blok pomoću ; ili {}. Za tu svrhu u pythonu postoji naredba pass koja 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) "xx"
nema tip podataka znak (char). umjesto toga koristi string duljine 1: "x" ili '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

for petlja

Python C
for i in range(pocetak,kraj,korak):
  radnja

funkcija range() u pythonu proizvodi listu sa zadanim granicama.

print range(1,26,5)
[1, 6, 11, 16, 21]

Pozor

bitno je uočiti da su elementi liste uvijek manji od granice kraj. (npr. u gornjem primjeru broj 26 nije u listi)

Savjet

ako se na ovakav način radi, python2, u memoriji drži odjednom sve vrijednosti koje se pojavljuju u petlji. to, naravno, nije zgodno u slučaju range(0,1000000000) pa se u tom slučaju koristi xrange(0,1000000000). xrange() ne generira cijelu listu unaprijed pa ne zauzima nepotrebno memoriju. (u pythonu 3 range se ponaša kao xrange u pythonu 2. u pythonu 3 xrange ne postoji.)

http://stackoverflow.com/questions/135041/should-you-always-favor-xrange-over-range

for(i=pocetak; i<kraj; i+=korak){
  radnja;
}

Formatiranje (formatirani ispis)

formatiranje stringova i brojeva.

Savjet

korisna stvar u pythonu je operator % koji radi više manje isto što i sprintf iz C-a

Savjet

u pythonu nije moguće direktno zbrojiti string i broj nego broj treba pretvoriti u string: "broj = " + str(6)

a = 6
b = "broj = %d" % a
d = "x=%f,y=%f" % (1.0,2.2)
print b
print d
broj = 6
x=1.000000,y=2.200000
int a=6;
char b[32];
char d[32];
sprintf(b,"broj = %d",a);
printf("%s\n",b);
sprintf(d,"x=%f,y=%f", 1.0, 2.2);
printf("%s\n",d);
broj = 6
x=1.000000,y=2.200000

Python podržava i druge načine formatiranja. Pogledati primjere na:

Stringovi i polja (liste)

duljina stringa
len(a)
strlen(a)
duljina polja
L=[1,2,3]
print len(L)
3
int L[]={1,2,3};
//u nekim situacijama može se 
//očitati duljina polja pomoću
printf("%lu\n",sizeof(L)/sizeof(L[0]));
3
ispis elemenata polja
L=[1,2,30,40]
for i in range(len(L)):
  print L[i]
1
2
30
40
int L[]={1,2,30,40};
int i;
for(i=0; i<4; i++)
  printf("%d\n",L[i]);
1
2
30
40

Savjet

ispis elemenata polja na način tipičan za python

L=[1,2,30,40]
for a in L:
  print a
1
2
30
40
 

Zbrajanje i nadodavanje

zbrajanje stringova = nadodavanje stringa na string
a="str"
b="ing"
c=a+b
print c
string
char a[32], b[32], c[32];
strcpy(a,"str");
strcpy(b,"ing");
strcpy(c,a);
strcat(c,b);
printf("%s\n",c);
string
zbrajanje lista = nadodavanje liste na listu
a=[1,2,3]
b=[21,1]
c=a+b
print c
[1, 2, 3, 21, 1]
int a[16],b[16],c[16];
a[0]=1; a[1]=2; a[2]=3;
b[0]=21; b[1]=1;
memcpy(c,a,3*sizeof(int)); //kopirati a u c
memcpy(c+3,b,2*sizeof(int)); //kopirati b na c+3
int i;
for(i=0;i<5;i++)printf("%d ",c[i]);
printf("\n");
1 2 3 21 1 
nadodavanje elemenata na listu
a = [10,20]
a.append(30)
a.append(40)
print a
[10, 20, 30, 40]
int a[16] = {10,20};
int na = 2; // programer mora voditi evidenciju
            // o tome gdje je kraj liste
a[na++] = 30;
a[na++] = 40;

int i;
for(i=0;i<na;i++)printf("%d ",a[i]);
printf("\n");
10 20 30 40 
zbrajanje lista moguće i za liste s elementima raznih tipova
a = [1,2,"a"]
b = ["w",[4,1]]
c = a+b
print c
[1, 2, 'a', 'w', [4, 1]]
u C-u je ovo komplicirano... trebalo bi raditi s listom struktura koji sadrže: informacije o tipu podataka + pointer na same podatke i onda takve strukture nadodavati s jedne liste na drugu...

Napomena

python omogućuje i razne druge operacije nad listama - pogledati https://docs.python.org/2/tutorial/datastructures.html

Rad sa stringovima

mijenjanje stringova

u pythonu nije dopušteno mijenjati stringove, iako to ne dolazi do izražaja jer je dopušteno:

a=a+"3"

gornja naredba kreira novi string a zaboravi stari. nakon izvršavanja gornje naredbe a pokazuje na novi string. memoriju zauzetu starim stringom oslobodi u nekom trenutku python-ov garbage collector, ako više nije potrebna.

u žargonu se kaže da su u pythonu stringovi immutable. (a liste su mutable)

Napomena

pogledati Pridruživanje lista

u C-u je promjena dopuštena.

strcat(a,"3")

gornja naredba je promijenila sadržaj na koji a pokazuje, ali sam pointer a je ostao isti.

za razliku od pythona programer mora paziti da se ne prekorači rezervirana duljina od a.

mala u velika slova
a="string"
print a.upper()
STRING

treba primijetiti da je sam a ostao isti tj. "string"

#include <stdio.h>
#include <string.h>
#include <ctype.h>

void upper( char* s ){
  while( (*s++ = toupper(*s)) );
}

int main(){
  char a[32];
  strcpy(a, "string");
  upper(a);
  printf("%s\n",a);
}
STRING

u C-u je lakše napraviti tako da se sadržaj od a promijeni (u žargonu: in-place operacija)

traženje podstringa u stringu
# -*- coding: utf-8 -*-
a="string"

pos = a.find("tri")
if pos >= 0:
  print pos
else:
  print "nije pronađen"

pos = a.find("dva")
if pos >= 0:
  print pos
else:
  print "nije pronađen"
1
nije pronađen
char a[32];
char* pos;
strcpy(a, "string");

pos = strstr(a,"tri");
if(pos)
  printf("%ld\n",pos-a);
else
  printf("nije pronađen");

pos = strstr(a,"dva");
if(pos)
  printf("%ld\n",pos-a);
else
  printf("nije pronađen");
1
nije pronađen
pristup pojedinim znakovima u stringu
a[1]
a[1]
pristup podstringovima
a="string"
b=a[1:4]
print b
tri
char a[]="string";
char b[32];
strncpy(b,a+1,3);
b[3]='\0';
printf("%s\n",b);
tri

Napomena

Popis funkcija (preciznije, metoda) za rad sa stringovima na https://docs.python.org/2/library/stdtypes.html#string-methods

Dijelovi stringa/liste

radnja kôd
sve osim prvog
>>> a="string"
>>> a[1:]
tring
prva 3 znaka/elementa
>>> a = "string"
>>> a[:3]
str
zadnja 3 znaka/elementa
>>> a = "string"
>>> a[-3:]
ing
odbaciti prvi i zadnji
>>> a = ["string",2,3,5j,"4"]
>>> a[1:-1]
[2, 3, 5j]