Học Python/Chương I
Python trên FreeBSD 7.0
sửa-Trên FreeBSD có hổ trợ Python-2.4 và Python-2.5. Bạn có thể cài đặt từ mã nguồn
- Cài đặt Python 2.4
# cd /usr/ports/lang/python24 # make install clean # python2.4 Python 2.4.4 (#2, Dec 7 2007, 13:41:55) [GCC 3.4.6 [FreeBSD] 20060305] on freebsd6 Type "help", "copyright", "credits" or "license" for more information. >>>
- Cài đặt Python 2.5
# cd /usr/ports/lang/python25 # make install clean # python2.5 Python 2.5.1 (r251:54863, Dec 2 2007, 06:39:44) [GCC 3.4.6 [FreeBSD] 20060305] on freebsd6 Type "help", "copyright", "credits" or "license" for more information. >>>
Thoát khỏi python ta dùng CTRL+D
-Cài đặt python từ mã nguồn Nếu bạn thích cài từ source, bạn có thể download python source code từ đây [1]. Chọn version cao nhất trong danh sách và download file có đuôi .tgz, sau đó dùng các lệnh configure, make, make install.
-Ví dụ install từ mã nguồn
# wget http://www.python.org/ftp/python/2.5/Python−2.5.tgz Resolving www.python.org... done. Connecting to www.python.org[194.109.137.226]:80... connected. HTTP request sent, awaiting response... 200 OK Length: 8,436,880 [application/x−tar] ... # tar xfz Python−2.5.tgz # cd Python−2.5 # ./configure checking MACHDEP... linux2 checking EXTRAPLATDIR... checking for −−without−gcc... no ... # make gcc −pthread −c −fno−strict−aliasing −DNDEBUG −g −O3 −Wall −Wstrict−prototypes −I. −I./Include −DPy_BUILD_CORE −o Modules/python.o Modules/python.c gcc −pthread −c −fno−strict−aliasing −DNDEBUG −g −O3 −Wall −Wstrict−prototypes −I. −I./Include −DPy_BUILD_CORE −o Parser/acceler.o Parser/acceler.c gcc −pthread −c −fno−strict−aliasing −DNDEBUG −g −O3 −Wall −Wstrict−prototypes −I. −I./Include −DPy_BUILD_CORE −o Parser/grammar1.o Parser/grammar1.c ... # make install /usr/bin/install −c python /usr/local/bin/python2.5 ... # python Python 2.5.1 (#2, Sep 24 2003, 11:39:14) [GCC 3.3.2 20030908 (Debian prerelease)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> [press Ctrl+D to get back to the command prompt] #
Làm việc trên cửa sổ Shell
sửaBây giờ bạn đã cài xong python, có nhưng tác động gì cửa sổ dòng lệnh shell khi bạn chạy nó?
Python nắm hai vai trò. Nó biên dịch cho script để bạn có thể chạy từ command line hoặc chạy như các ứng dụng, bằng cách double−clicking scripts. Nhưng nó cũng làm việc được ở cửa sổ dòng lệnh shell để bạn có thể đánh giá tuy ý các thành phần và những sự diễn đạt. Đây là cái vô cùng hữu dụng cho việc debug, quick hacking, và kiểm tra. Tôi còn biết vài người dùng python thay cho máy tính bỏ túi
- Ví dụ:
>>> 1 + 1 (1) 2 >>> print 'hello world' hello world (2) >>> x = 1 >>> y = 2 >>> x + y 3 (3)
(1)Python có thể tính toán các bài toán dơn giản,
(2)python có thể in ra màn hình,
(3)Bạn cũng có thể gán và khai báo các biến.
Viết Python Bằng Eclipse
sửaEclipse có trong ports của FreeBSD để cài Eclipse bạn làm như sau:
# cd /usr/ports/java/eclipse # make install clean
Sau khi cài xong bạn khởi động Eclipse bằng dòng lệnh # eclipse sẽ xuất hiện như hình dưới đây:
Sau khi eclipse khởi động xong bạn bắt đầu install Pydev theo hướng dẫn sau:
- Bạn vào link sau để download gói pydev phiên bản mới nhất, và giải nén file(Download [2]):
# unzip org.python.pydev.feature-1_3_11.zip Sau khi giải nén sẽ cho ra thư mục eclipse trong đó có 2 thư mục features và plugins, bạn chép tất cả các file và thư mục có trong 2 thư mục trên vào nơi mà bạn đã cài eclipse. Cách làm như sau: # cp -r eclipse/features/org.python.pydev.feature_1.3.11 /usr/local/eclipse/features # cd eclipse/plugins/ # cp -rf * /usr/local/eclipse/plugins
- Bạn khởi động eclipse và tiến hành cài pydev như sau:
Bạn chọn menu Window --> Preferences...
Tiếp theo bạn chọn Pydev-->Interpreter-Python. Chọn New và chọn file chạy Python2.5, chọn ok
Sau khi tạo Project xong bạn click phải vào project bạn vừa tạo để tạo file, cách làm như sau:
Sau khi điền tên file xong bạn chon Finish. Đến đây bạn đã tạo xong file để viết chương trình. Sau đây la ví dụ về cách viết trên một chương trình giải phương trình bậc 2 trên eclipse bằng ngôn ngữ Python:
Để chạy chương trình bạn click phải vào vùng viết code và chon Run as --> Python run
Kết quả sẽ được hiện thị như sau :
Chuỗi
sửaNgoài số, Python còn làm việc được với chuỗi, có thể được biểu hiện theo nhiều cách. Chúng có thể được kẹp trong dấu nháy đơn, đôi:
>>> 'welcome' 'welcome' >>> 'doesn\'t' "doesn't" >>> "doesn't" "doesn't" >>> '"Chao," cac ban.' '"Chao," cac ban.' >>> "\"Chao,\" cac ban." '"Chao," cac ban.' >>> '"Isn\'t," she said.' '"Isn\'t," she said.'
Các chuỗi có thể phủ nhiều dòng theo nhiều cách. Các dòng tiếp tục (continuation line) có thể được dùng, với một dấu suỵt huyền là ký tự cuối cùng trên một dòng cho biết rằng dòng kế là sự nối tiếp của dòng này:
hello = "This is a rather long string containing\n\ several lines of text just as you would do in C.\n\ Note that whitespace at the beginning of the line is\ significant."
print hello
Lưu ý rằng các dòng mới vẫn cần được chèn trong chuỗi với \n; ký tự dòng mới theo sau dấu suỵt huyền sẽ bị bỏ qua. Ví dụ này sẽ in ra:
This is a rather long string containing several lines of text just as you would do in C. Note that whitespace at the beginning of the line is significant.
Tuy nhiên, nếu ta làm cho chuỗi trực tiếp thành chuỗi ``thô, các dãy \n sẽ không được chuyển thành các dòng mới, nhưng dấu suỵt huyền ở cuối dòng, và ký tự dòng mới trong nguồn, sẽ đều được thêm vào trong chuỗi như dữ liệu. Cho nên, ví dụ:
hello = r"This is a rather long string containing\n\ several lines of text much as you would do in C."
print hello
sẽ in:
This is a rather long string containing\n\ several lines of text much as you would do in C.
Hoặc, các chuỗi có thể được vây quanh trong một cặp nháy ba: """ hoặc . Cuỗi mỗi dòng không cần thêm dấu suỵt huyền khi dùng nháy ba, và chúng sẽ có mặt trong chuỗi.
print """ Usage: thingy [OPTIONS] -h Display this usage message -H hostname Hostname to connect to """
xuất ra:
Usage: thingy [OPTIONS] -h Display this usage message -H hostname Hostname to connect to
Trình thông dịch in ra kết quả của các tác vụ chuỗi theo cùng cách như khi chúng được nhập vào: trong dấu nháy, và với các ký tự dấu nháy hay đặc biệt khác được thoát nghĩa (escape) bằng dấu suỵt huyền, để hiện giá trị thực. Chuỗi được kèm trong dấu nháy đôi nếu chuỗi chứa một dấu nháy đơn và không chứa dấu nháy đôi, ngoài ra nó sẽ được chứa trong các dấu nháy đơn. (Câu lệnh print , được giải thích sau, có thể dùng để viết các chuỗi không có dấu nháy hoặc thoát nghĩa.)
Các chuỗi có thể được nối với nhau với toán tử + , và được lặp lại với *:
>>> word = 'Help' + 'A' >>> word 'HelpA' >>> '<' + word*5 + '>' '<HelpAHelpAHelpAHelpAHelpA>'
Hai chuỗi trực tiếp kế nhau được tự động nối với nhau; dòng đầu tiên bên trên có thể được biết "word = 'Help' 'A'"; việc này chỉ có tác dụng với hai chuỗi trực tiếp (string literal), không có tác dụng với các biểu thức chuỗi bất kỳ khác:
>>> 'str' 'ing' # <- This is ok 'string' >>> 'str'.strip() + 'ing' # <- This is ok 'string' >>> 'str'.strip() 'ing' # <- This is invalid File "<stdin>", line 1, in ? 'str'.strip() 'ing' ^
SyntaxError: invalid syntax
Các chuỗi có thể được chỉ mục (subscript hoặc index); như trong C, ký tự đầu tiên của một chuỗi có chỉ mục 0. Không có kiểu ký tự riêng; một ký tự chỉ đơn giản là một chuỗi có độ dài là một. Như trong Icon, chuỗi con có thể được chỉ định theo cách viết cắt lát (slice notation): hai chỉ mục phân cách bởi một dấu hai chấm.
>>> word[4] 'A' >>> word[0:2] 'He' >>> word[2:4] 'lp'
Các chỉ mục cắt lát có giá trị mặc định hữu dụng; chỉ mục đầu tiên có giá trị mặc định là không, chỉ mục thứ hai mặc định là kích thước của chuỗi đang bị cắt.
>>> word[:2] # The first two characters
'He'
>>> word[2:] # Everything except the first two characters
'lpA'
Không như C, các chuỗi Python không thể bị thay đổi. Phép gán vào một vị trí chỉ mục trong một chuỗi sẽ gây ra lỗi:
>>> word[0] = 'x' Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: object doesn't support item assignment >>> word[:1] = 'Splat' Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: object doesn't support slice assignment
Tuy nhiên, việc tạo một chuỗi với nội dung gộp chung cũng dễ và hiệu quả:
>>> 'x' + word[1:] 'xelpA' >>> 'Splat' + word[4] 'SplatA'
Đây là một tính chất bất biến hữu dụng khác của tác vụ cắt lát: s[:i] + s[i:] bằng s.
>>> word[:2] + word[2:] 'HelpA' >>> word[:3] + word[3:] 'HelpA'
Các chỉ mục cắt lát giảm sinh (degenerate) được xử lý rất khéo: một chỉ mục quá lớn sẽ được thay bằng kích thước chuỗi, một giới hạn trên nhỏ hơn giới hạn dưới trả về một chuỗi rỗng.
>>> word[1:100] 'elpA' >>> word[10:] >>> word[2:1]
Các chỉ mục có thể là số âm, để bắt đầu đếm từ bên phải. Ví dụ:
>>> word[-1] # The last character 'A' >>> word[-2] # The last-but-one character 'p' >>> word[-2:] # The last two characters 'pA' >>> word[:-2] # Everything except the last two characters 'Hel'
Nhưng lưu ý rằng -0 thật ra cũng là 0, cho nên nó không bắt đầu đếm từ bên phải!
>>> word[-0] # (since -0 equals 0) 'H'
Các chỉ mục cắt lát âm ngoài phạm vi thì bị thu ngắn, nhưng đừng thử kiểu này với các chỉ mục một phần từ (không phải cắt lát):
>>> word[-100:] 'HelpA' >>> word[-10] # error Traceback (most recent call last): File "<stdin>", line 1, in ? IndexError: string index out of range
Cách tốt nhất để nhớ hoạt động của cắt lát là nghĩ về các chỉ mục như đang trỏ vào giữa các ký tự, với cạnh trái của ký tự đầu tiên là 0. Sau đó cạnh phải của ký tự cuối cùng của một chuỗi của n ký tự có chỉ mục n, ví dụ:
+---+---+---+---+---+ | H | e | l | p | A | +---+---+---+---+---+ 0 1 2 3 4 5 -5 -4 -3 -2 -1
Các số hàng đầu cho biết vị trí của các chỉ mục 0...5 trong chuỗi; dòng thứ hai cho biết các chỉ mục âm tương ứng. Một lát từ i tới j chứa toàn bộ các ký tự giữa các cạnh đánh số i và jtương ứng.
Với các chỉ mục không âm, chiều dài của lát là hiệu của các chỉ mục, nếu cả hai đều trong giới hạn. Ví dụ, độ dài của word[1:3] là 2.
Hàm có sẵn len() trả về độ dài của một chuỗi:
>>> s = 'supercalifragilisticexpialidocious' >>> len(s) 34
Danh Sách
sửaPython biết một số kiểu dữ liệu gộp (compound) , dùng để nhóm các giá trị với nhau. Kiểu linh hoạt nhất là danh sách (list), có thể được viết như là một danh sách các giá trị phân cách bởi dấu phẩy ở giữa ngoặc vuông.
>>> a = ['hallo', 'good', 100, 1234] >>> a
['hallo', 'good', 100, 1234]
Cũng như các chỉ mục chuỗi, chỉ mục danh sách bắt đầu từ 0, và danh sách có thể được cắt lát, gộm và vân vân:
>>> a[0] 'hallo' >>> a[3] 1234 >>> a[-2] 100 >>> a[1:-1] ['good', 100] >>> a[:2] + ['bacon', 2*2] ['hallo', 'good', 'bacon', 4] >>> 3*a[:3] + ['Boo!'] ['hallo', 'good', 100, 'hallo', 'good', 100, 'hallo', 'good', 100, 'Boo!']
Không như chuỗi, là những đối tượng immutable (bất biến, không thể thay đổi), ta có thể thay đổi các phần tử của một danh sách:
>>> a ['hallo', 'good', 100, 1234] >>> a[2] = a[2] + 23 >>> a ['hallo', 'good', 123, 1234]
Gán vào các cắt lát cũng có thể làm được, và nó có thể thay đổi kích thước của danh sách hoặc xóa sách nó.
>>> # Replace some items: ... a[0:2] = [1, 12] >>> a [1, 12, 123, 1234] >>> # Remove some: ... a[0:2] = [] >>> a [123, 1234] >>> # Insert some: ... a[1:1] = ['bletch', 'xyzzy'] >>> a [123, 'bletch', 'xyzzy', 1234] >>> # Insert (a copy of) itself at the beginning >>> a[:0] = a >>> a [123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234] >>> # Clear the list: replace all items with an empty list >>> a[:] = [] >>> a []
Hàm có sẵn len() cũng áp dụng vào danh sách:
>>> len(a) 8
Có thể lồng các danh sách (tạo danh sách chứa các danh sách khác), ví dụ:
>>> q = [2, 3] >>> p = [1, q, 4] >>> len(p) 3 >>> p[1] [2, 3] >>> p[1][0] 2 >>> p[1].append('xtra') # See section 5.1 >>> p [1, [2, 3, 'xtra'], 4] >>> q [2, 3, 'xtra']
Lưu ý trong ví dụ, p[1] và q thật ra chỉ tới cùng đối tượng! Chúng ta sẽ nói về nghĩa của đối tượng (object semantics) trong các chương sau.