Usporedba osnovnih elemenata C-a i python-a¶
Osnovni tipovi podataka¶
Python | Komentar | C |
---|---|---|
|
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 Kad je potrebno držati u memoriji polje |
|
Pythonov int je implementiran pomoću C-ovog long -a. |
long |
|
Pythonov long drži cijele brojeve proizvoljnog broja znamenaka. |
C nema ugrađen takav tip. |
|
Python-ov float je implementiran pomoću C-ovog double -a |
double |
|
Noviji C prevoditelji podržavaju kompleksne brojeve. Primjeri na: http://stackoverflow.com/questions/6418807/how-to-work-with-complex-numbers-in-c. | double complex |
|
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
- https://docs.python.org/2/library/stdtypes.html#numeric-types-int-float-long-complex
- http://www.diveintopython3.net/native-datatypes.html
- http://www.tutorialspoint.com/python/python_variable_types.htm
- http://www.python-course.eu/sequential_data_types.php
- http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c-c
- http://graphics.stanford.edu/~seander/bithacks.html
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 Napomena U C-u se lako moglo definirati prazan blok pomoću |
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 print range(1,26,5)
[1, 6, 11, 16, 21]
Pozor bitno je uočiti da su elementi liste uvijek manji od granice 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 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 Savjet u pythonu nije moguće direktno zbrojiti string i broj nego broj treba pretvoriti u string: |
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 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 za razliku od pythona programer mora paziti da se ne prekorači rezervirana duljina od |
mala u velika slova | a="string"
print a.upper()
STRING
treba primijetiti da je sam |
#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 |
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]
|