You are on page 1of 29

Gii thiu ngn ng lp trnh Python

ng Nguyn Phng
dnphuong1984@gmail.com
Ngy 16 thng 10 nm 2014
Mc lc
1 M u 2
2 Gii thiu Python 2
3 Cch thc ci t v s dng Python 4
3.1 Cch ci t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.2 Cch thc s dng Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4 Python c bn 5
4.1 C php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
4.2 Cc ton t c bn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
4.3 Cc kiu d liu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4.4 Cu trc iu khin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.5 Hm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.6 File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.7 Lp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.8 Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.9 Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5 Cc gi Python cho khoa hc v k thut 18
5.1 SciPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.2 NumPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.3 Matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.4 IPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
6 Python v C
++
24
6.1 Nhng C
++
vo Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.2 Gi module Python trong C
++
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
7 Python v ROOT 27
7.1 PyROOT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
7.2 S dng Python trong ROOT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Ti liu tham kho 29
1
ng Nguyn Phng Ti liu ni b NMTP
1 M u
Trong khoa hc k thut, cc ngn ng lp trnh bc trung nh C/C
++
, Fortran, Assembler,...
c s dng rng ri v l nn tng xy dng nn cc gi (package) x l s liu cng nh
tnh ton s. Tuy nhin, mt trong nhng nhc im ca cc ngn ng ny l kh phc tp,
i hi ngi dng phi b nhiu thi gian v cng sc nm vng ngn ng.
Trong lnh vc thc nghim ht nhn v ht c bn, phn ln cc thao tc x l s liu u
cn phi c thc hin bng my tnh, do i hi ngi lm thc nghim phi c kin thc
v lp trnh. Hin nay, mt trong nhng xu hng ang c ph bin trong lp trnh x l s
liu, c bit trong vic xy dng cc framework, l kt hp cc ngn ng bc trung vi mt
ngn ng bc cao hn (cc ngn ng th h th 4 v 5). Trong vai tr ca cc ngn ng bc
cao l xy dng nn cc macro hoc cc giao din tng tc, cn cc tc v c th s do cc
ngn ng bc thp hn m nhim. u im d nhn thy ca cc ngn ng bc cao l c cu
trc r rng, sng sa, do s d s dng hn i vi nhng nh khoa hc thc nghim vn
khng phi l cc lp trnh vin chuyn nghip. iu ny s gip h gim bt lng cng vic
lp trnh c th tp trung vo cc vn ct li khc trong x l s liu cng nh thc hin
cc tnh ton.
Mt trong nhng ngn ng bc cao c ng dng rng ri trong thc nghim ht nhn v ht
c bn hin nay chnh l ngn ng lp trnh Python. y l mt trong nhng ngn ng d hc,
c cu trc sng sa, c th chy trn nn tng nhiu h iu hnh khc nhau v c bit l
min ph. Nu cc bn tng bit qua chng trnh x l s liu ROOT hoc chng trnh
m phng GEANT4, c hai chng trnh ny u c cc module dnh ring nhm gip cho vic
kt ni vi cc chng trnh Python c d dng hn
1
. Trong vt l nng lng cao, Python
cng thng c s dng kt hp vi ngn ng C
++
trong lp trnh x l s liu cng nh
tnh ton l thuyt.
Ti liu ny nhm gii thiu cho cc bn sinh vin v ngn ng lp trnh Python v ng dng
ca n trong lnh vc khoa hc k thut ni chung v vt l ni ring. Ba phn u ca ti liu
(Phn 2, 3, 4) cung cp cc kin thc c bn v ngn ng lp trnh Python. Phn 5 gii thiu
ti cc bn mt s gi ng dng (tnh ton s, ma trn, v th,...) ca Python trong khoa
hc k thut. Cui cng s l phn hng dn cch nhng cc gi chng trnh ca C
++
(Phn
6) v ROOT (Phn 7) vo trong Python. Hi vng cc kin thc cung cp trong ti liu ny s
gip ch cho cc bn trong vic tm hiu ngn ng Python v ng dng n vo trong cng vic
ca mnh.
2 Gii thiu Python
Python l mt ngn ng lp trnh thng dch (interpreted language) do Guido van Rossum to
ra nm 1990. Python c pht trin trong mt d n m ngun m, do t chc phi li nhun
Python Software Foundation qun l. Tn gi Python c Van Rossum t bt ngun t mt
series hi kch Monty Pythons Flying Circus ca i truyn hnh BBC c pht trong nhng
nm 1970.
Ban u, ngn ng Python c pht trin chy trn nn Unix, nhng sau n m rng
sang cc h iu hnh khc nh MacOS, Windows,... y l mt ngn ng d hc, c nhng
cu trc d liu cp cao hiu qu v hng lp trnh i tng n gin. ch tng tc,
trnh thng dch Python tng t nh cc shell
2
trong cc h iu hnh h Unix, ta c
th nhp vo tng biu thc ri g Enter, cc kt qu thc thi s c hin th ngay lp tc
1
Cc module l PyROOT (http://root.cern.ch/drupal/content/pyroot) v Geant4Py (http://geant4.
cern.ch/UserDocumentation/UsersGuides/ForApplicationDeveloper/html/apas07.html)
2
Xem thm trong ti liu Nhp mn h iu hnh Linux (http://goo.gl/11gQjF)
2
ng Nguyn Phng Ti liu ni b NMTP
(khc vi cc ngn ng nh C/C
++
v Fortran i hi phi bin dch trc khi thc thi chng
trnh). c im ny rt hu ch cho ngi mi hc, gip h tm hiu cch thc thc thi ca
chng trnh tng bc mt, hoc cc lp trnh vin chy th m lnh trong sut qu trnh
pht trin phn mm.
Mt s c im chnh ca ngn ng Python gm c
Ngn ng thng dch: bin dch chng trnh ngun theo tng phn on hoc tng cu
lnh, sau thc thi cc on m c bin dch, chng trnh ch va to ra s
khng c lu li. Do n c u im tit kim thi gian pht trin ng dng v khng
cn phi thc hin bin dch v lin kt.
Ngn ng kiu ng
3
: ngn ng m cc kiu ch c gn ln cc d liu trong thi gian
chng trnh c thc thi. Chng trnh khng kim tra cc rng buc v kiu d liu
ti thi im dch, m l ti thi im thc thi. Ngoi ra, khi s dng Python ta khng
cn phi khai bo bin, bin c xem l khai bo nu n c gn mt gi tr ln u
tin. Cn c vo mi ln gn, Python s t ng xc nh kiu d liu ca bin.
C ch cp pht b nh t ng: khng khi to gi tr ban u cho bin.
Kh nng m rng: trnh thng dch Python c th c m rng d dng vi nhng chc
nng v kiu d liu c vit trong C hoc C
++
(hoc ngn ng no c th gi c
t C). Ta cng c th m rng chc nng ca trnh thng dch, hoc lin kt cc chng
trnh Python vi cc th vin ch dng nh phn.
Tuy nhin, cng nh tt c cc ngn ng lp trnh khc, Python khng phi l khng c nhng
khuyt im
Python vn khng phi l ngn ng c xy dng nn phc v cho mc ch khoa
hc k thut do cc th vin ca n khng so snh c vi cc ngn ng chuyn su
nh Matlab/Octave, Mathematica,...
Tc thc thi chng trnh khng nhanh bng nhng ngn ng khc nh C/C
++
,
Fortran,...
Cc nhnh chnh ca ngn ng Python
CPython: c xy dng nn t ngn ng C bi Guido van Rossum
Jython: Python cho Java
IronPython: Python cho Microsoft .NET
PyMite: Python cho cc vi x l (microprocessor)
Ngoi ra, Python c cc th vin phc v cho khoa hc k thut chng hn nh
NumPy: y l th vin c vit bng cc ngn ng lp trnh cp thp nh C v Fortran
(ch yu phc v cc cc tnh ton ma trn), c xy dng da trn nn tng cc th
vin nh BLAS, LAPACK.
SciPy: th vin ny phc v cho cc tnh ton tch phn s, gii h thng phng trnh
vi phn, tnh ton ti u,...
Mathplotlib: cng c v th tng ng vi b cng c trong Matlab.
Multi-processing: gi tnh ton song song.
3
Ngc li vi ngn ng kiu ng l ngn ng kiu tnh, l ngn ng m kiu d liu phi c gn trc
khi chng trnh thc thi, chng hn nh ngn ng C/C
++
.
3
ng Nguyn Phng Ti liu ni b NMTP
3 Cch thc ci t v s dng Python
3.1 Cch ci t
i vi h iu hnh Windows: ta ci t Python bng cch sau
Ti file ci t Python cho h iu hnh Windows (c ui .msi) ti http://www.python.
org/downloads/windows/
Double click vo file v ci t theo hng dn
i vi cc h iu hnh Linux: ta ci t Python bng cch s dng cc trnh qun l
gi (package manager) ci t cc gi python2 v python2-devel (i vi Red Hat) hay
python2.x v python2.x-dev (i vi Debian).
3.2 Cch thc s dng Python
chy trnh thng dch Python, ta g lnh
python
Mt giao din tng tc s hin ra vi du nhc chnh (primary prompt) c dng >>>, v d
nh
$ python
Python 2.7.1+ (r271 :86832 , Apr 11 2011, 18:05:24)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Du nhc th cp (secondary prompt) c biu din bng du . . .
$ python
Python 2.7.1+ (r271 :86832 , Apr 11 2011, 18:05:24)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> if 1:
... print "Hello world"
...
Hello world
>>>
thot khi giao din tng tc ca Python ta s dng t hp phm tt Ctrl+D trong Linux
hay Ctrl+Z trong Windows, hoc g lnh
exit()
chy mt file script vit bng ngn ng Python (c ui .py), ta g
python script.py
Ngoi ra ta cng c th chy file script trc tip t shell. Gi s ta c mt file script c ni dung
#!/usr/bin/env python
print "Hello world"
Tip theo ta gn quyn thc thi v chy file
4
4
Xem cc hng dn v gn quyn trong Nhp mn h iu hnh Linux
4
ng Nguyn Phng Ti liu ni b NMTP
$ chmod +x hello.py
$ ./ hello.py
Hello world
4 Python c bn
4.1 C php
Mt s quy tc c php ca Python:
Ngn ng Python c phn bit ch hoa v ch thng.
K t # c tc dng comment tt c ni dung trn mt dng nm sau n.
Mt cu lnh kt thc bng vic xung dng.
Nhiu cu lnh trn cng 1 dng c tch nhau ra bi k t ;
Mt khi m lnh c xc nh bi tht vo bn trong so vi u hng.
K t \ c tc dng ni tip vi dng di n.
Cc cp ngoc c tc dng bao ton b ni dung bn trong n, cho d c vit trn
nhiu dng khc nhau.
4.2 Cc ton t c bn
Cng (+), tr (), nhn (*), chia (/), chia ly d (%) v ly tha (**)
Cc ton t gn v tng gim: =, +=, =, *=, /= (tng t nh C
++
)
Cc ton t lun l: and, or, not
Cc ton t so snh: ==, !=, <, <=, >, >= (c bit c th so snh lin tc, vd:
X < Y < Z s tr v kt qu l True nu Y nm gia X v Z)
Cc ton t thao tc trn bit: |, , &, , <<, >>
So snh con tr (pointer): is, is not
Kim tra phn t thuc tp hp: in, not in
V d:
>>> 2**3
8
>>> x = 1; x+=3; x
4
>>> [1,2] < [1,2,3]
True
>>> 'a' in [1, 'a', "hello"]
True
Lu khi dng ton t is
>>> test = "h" + "i"
>>> test is "hi"
False
>>> test == "hi"
True
5
ng Nguyn Phng Ti liu ni b NMTP
# Khong khuyen khich su dung "is" de so sanh noi dung nhu cach duoi day
>>> test = "hi"
>>> test is "hi"
True
4.3 Cc kiu d liu
Python khng kim tra kiu d liu ti thi im dch m l ti thi im thc thi, cch thc
ny c gi l duck typing hay latent typing (t ng xc nh kiu). Khi thc thi, nu mt
thao tc trn mt i tng b tht bi c ngha l i tng khng c s dng kiu thch
hp.
Bn cnh , ta cng khng cn phi khai bo bin trc khi s dng, bin c xem l khai
bo nu n c gn mt gi tr ln u tin. Cn c vo gi tr gn, Python s t ng xc
nh kiu d liu ca bin. Cc kiu d liu thng dng trong Python gm c:
int kiu s nguyn (t nht 32bit)
float kiu s thc (tng ng kiu double trong C
++
)
complex kiu s phc, phn o c vit vi hu t j hoc J (vd: 1+2j)
bool kiu boolean (True hoc False)
str chui k t (hng, tng ng const char* trong C
++
)
list kiu danh sch (tng ng std::vector trong C
++
)
tuple tng t kiu list nhng cc phn t khng thay i c (hng)
dict kiu map, l cp cc d liu c gn theo kiu t kha: gi tr (tng ng std::map
trong C
++
)
set kiu tp hp, cc phn t khng sp xp theo th t
List Kiu danh sch (list) cng tng t nh kiu array trong C
++
.
Khai bo list
v = [] # list rong
v = list() # list rong
v = [1, 2, 4, 5]
v = ['a', 'b', 'c']
v = range (4,10,2) # tra ve ket qua list tu 4 den 10, buoc nhay 2;
tuong duong v = [ 4,6,8 ]
v = [4, 2.5, 'Hi', [1,3,5]] # list hon hop
Thm phn t mi vo list
>>> v = [1,2,3]
>>> v.append (4)
>>> print v
[1, 2, 3, 4]
Xa phn t t list
>>> v.remove (2)
>>> v
[1, 3, 4]
6
ng Nguyn Phng Ti liu ni b NMTP
>>> del v[0]
>>> v
[3, 4]
Ni list
>>> v += ['a', 'b']
>>> v
[3, 4, 'a', 'b']
Xem kch thc
>>> len(v)
4
Truy cp phn t trong list
>>> v[0]
3
>>> v[0] = 'c' # gan gia tri cho phan tu dau tien
>>> v
['c', 4, 'a', 'b']
>>> v[-1] # phan tu cuoi cung
'b'
>>> v[1:3] # cac phan tu co chi so >= 1 va < 3
[4, 'a']
>>> v
['c', 4, 'a', 'b']
>>> v[1:2] # cac phan tu co chi so >= 1 va < 2
[4]
>>> v[0:2] # cac phan tu co chi so >= 0 va < 2
['c', 4]
Tuple Kiu tuple cng tng t nh list nhng cc phn t trong dy khng thay i c,
nh ngha tuple ta s dng cp ngoc trn () thay cho cp ngoc vung [].
Khai bo tuple
>>> x = (1,2,'abc')
>>> x = () # tuple rong
In ra cc phn t
>>> print x[1]
2
In ra di
>>> print len(x)
3
To tuple bng cch kt ni cc list vi nhau
>>> zip([1,2],['a','b'] ,[168 ,168])
[(1, 'a', 168), (2, 'b', 168)]
7
ng Nguyn Phng Ti liu ni b NMTP
String Kiu chui k t (string) c th c xem nh l kiu tuple ca cc k t, tuy nhin
c nhiu tnh nng hn mt tuple thng thng.
Khai bo chui: dng cc cp nhy n , nhy kp hoc ba nhy kp lin tip
trong trng hp khai bo chui trn nhiu dng
>>> a = 'Hello'
>>> b = "How are you?"
>>> c = """Hello ,
... how are you?"""
Ni chui
>>> d = a + "!"
>>> d
'Hello!'
>>> print d
Hello!
Truy cp k t trong chui
>>> d[0]
'H'
>>> d[4]
'o'
Chui con
>>> d[1:3]
'el'
>>> d[-2:]
'o!'
Tm kim
>>> d.find('e')
1
>>> d.find('ll') # tra ve vi tri cua phan tu dau tien cua chuoi
duoc tim
2
In gi tr ra chui (tng t hm printf trong C)
>>> print "%s: %5.2f" % ('Ket qua', 2.3)
Ket qua: 2.30
Lp chui
>>> 10 * 'hi '
'hi hi hi hi hi hi hi hi hi hi '
Phn chia chui (mc nh s dng khong trng phn chia)
>>> e = c.split()
>>> e
['Hello ,', 'how', 'are', 'you?']
Kt ni mt list cc chui li bng 1 (hay nhiu) k t kt ni
8
ng Nguyn Phng Ti liu ni b NMTP
>>> '--'.join(e)
'Hello ,--how --are --you?'
Dict Kiu dict c th hiu nm na nh l kiu list vi cc ch s khng phi l s nguyn.
Khai bo
k = {} # dict rong
k = dict() # dict rong
k = {'a' : 2, 'b' : 5}
Gn gi tr
>>> k = {'a' : 2, 'b' : 5}
>>> k['a']
2
>>> k['a'] = 1
>>> k['a']
1
Thm phn t
>>> k['c'] = -2
>>> k
{'a': 1, 'c': -2, 'b': 5}
>>> k.update( {'d' : 3} )
>>> k
{'a': 1, 'c': -2, 'b': 5, 'd': 3}
Xa phn t
>>> del k['a']
>>> k
{'c': -2, 'b': 5, 'd': 3}
Truy cp thng tin
>>> k.keys()
['c', 'b', 'd']
>>> k.values ()
[-2, 5, 3]
>>> k.items()
[('c', -2), ('b', 5), ('d', 3)]
Kim tra t kha
>>> k.get('c', 10) # tra ve 10 neu 'c' khong co trong k
1
>>> k.get('a', 10) # tra ve 10 neu 'a' khong co trong k
10
4.4 Cu trc iu khin
Tng t nh cc ngn ng lp trnh khc, Python cng c cc cu trc iu kin (if-then-else)
v cc cu trc lp (for, while)
9
ng Nguyn Phng Ti liu ni b NMTP
If-then-else
>>> x = int(raw_input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
... x = 0
... print 'Negative changed to zero'
... elif x == 0:
... print 'Zero'
... elif x == 1:
... print 'Single '
... else:
... print 'More'
...
More
Vng lp for
>>> words = ['cat', 'window ', 'defenestrate ']
>>> for w in words:
... print w, len(w) # thut vao trong mot khoang
...
cat 3
window 6
defenestrate 12
>>> for x in range (0,3):
... print "%d" % x # thut vao trong mot khoang
...
0
1
2
Vng lp while
>>> count = 0
>>> while (count < 9):
... print 'The count is:', count
... count = count + 1
...
print "Good bye!"
Ta c th s dng break v continue ngt hoc thot khi cc cu trc iu khin
(tng t nh C).
Ngoi ra, trong Python cn c 1 c php c bit (list comprehension) cho php thao tc
trn ton b danh sch m khng cn vit r vng lp
>>> x = [1,2,3,4]
>>> y = [xi**2 for xi in x]
>>> print y
[1, 4, 9, 16]
4.5 Hm
nh ngha hm: s dng t kha def
def <ten ham >(<cac tham so >):
"thong tin ve ham"
10
ng Nguyn Phng Ti liu ni b NMTP
...
return [ket qua]
V d:
# Dinh nghia ham
def printme( str ):
"This prints a passed string into this function"
print str;
return;
# Goi ham
printme ();
Hm tr v nhiu gi tr
>>> def powers(n):
... return n, n**2, n**3
...
>>> v = powers (2)
>>> v
(2, 4, 8)
>>> v1,v2,v3 = powers (2)
>>> v1
2
>>> v2
4
>>> v3
8
Hm khng tr v gi tr
def returns_nothing ():
pass
def returns_none ():
return None
def also_returns_none ():
return
Mt s cng c lp trnh hng hm
filter(hm, dy) tr v mt dy cha cc phn t t dy m hm c gi tr ng. Nu
dy l mt string hoc tuple, th kt qu tr v s c cng kiu; ngc li, s lun lun l
mt list.
>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
map(hm, dy) gi hm vi mi phn t trong dy v tr v mt danh sch cc gi tr
tr v.
>>> def cube(x): return x*x*x
...
11
ng Nguyn Phng Ti liu ni b NMTP
>>> map(cube , range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
reduce(hm, dy) tr v gi tr duy nht c to ra t vic gi hm vi thng s l hai
phn t u ca dy, ri sau vi gi tr tr v ny vi phn t k, v c th.
>>> def add(x,y): return x+y
...
>>> reduce(add , range(1, 11)) # tinh tong cac so tu 1 den 10
55
4.6 File
M file
>>> f=open('/directory/file', 'r')
Cc option cho lnh m file gm c: r (ch c), w (ch ghi), a (thm vo cui), r+ (c
v ghi). Ngoi ra, trong Windows c phn bit gia file dng vn bn (text) v nh phn
(binary), nu ta mun m cc file ch nh phn th cn thm k t b vo sau (vd: rb,
wb, r+b,...).
c ni dung file
>>> f.read(size)
size quy nh kch thc (tnh theo byte) ca ni dung c c, trong trng hp khng
c khai bo size ton b ni dung tp tin s c c. Nu n cui tp tin, f.read()
s tr v mt chui rng ( ).
c tng dng ni dung file
>>> f.readline ()
K t dng mi (\n) c gi li cui chui, v s ch b b qua dng cui ca tp tin
nu tp tin khng kt thc bng mt dng mi.
Mt cch khc c cc dng l lp qua i tng file
>>> for line in f:
... print line
Ghi ni dung ra file
>>> f.write(string)
Trong trng hp ni dung ghi khng phi l chui, n s cn c chuyn thnh mt
chui trc c ghi
>>> value = ('the answer ', 42)
>>> s = str(value)
>>> f.write(s)
Tm v di chuyn n v tr trong file
>>> f.tell() # cho biet vi tri hien tai trong file
>>> f.seek (5) # di chuyen den vi tri byte thu 6 tinh tu dau file
>>> f.seek(3, 0) # di chuyen den vi tri byte thu 3 tinh tu dau
file
12
ng Nguyn Phng Ti liu ni b NMTP
>>> f.seek(-3, 1) # di chuyen den vi tri byte thu 3 truoc vi tri
hien tai
>>> f.seek(-3, 2) # di chuyen den vi tri byte thu 3 tinh tu cuoi
file
ng file
>>> f.close()
4.7 Lp
nh ngha lp: s dng t kha class
class ClassName:
"thong tin ve lop"
.
.
.
V d:
class MyClass:
"""A simple example class """
i = 12345
def f(self):
return 'hello world '
Khi nh ngha mt phng thc (hm) thuc lp, ta thng s dng t kha self nh
l tham s u tin. Tuy nhin khi ta gi phng thc ca lp ny t bn ngai, ta khng
cn c t bt c th g cho tham s self, Python s t ng thm tham chiu self.
iu ny cng tng t nh con tr this trong C
++
.
Khai bo mt bin thuc lp
x = MyClass ()
Hm khi to lp phi c tn l __init__(), hm ny s t ng kch hot khi khai bo
mt bin mi thuc lp
>>> class Complex:
... def __init__(self, realpart , imagpart):
... self.r = realpart
... self.i = imagpart
...
>>> x = Complex (3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)
Hm __del__(), hm ny ch c thc hin khi vic thu gom rc trong b nh hon
tt, ngha l khi ton b cc bin tr ti i tng b mt.
Theo quy c thng dng trong Python, nu mt phn t thuc lp c bt u bi k
t _, phn t s c thuc tnh private (cc b).
Nu c bt u bi __ phn t s c thuc tnh public.
13
ng Nguyn Phng Ti liu ni b NMTP
4.8 Module
Mt module l mt file cha cc nh ngha (cc lp, cc hm,...) v cc cu lnh ca Python,
v s ch c thc thi ln u khi c nhp u . Bt k file no cng phn m rng .py
cng u l module.
V d ta c mt module tn fibo.py cha hm tnh dy s Fibonacci
def fib(n): # xuat day so Fibonacci toi gia tri n
a, b = 0, 1
while b < n:
print b,
a, b = b, a+b
Khi mt module c nhp (import), trnh thng dch s tm mt tn ca module trong th
mc hin ti, ri trong danh sch cc th mc c ch nh bi bin mi trng PYTHONPATH
5
.
Bin ny c cng c php nh l bin mi trng PATH, cng cha mt danh sch tn cc th
mc. Khi PYTHONPATH cha c thit lp, hoc khi file module khng c tm thy, vic tm
kim s tip tc tm trong ng dn mc nh ty theo khi ci Python; trn Unix, ng dn
ny thng l /usr/local/lib/python.
Lnh import l lnh dng nhp ni dung ca mt module vo trong module khc. C
php ca lnh nh sau
import filename
B dch lnh Python khi thy lnh import filename s i tm ni dung ca file filename.py,
tt c cc m lnh c trong filename.py nu c th chy c u s c thc hin. Thng
thng ta hay tt c cc lnh import trn u ca file.
V d ta mun nhp ni dung ca file fibo.py, ta g
>>> import fibo
Vic ny s khng nhp trc tip cc tn hm nh ngha trong fibo.py, n ch nhp tn module
m thi. Sau ta s dng tn module c nhp ny truy cp cc hm trong n, chng
hn nh
>>> fibo.fib (1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
Trong trng hp ta mun dng mt hm fib mt cch thng xuyn, ta c th gn n vo
mt bin cc b
>>> fib = fibo.fib
>>> fib (1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
Mt cch khc c th gi thng tn hm fib m khng cn thng qua module fibo l s
dng cu trc from ... import ...
>>> from fibo import fib
>>> fib (1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
5
thm ng dn cho bin mi trng PYTHONPATH ta c th s dng lnh export hay setenv
export PYTHONPATH=$PYTHONPATH:tenduongdan
setenv PYTHONPATH $PYTHONPATH:tenduongdan
14
ng Nguyn Phng Ti liu ni b NMTP
Bng cch ny ta phi g t hn, bi thay v fibo.fib, ta ch g fib, lm cho m lnh ri.
Nhng trong mt s trng hp dng cch ny s khng an ton (chng hn nh cc nh ngha
c cng tn nm trong cc module khc nhau), c bit trong trng hp cc chng trnh ln.
Ta cng c th nhp nhiu nh ngha t 1 module bng cch
from fibo import fib , fib1 , fib2
hoc
from fibo import *
s nhp tt c mi th trong fibo.py, tr nhng nh ngha bt u bng du gch chn _.
Tn ca module c th c truy cp qua bin ton cc __name__
>>> fibo.__name__
'fibo'
i vi trnh thng dch th chng trnh tng tc c gi l __main__, cn module c
nhp vo c tn __name__. Do nu ta mun kiu tra mt module c phi c chy khng
hay l c nhp t cu lnh khc, ta phi kim tra xem __name__ c phi l __main__ hay
khng.
Nhng lu khi thao tc vi module
Cc module cng l cc i tng (object), chng c th c s dng nh cc tham s
cho cc hm, tr li gi tr t hm,... Tn ca cc bin, hm, lp,... ca mi module cng
l cc thuc tnh ca module .
Cc dng lnh t do (khng thuc hm hay lp no) trong module s c thc hin
ngay khi module c nhp.
Mt module c th gi cc module khc, thng thng ta hay tt c cc lnh import
u module.
Python khng thc s h tr cc bin ton cc nh C/C
++
. Mt module c nhp ca
Python s khng c quyn truy cp ti cc bin ton cc trong module ra lnh nhp. Mi
module c mt bng k hiu ring ca n v c dng nh bng ton cc i vi mi
hm c nh ngha trong module . Ngi dng c th s dng cc bin ton cc trong
module m khng phi lo lng v vic trng lp vi cc bin ton cc ca module khc.
Python khng c dng che giu d liu no tng t nh private hay protected trong C
++
.
Tuy vy n cng h tr mt phn vic kiu ny.
Nu ta thm vo mt du gch _ pha trc tn bin trong mt module th bin s
khng c nhp trong trng hp ta dng lnh from ... import ...
Cc file c bin dch trong Python
Khi s dng cc module trong mi trng Python ta s thu c mt cc file c ui .pyc,
cc file ny c xem l phin bn c bin dch byte (byte-compile) ca cc module
.py. Ni dung ca cc file .pyc khng ph thuc vo h thng, do n c th c chia
s vi nhiu my trn cc kin trc khc nhau.
Khi trnh thng dch Python c chy vi flag -O (hoc -OO), m byte ti u s c to
v lu trong cc tp tin c ui .pyo (file .pyc s b b qua).
15
ng Nguyn Phng Ti liu ni b NMTP
Mt chng trnh khng chy nhanh hn khi n c c t mt file .pyc hay .pyo so vi
khi n c c t file .py; im duy nht y l cc file .pyc hay .pyo c tc np
hanh hn so vi .py.
Cc module chun Python c mt th vin cc module chun (th vin chun Python
Standard Library) cung cp cc tc v khng nm trong phm vi chnh ca ngn ng nhng
cng c to sn v hiu qu cao hoc truy cp vo nhng chc nng ca h iu hnh
(v d nh cc lnh gi h thng). Thng tin v th vin ny c th c xem ti http:
//docs.python.org/library/index.html.
Mt trong nhng module chun quan trng nht ca Python l module sys. Trong module ny
c hai bin sys.ps1 v sys.ps2 c dng nh ngha chui du nhc chnh (>>>) v ph
(. . .)
>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps1 = 'C> '
C> print 'Hello!'
Hello!
C>
Bin sys.path l mt danh sch cc chui thit lp ng dn tm kim cc module ca trnh
thng dch. N c khi to theo ng dn mc nh t bin mi trng PYTHONPATH (hoc
t mt gi tr c sn nu PYTHONPATH khng c thit lp), ta c th chnh sa n bng cch
>>> import sys
>>> sys.path.append('/afs/phuong/lib/python ')
Hm dir() c s dng tm cc tn c nh ngha trong module, v d nh
>>> dir(fibo)
['__builtins__ ', '__doc__ ', '__file__ ', '__name__ ', '__package__ ', 'fib'
]
4.9 Package
Trong trng hp nu c mt vi module c mi quan h vi nhau, ta c th xy dng cc gi
chng trnh (package). C th xem cc gi ny nh l cc th mc cha cc module.
lm cho th mc tr thnh mt gi chng trnh, ta ch cn thm mt file c tn __init__.py
vo trong th mc . File ny c th trng hoc cha mt s lnh khi to trong trng
hp cc chng trnh phc tp hn.
Gi s ta c mt gi chng trnh c cu trc nh sau
Science/
__init__.py
Math/
__init__.py
fibo.py
factorial.py
...
Physics/
__init__.py
16
ng Nguyn Phng Ti liu ni b NMTP
velocity.py
acceleration.py
...
truy cp cc gi chng trnh, ta s dng tn module c chm. V d, tn module Math.fibo
ch ra module con tn fibo trong mt gi tn Math.
Khi nhp mt gi, Python s tm trong cc th mc t sys.path tm th mc con ca gi.
Cc tp tin __init__.py l cn thit cho Python bit cc th mc cha cc gi. Ngi dng
gi ny c th nhp tng module ring l t gi, v d nh
import Science.Math.fibo
s dng cc nh ngha trong module, ta cn phi cho tham chiu u
Science.Math.fibo.fib (1000)
Ta cng c th b qua tn gi bng cch nhp
from Science.Math import fibo
Lc ny ta ch cn gi
fibo.fib (1000)
Hoc b qua c tn module bng cch nhp
from Science.Math.fibo import fib
v
fib (1000)
Trong trng hp mun s dng lnh import * nhp tt c cc module c trong gi, tt
nht ngi dng nn khai bo mt bin __all__ trong module __init__.py cha ton b cc
module cn c nhp. V d nh trong gi Math, ta c file __init__.py c ni dung nh sau
__all__ = ["fibo", "factorial"]
iu ny c ngha l hai module fibo v factorial s c nhp nu ta gi
from Science.Math import *
Vic ny tng ng vi vic nhp
import Science.Math.fibo
import Science.Math.factorial
from Science.Math import *
Bn cnh vic nhp vi a ch tuyt i, ta cng c th s dng lnh nhp tng i, chng
hn nh t module fibo ta c th nhp cc gi v module khc bng cch
from . import factorial
from .. import Physics
from .. Physics import velocity
y du chm c dng ch nh cc gi hin ti v gi m c mt trong cu lnh nhp.
17
ng Nguyn Phng Ti liu ni b NMTP
5 Cc gi Python cho khoa hc v k thut
5.1 SciPy
Mt trong nhng u im ca Python l n cung cp kh nhiu th vin cng c cho cc tnh
ton khoa hc v k thut, c th k n chng hn nh gi ng dng SciPy.
SciPy (http://www.scipy.org/index.html) l mt th vin cha cc module dnh cho khoa
hc v k thut, bao gm nhiu gi th vin nh NumPy, IPython,... SciPy cung cp cc module
v thng k, ti u ha, tch phn, i s tuyn tnh, x l tn hiu, x l hnh nh, thut ton
di truyn,. . .
Mt s gi ng dng tiu biu trong SciPy gm c
Pandas: biu th v phn tch d liu http://pandas.pydata.org/
NumPy: thc hin tnh ton s c bn http://www.numpy.org/
SciPy library: tnh ton khoa hc, gm c thng k http://www.scipy.org/scipylib/
SymPy: cc tnh ton i s http://sympy.org/en/
Matplotlib v th http://matplotlib.org/
Xem thm ti http://www.scipy.org/about.html
Cc gi ng dng trong SciPy c th ci t theo hng dn ti y http://www.scipy.org/
install.html.
5.2 NumPy
NumPy (http://www.numpy.org/) l mt gi chng trnh phc v cho cc tnh ton khoa hc
bng ngn ng lp trnh Python. s dng NumPy ta cn phi nhp gi ny thng qua lnh
import
>>> import numpy
hoc mt cng vit di tn numpy trong khi vit chng trnh, ta c th t tn rt gn
(np) bng cch
>>> import numpy as np
Mng Mt trong nhng chc nng chnh ca NumPy l lm vic vi cc i tng mng
(array). Cc mng cng tng t nh cc list trong Python, tr mt im khc bit duy nht
l cc phn t trong cng mt mng phi c cng kiu vi nhau (vd: int, float,...). Vic s
dng mng s gip cho vic x l lng ln s liu nhanh hn so vi vic dng list.
Cc cch to mt mng
Mt mng c th c to t mt list, v d nh ta c th to mng 1 chiu theo cch sau
>>> a = np.array ([1, 4, 5, 8], float)
>>> a
array([ 1., 4., 5., 8.])
hoc mng 2 chiu (ma trn)
>>> b = np.array ([[1, 2, 3], [4, 5, 6]], float)
>>> b
array ([[ 1., 2., 3.],
[ 4., 5., 6.]])
18
ng Nguyn Phng Ti liu ni b NMTP
Hoc tra c th s dng hm arange (tng t hm range trong Python)
>>> np.arange(5, dtype=float)
array([ 0., 1., 2., 3., 4.])
>>> np.arange(1, 6, 2, dtype=int)
array([1, 3, 5])
Mt s thao tc c bn vi mng
Xem kch thc v kiu d liu ca mng
>>> b.shape
(2, 3)
>>> len(b) # lenh len() chi tra ve do dai cua chieu (dimension)
dau tien cua mang
2
>>> a.dtype
dtype('float64 ')
Truy cp phn t ca mng
>>> a[3]
8.0
>>> b[0,0]
1.0
Kim tra xem gi tr c nm trong mng
>>> 1 in a
True
Thay i (reshape) mng
>>> c = a.reshape ((2 ,2)) # lenh reshape khong thay doi mang goc
>>> c
array ([[ 1., 4.],
[ 5., 8.]])
>>> c.flatten ()
array([ 1., 4., 5., 8.])
To mng con (slice) t mng c sn
>>> a[:2]
array([ 1., 4.])
>>> b[1,:]
array([ 4., 5., 6.])
>>> b[:,2]
array([ 3., 6.])
>>> b[-1:,-2:]
array ([[ 5., 6.]])
K t : dng ch rng ta s ly tt c phn t theo chiu (dimension) tng ng vi
k t
Ni mng
>>> a = np.array ([1,2], float)
>>> b = np.array ([3,4,5,6], float)
>>> c = np.array ([7,8,9], float)
>>> np.concatenate ((a, b, c))
array ([1., 2., 3., 4., 5., 6., 7., 8., 9.])
19
ng Nguyn Phng Ti liu ni b NMTP
Copy mng
>>> d = np.array ([1, 2, 3], float)
>>> e = d
>>> f = d.copy()
>>> d[0] = 0
>>> d
array ([0., 2., 3.])
>>> e
array ([0., 2., 3.])
>>> f
array ([1., 2., 3.])
Chuyn i mng thnh cc kiu cu trc d liu khc
>>> d = np.array ([1, 2, 3], float)
>>> d.tolist () # chuyen thanh list
[1.0, 2.0, 3.0]
>>> s = d.tostring () # chuyen thanh string
>>> s
'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00
\x00\x00
\x00\x00\x08@'
>>> np.fromstring(s) # chuyen nguoc lai tu string
array([ 1., 2., 3.])
Cc php ton i vi mng
Cc php ton c bn
>>> a = np.array ([1,2,3], float)
>>> b = np.array ([5,2,6], float)
>>> a + b
array ([6., 4., 9.])
>>> a - b
array([-4., 0., -3.])
>>> a * b
array ([5., 4., 18.])
>>> b / a
array ([5., 1., 2.])
>>> a % b
array ([1., 0., 3.])
>>> b**a
array ([5., 4., 216.])
Php ton trn cc phn t trong mng
>>> a = np.array ([2, 4, 3], float)
>>> a.sum()
9.0
>>> a.prod()
24.0
Tnh cc i lng thng k
>>> a = np.array ([2, 1, 9], float)
>>> a.mean() # tri trung binh
4.0
>>> a.var() # phuong sai
20
ng Nguyn Phng Ti liu ni b NMTP
12.666666666666666
>>> a.std() # do lech chuan
3.5590260840104371
Cc php ton ma trn v vector
Php nhn (v hng v c hng) hai vector hay ma trn
>>> a = np.array ([1, 2, 3], float)
>>> b = np.array ([0, 1, 1], float)
>>> np.dot(a, b)
5.0
>>> c = np.array ([[1, 1, 1], [2, 4, 0]], float)
>>> np.dot(c, a)
array([ 6., 10.])
>>> np.cross(a, b)
array([-1., -1., 1.])
Tnh nh thc, tr ring (vi module con linalg)
>>> a = np.array ([[4, 2, 0], [9, 3, 7], [1, 2, 1]], float)
>>> np.linalg.det(a) # dinh thuc
-48.000000000000007
>>> vals , vecs = np.linalg.eig(a) # tri rieng va vector tri rieng
>>> vals
array([ 8.85591316 , 1.9391628 , -2.79507597])
>>> vecs
array ([[ -0.3663565 , -0.54736745 , 0.25928158] ,
[ -0.88949768 , 0.5640176 , -0.88091903] ,
[ -0.27308752 , 0.61828231 , 0.39592263]])
Ma trn nghch o
>>> np.linalg.inv(a)
array ([[ 0.22916667 , 0.04166667 , -0.29166667] ,
[ 0.04166667 , -0.08333333 , 0.58333333] ,
[ -0.3125 , 0.125 , 0.125 ]])
5.3 Matplotlib
Matplotlib (http://matplotlib.org/) l mt gi ng dng m rng t NumPy c chc nng
v th. N cung cp mt API (giao din lp trnh ng dng) hng i tng a cc
th vo trong ng dng thng qua cc cng c nh wxPython, Qt hay GTK+.
Tng t nh vi NumPy, s dng c Matplotlib ta cn nhp n vo mi trng thng
qua lnh import
>>> import numpy as np
>>> import matplotlib.pyplot as plt
Gi s ta c hai mng x v y nh sau
>>> x = np.arange (-20., 20., 0.2)
>>> y = np.sin(x)
Lnh v th (x,y) (xem Hnh 1)
21
ng Nguyn Phng Ti liu ni b NMTP
Hnh 1: V d th c v bng Matplotlib
>>> plt.plot(x, y, 'b-', x, y, 'ro')
>>> plt.show()
Th vin Matplotlib cung cp mt s cc hm trnh by th (c th xem chi tit ti http:
//matplotlib.org/api/pyplot_summary.html), chng hn nh
plt.title('y = sin(x)')
plt.xlabel('x')
plt.ylabel('y')
plt.axis([-20, 20, -5, 5])
5.4 IPython
IPython (http://ipython.org/) l mt shell tng tc nng cao c th s dng thay th
cho shell Python thng thng. N c nhiu tnh nng h tr nh tnh tng tc cao, d s
dng, thun tin cho vic tra cu, c cc cng c h tr cho vic lp trnh song song,...
khi ng IPython ta g
$ ipython
Python 2.7.6 (default , Mar 22 2014, 22:59:38)
Type "copyright", "credits" or "license" for more information.
IPython 1.2.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython 's features.
%quickref -> Quick reference.
help -> Python 's own help system.
object? -> Details about 'object ', use 'object??' for extra details.
In [1]:
Thay v s dng du nhc lnh >>> nh Python, IPython s dng du nhc In []:. Cc
thao tc thc hin trn IPython cng tng t nh trn Python thng thng (Hnh 2).
Ngoi ra, IPython cn cung cp notebook, mt cng c dng web, vi cc tnh nng tng t
cng vi cc tnh nng tng tc th v.
khi ng IPython notebook (Hnh 3) ta g
22
ng Nguyn Phng Ti liu ni b NMTP
Hnh 2: nh chp mn hnh khi s dng IPython
$ ipython notebook
2014 -10 -08 22:07:43.800 [NotebookApp] Using existing profile dir: u'/
home/phuong /. config/ipython/profile_default '
2014 -10 -08 22:07:43.822 [NotebookApp] Using system MathJax
2014 -10 -08 22:07:43.886 [NotebookApp] Serving notebooks from local
directory: /home/phuong
2014 -10 -08 22:07:43.886 [NotebookApp] The IPython Notebook is running at
: http ://127.0.0.1:8888/
2014 -10 -08 22:07:43.887 [NotebookApp] Use Control -C to stop this server
and shut down all kernels (twice to skip confirmation).
Hnh 3: Giao din trang web ca IPython notebook
23
ng Nguyn Phng Ti liu ni b NMTP
6 Python v C
++
L mt ngn ng thng dch, Python c tc thc hin chm hn nhiu ln so vi cc ngn
ng bin dch nh Fortran, C/C
++
,... Do i vi cc tnh ton hay x l phc tp, i hi
tc thc hin nhanh, ta c th kt hp Python vi mt ngn ng khc. Trong phn ny, tc
gi s trnh by mt s cch nhng (embedding) C
++
vo trong Python v ngc li.
6.1 Nhng C
++
vo Python
C mt s cch thc hin vic nhng C
++
vo trong Python, di y l nhng cch thng
dng nht
Cch 1 S dng th vin ctypes, chc nng ca th vin ny l dng bao (wrap) cc th
vin lin kt ng ca C (dll hay so) v s dng chng trong Python. N cung cp cc dng
d liu tng ng C v cho php gi cc hm trong cc th vin C.
Gi s ta c mt lp C
++
c nh ngha trong file foo.cpp
#include <iostream >
class Foo{
public:
void bar(){
std::cout << "Hello" << std::endl;
}
};
Do ctypes ch lm vic vi cc hm C nn ta phi cung cp thm nh ngha extern C
extern "C" {
Foo* Foo_new (){ return new Foo(); }
void Foo_bar(Foo* foo){ foo ->bar(); }
}
Trong trng hp h iu hnh Windows, ta cn thm dng __declspec(dllexport) vo trong
nh ngha (ngay sau dng extern C).
Vic tip theo ta cn lm l bin dch file foo.cpp thnh mt th vin lin kt ng (c ui .so)
g++ -c -fPIC foo.cpp -o foo.o
g++ -shared -Wl,-soname ,libfoo.so -o libfoo.so foo.o
V cui cng l chng ta s vit mt lp bao (wrapper) bng Python (v d c tn l fooWrap-
per.py)
from ctypes import cdll
lib = cdll.LoadLibrary('./ libfoo.so')
class Foo(object):
def __init__(self):
self.obj = lib.Foo_new ()
def bar(self):
lib.Foo_bar(self.obj)
Sau khi nhng c lp C
++
vo, ta c th gi cc lnh trong lp ny mt cch thoi mi
24
ng Nguyn Phng Ti liu ni b NMTP
f = Foo()
f.bar()
Trong trng hp file m ngun thun C, chng hn nh file welcome.c di y
#include <stdio.h>
void welcome_msg(char *msg) {
printf("%s\n", msg);
return;
}
Ta c th bin dch thnh th vin v load trc tip trong Python
>>> from ctypes import *
>>> mylib = CDLL("./ libwelcome.so")
>>> mylib.welcome_msg("Hello !")
Hi C, I am from Python!
Cch 2 S dng cng c SWIG (Simplified Wrapper and Interface Generator) (http://www.
swig.org/), y l cng c cho php kt ni cc chng trnh vit bng C/C
++
vi cc ngn
ng lp trnh bc cao khc (Perl, Ruby, PHP, Python, Javascript,...).
Gi s ta c mt file m ngun C
++
code.cpp c ni dung nh sau
#include <vector >
#include "code.h"
using namespace std;
vector <double > average (vector < vector <double > > i_matrix) {
// tinh gia tri trung binh cua moi dong
vector <double > averages;
for (int r = 0; r < i_matrix.size(); r++){
double rsum = 0.0;
double ncols= i_matrix[r].size();
for (int c = 0; c< i_matrix[r].size(); c++){
rsum += i_matrix[r][c];
}
averages.push_back(rsum/ncols);
}
return averages;
}
v file header ca n code.h
#ifndef _code
#define _code
#include <vector >
std::vector <double > average (std::vector < std::vector <double > > i_matrix
);
#endif
Vic u tin ta cn lm l bin dch file m ngun ny
25
ng Nguyn Phng Ti liu ni b NMTP
g++ -c -fPIC code.cpp
Sau to mt file nh ngha giao din (interface definition file) SWIG c ui .i, chng hn
nh code.i
%module code
%{
#include "code.h"
%}
%include "std_vector.i"
namespace std {
%template(VecDouble) vector <double >;
%template(VecVecdouble) vector < vector <double > >;
}
%include "code.h"
S dng SWIG to ra file m ngun giao din C
++
(C
++
interface source file) t file nh
ngha giao din
swig -c++ -python code.i
Cui cng l bin dch file m ngun giao din C
++
to ra file th vin chia s
g++ -c -fPIC code_wrap.cxx -I/usr/include/python2 .7 -I/usr/lib/python2
.7
g++ -shared -Wl,-soname ,_code.so -o _code.so code.o code_wrap.o
Nhp th vin ny vo Python v s dng
import code
a= [[3 ,5 ,7] ,[8 ,10 ,12]]
print a
b = code.average(a)
print "Assignment done"
print a
print b
6.2 Gi module Python trong C
++
c th s dng cc module Python trong m ngun ca C
++
, ta cn phi s dng mt
giao din lp trnh ng dng (Application Programming Interface API). Trong trng hp
ca Python/C
++
ta s s dng giao din C-API (xem chi tit ti http://docs.python.org/
c-api/), giao din ny s cho php lp trnh vin C
++
truy cp vo trong trnh thng dch ca
Python.
s dng tt c cc nh ngha (hm, kiu d liu,...) ca C-API, ta cn phi s dng th
vin Python.h bng cch thm dng di vo u on m C
++
#include "Python.h"
Gi s ta c mt file Python mytest.py c ni dung
import math
def myabs(x):
return math.fabs(x)
26
ng Nguyn Phng Ti liu ni b NMTP
Ta to mt file test.cpp c ni dung nh sau
#include <Python.h>
int main() {
Py_Initialize ();
// . . .
// noi dung
// . . .
Py_Finalize ();
return 0;
}
nhp module Python (thng qua lnh import) ta s dng cc lnh sau
PyObject* myModuleString = PyString_FromString ((char*)"mytest");
PyObject* myModule = PyImport_Import(myModuleString);
PyObject l i tng c bn ca C-API, n i din cho tt c cc kiu d liu c bn ca
Python (int, float, string,...).
Tham chiu ti hm myabs trong Python
PyObject* myFunction = PyObject_GetAttrString(myModule ,(char*)"myabs");
PyObject* args = PyTuple_Pack (1, PyFloat_FromDouble (2.0));
Ly kt qu t hm
PyObject* myResult = PyObject_CallObject(myFunction , args);
Chuyn kt qu ny thnh gi tr trong C
++
double result = PyFloat_AsDouble(myResult);
Ta cng c th thc hin cc lnh trong trnh thng dch Python, chng hn nh
PyRun_SimpleString("import sys; sys.path.append('.')");
PyRun_SimpleString("import mytest;");
PyRun_SimpleString("print mytest.myabs (2.0)");
7 Python v ROOT
ROOT
6
l mt framework da trn ngn ng lp trnh C
++
dng cho vic phn tch v x l s
liu
7
. ROOT c pht trin vo gia nhng nm 1990 ti T chc Nghin cu Nguyn t Chu
u (CERN), v hin nay ang c s dng trong cc th nghim ti Large Hadron Collider
(LHC) v ti hu ht cc th nghim vt l nng lng cao trn th gii.
Tng t nh C
++
, ROOT cng cn lin kt vi cc module Python xy dng nn cc gi x
l s liu. Phn ny s trnh by mt cch s lc cch s dng Python trong ROOT v ngc
li.
6
Download ti http://root.cern.ch/drupal/content/downloading-root
7
Xem thm trong Hng dn s dng ROOT cho h iu hnh Windows (http://goo.gl/olLp5o)
27
ng Nguyn Phng Ti liu ni b NMTP
7.1 PyROOT
PyROOT l mt module Python cho php ngi dng tng tc vi cc lp ca ROOT t trnh
thng dch Python. Vic ny cng tng t nh cc ROOT dictionary nn khng cn phi to
cc Python wrapper a cc lp ca ROOT vo. ng thi PyROOT cng cho php ngi
dng thc thi cc lnh ca Python bn trong trnh thng dch ROOT/CINT.
ci t PyROOT, ta lm theo cc hng dn y http://wlav.web.cern.ch/wlav/
pyroot/installation.html.
Sau khi ci t PyROOT, ta c th s dng lnh import nhp cc lp ca ROOT m ta
mun dng vo trong Python, chng hn nh on code sau
from ROOT import gROOT , TCanvas , TF1
gROOT.Reset()
c1 = TCanvas( 'c1', 'Example with Formula ', 200, 10, 700, 500 )
# Tao mot ham 1-chieu va ve no
fun1 = TF1( 'fun1', 'abs(sin(x)/x)', 0, 10 )
c1.SetGridx ()
c1.SetGridy ()
fun1.Draw()
c1.Update ()
Trong trng hp ta mun a mt lp t to vo trong Python, trc tin ta cn to th vin
t lp thng qua ACLIC. V d: gi s ta c file MyClass.C c ni dung
class MyClass {
public:
MyClass(int value = 0) {
m_value = value;
}
void SetValue(int value) {
m_value = value;
}
int GetValue () {
return m_value;
}
private:
int m_value;
};
Th vin c to ra bng lnh
$ echo .L MyClass.C+ | root.exe -b
Sau load t Python
from ROOT import gSystem
# load thu vien MyClass
gSystem.Load('MyClass_C ')
# import MyClass tu ROOT
from ROOT import MyClass
# su dung lop MyClass
m = MyClass (42)
print m.GetValue ()
28
ng Nguyn Phng Ti liu ni b NMTP
Ngoi ra, ta cng c th load trc tip file macro m khng cn phi to th vin, nhng iu
ny s gii hn chng ta ch c s dng hm khi to mc nh ca lp
from ROOT import gROOT
gROOT.LoadMacro('MyClass.C')
Chi tit cch s dng PyROOT c th c tham kho ti http://wlav.web.cern.ch/wlav/
pyroot/.
7.2 S dng Python trong ROOT
Ta c th s dng Python trong ROOT/CINT bng cch s dng th vin ca PyROOT (lp
TPython
8
), chng hn nh
root [0] gSystem ->Load("libPyROOT")
root [1] TPython ::Exec( "print 1 + 1" )
2
root [2] TBrowser *b = (void*) TPython ::Eval( "ROOT.TBrowser ()" )
(class TObject *)0x8d1daa0
root [3] TPython :: Prompt () // su dung shell Python
>>> i = 2
root [4] TPython :: Prompt () // su dung shell Python
>>> print i
2
Ti liu
[1] Guido van Rossum, Bi ch dn Python (bn dch), Python Software Foundation (2006).
[2] Norman Matloff, Ti liu hng dn nhanh v ngn gn v s dng ngn ng Python (bn
dch), University of California (2006).
[3] Martin Woudstra, Basic Python Tutorial, CERN (2009).
[4] Sbastien Binet, Introduction to python, CERN (2012).
[5] M. Scott Shell, An introduction to Numpy and Scipy (2014)
http://www.engr.ucsb.edu/~shell/che210d/numpy.pdf
[6] http://www.vithon.org/tutorial/2.5/node8.html
[7] http://vi.wikipedia.org/wiki/Python_%28ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_
tr%C3%ACnh%29
[8] https://wiki.python.org/moin/BeginnersGuide/Download
[9] http://docs.python.org/2/contents.html
[10] http://opentechschool.github.io/python-data-intro/core/notebook.html
[11] http://karuppuswamy.com/wordpress/2012/01/28/
how-to-use-c-library-in-python-generating-python-wrappers-for-c-library/
[12] http://stackoverflow.com/questions/145270/calling-c-c-from-python
[13] http://stackoverflow.com/questions/3286448/
calling-a-python-method-from-c-c-and-extracting-its-return-value
[14] http://root.cern.ch/drupal/content/how-use-use-python-pyroot-interpreter
8
Xem thm ti http://root.cern.ch/root/html/TPython.html
29

You might also like