Python cho người Việt

Python cho người Việt

..and..or..

written by Phạm Thị Minh Hoài, on Jan 2, 2010 11:25:00 PM.

Trong bài viết trước về Phần tử không tôi có nói về việc cần phải cẩn thận khi dùng phép toán có tương tác giữa phần tử không và None. Trong bài này tôi trình bày một ví dụ nhỏ minh họa rõ hơn một vấn đề mà nhiều bạn mới học có thể gặp phải. Đó là phép toán rút gọn ..and..or.. khi có sự tham gia của None.

Cấu trúc if.. else và phép gán giá trị theo điều kiện trong python:

if condition:
        x = somevalue
else:
        x = othervalue

Có thể được viết trên một dòng:

x = condition and somevalue or othervalue

Ví dụ:

>>> x = 1+1*2 == 3 and "OK" or "DUREX"
>>> x
'OK'

Thực tế có nhiều bạn thích cách viết này. Vì nó gọn hơn và mang tính python hơn. Tuy nhiên hãy cẩn thận khi sử dụng cấu trúc này. Chẳng hạn trong cấu trúc:

x = condition and func1() or func2()

Hàm func1()func2() có thể có giá trị None, khi đó kết quả kỳ vọng có thể không như bạn mong muốn. Xét ví dụ:

def func1():
        return None

def func2():
        return "some value"

x = 1 + 1 == 2 and func1() or func2()
print x

Kết quả:

some value

Biểu thức logic là True song vì func1() == None nên x = True and None or func2() = “some value”

Vì vậy hãy cẩn thận khi dùng cấu trúc ..and..or.. trừ khi bạn biết rõ các giá trị tham gia biểu thức này luôn luôn khác None.

Từ phiên bản 2.5 trở đi Python hỗ trợ cấu trúc:

x = TrueValue if Condition else FalseValue

Ví dụ:

x = "OK" if 1+1 == 2 else "DUREX"

Hoaiptm.

Lập trình web với Python (2)

written by Nguyễn Thành Nam, on Jan 1, 2010 10:05:04 AM.

Cài đặt Python

Sau khi cài đặt máy chủ web Apache, chúng ta cần cài đặt trình thông dịch Python. Chúng ta sẽ sử dụng phiên bản 2.6.4 trong chuỗi bài viết này. Bộ cài đặt Python 2.6.4 có thể được tải về từ http://www.python.org/download/.

Khi thực thi phần cài đặt, chúng ta sẽ gặp một hộp thoại như sau:

/static/web-programming/install-python/python-install-1.png

Chọn Install for all users và nhấn nút Next để tiếp tới hình chụp sau:

/static/web-programming/install-python/python-install-2.png

Nếu bạn muốn cài đặt vào nơi khác thì chọn đường dẫn, nếu không thì chúng ta sẽ sử dụng đường dẫn mặc định C:\Python26. Nhấn nút Next để tiếp tục.

/static/web-programming/install-python/python-install-3.png

Chúng ta sẽ nhấn tiếp Next ở hộp thoại này để bắt đầu quá trình cài đặt các phần thông dụng như trình thông dịch, tài liệu, ví dụ…

/static/web-programming/install-python/python-install-4.png

Hộp thoại trên cho chúng ta biết quá trình cài đặt đang diễn ra.

/static/web-programming/install-python/python-install-5.png

Khi kết thúc, chúng ta chỉ cần nhấn nút Finish.

Để kiểm tra Python có được cài vào máy chưa thì chúng ta sẽ cần mở màn hình dấu nhắc lệnh (command prompt) bằng cách nhấn vào nút Start và nhập cmd.exe sau đó gõ phím Enter như bình bên dưới.

/static/web-programming/install-python/python-install-6.png

Chúng ta sẽ nhận được một cửa sổ dòng lệnh. Nhập vào cửa sổ dòng lệnh c:\Python26\python.exe thì chúng ta sẽ thấy rằng trình thông dịch Python được thực thi, và nó hiện ra một dấu nhắc tương tác (interactive prompt) như trong hình sau:

/static/web-programming/install-python/python-install-7.png

Ngay tại đây chúng ta có thể nhập một câu lệnh Python print 'web programming in python'. Câu lệnh này sẽ được thực hiện và kết quả là chúng ta sẽ nhận được chuỗi web programming in python in ra trên màn hình như hình sau:

/static/web-programming/install-python/python-install-8.png

Để thoát khỏi trình thông dịch Python, chúng ta sẽ nhập vào dòng lệnh quit().

/static/web-programming/install-python/python-install-9.png

Để thoát khỏi dấu nhắc dòng lệnh thì chúng ta nhập tiếp lệnh exit.

Như vậy, chúng ta đã thật sự hoàn tất việc cài đặt trình thông dịch Python. Nếu bạn có nhu cầu tìm hiểu thêm về ngôn ngữ và các thư viện đi kèm thì bài chỉ dẫn Python 2.5 bằng tiếng Việt có lẽ sẽ giúp ích nhiều cho bạn.

Chúng ta sẽ sẵn sàng cho chương trình web đầu tiên trong bài viết sau! Hẹn gặp lại và chúc mừng năm mới.

Phần tử không trong python

written by Phạm Thị Minh Hoài, on Dec 25, 2009 1:30:00 PM.

Bài viết này nêu lên một số khía cạnh thú vị (nhưng cũng rắc rối) của kiểu dữ liệu None cùng các phép toán liên quan đến nó, qua đó giúp các bạn mới học hiểu sâu sắc hơn về các kiểu dữ liệu có trong Python. Bài viết này có sử dụng một số khái niệm có trong lý thuyết nhóm chỉ nhằm mục đích minh họa những ý đồ của người viết.

1. Khái niệm phần tử không

Trong lý thuyết nhóm có khái niệm về phần tử không hay phần tử trung hòa. Phần tử không θ của một tập S trên phép toán * là phần tử thỏa mãn: a*θ = θ*a = a với mọi a trên S.

Các kiểu dữ liệu cơ bản trong Python cũng có phần tử không như vậy. Xem bảng tổng kết sau:

Kiểu dữ liệuPhép toánPhần tử khôngVí dụ
Số nguyên+00 + 69 = 69 + 0
Số thực+0.00.0 + 96.0 = 96.0 + 0.0
Danh sách+, extend[][1] + [] = [] + [1] = [1]
tuple+()(1,) + () = () + (1,) = (1,)
Tập hợpunionset([])set([1]).union(set([])) = set([]).union(set([1])) = set([1])
Chuỗi+“”“abc” + “” = “” + “abc” = “abc”
Từ điểnupdate{}{1:1}.update({}) == {}.update({1:1}) = {1:1}
Số phức+0+ 0j
LogicorFalseFalse or True = True or False = True

2. None và các toán tử logic

None là một tập hợp đặc biệt, chỉ có chính nó, mà cũng không phải là chính nó. Không phải là chính nó vì None bao hàm ý nghĩa là thiếu giá trị (denoting lack of value):

>>> type(None)
<type 'NoneType'>

None tương tác với tất cả các phần tử không:

>>> assert(([] and None) == [])
>>> assert(({} and None) == {})
>>> assert((0.0 and None) == 0.0)
>>> assert(("" and None) == "")
>>> assert((set([]) and None) == set([]))
>>> assert((() and None) == ())
>>> assert((0j and None) == 0J)
>>> assert((False and None) == False)

Nếu ta gọi S là tập hợp các phần tử không, bao gồm chính None, thì với phép toán and, None chính là phần tử không bên phải của S. Ai bảo None không phải là giá trị.

Tuy nhiên:

>>> assert((None and []) == None)
>>> assert((None and {}) == None)
>>> assert((None and set([])) == None)
>>> assert((None and "") == None)
>>> assert((None and 0) == None) 

Tương tự:

>>> assert((None or set([])) == set([]))
>>> assert((None or []) == [])
>>> assert((None or {}) == {})
>>> assert((None or "") == "")
>>> assert((None or 0) == 0)
>>> assert((None or 0j) == 0j)
>>> assert((None or ()) == ())

Nghĩa là None là phần tử không bên phải đối với tập S nói trên trong phép toán or.

Và:

>>> assert(({} or None) is None)
>>> assert(([] or None) is None)
>>> assert((0 or None) is None)
>>> assert((set([]) or None) is None)
>>> assert(("" or None) is None)
>>> assert((0j or None) is None)
>>> assert((() or None) is None)
>>> assert((0.0 or None) is None)

Như vậy khi None tương tác với các phần tử không, thứ tự các toán hạng là điều bạn cần chú ý.

Phép toán or giữa None và object bất kỳ không phải là phần tử không là ánh xạ đồng nhất bất kể thứ tự phép toán:

>>> set(['a']) or None
set(['a'])
>>> None or set(['a'])
set(['a'])
>>> None or "abc"
'abc'
>>> "abc" or None
'abc'
>>> None or {1:1}
{1: 1}
>>> {1:1} or None
{1: 1}

Phép toán and thì luôn cho kết quả None với bất kỳ phần tử nào không phải là phần tử không, không kể thứ tự toán hạng:

>>> assert((None and 1) is None)
>>> assert((1 and None) is None)
>>> assert(([1] and None) is None)
>>> assert((None and [1]) is None)
>>> assert(("abc" and None) is None)
>>> assert((None and "abc") is None)

Một biểu thức Logic chứa None có thể trả về None, nghĩa là không có giá trị. Điều này làm cho None trong python trở lên phức tạp và không giống với null trong C# hay nothing trong VB.NET. Trong VB.NET một biểu thức logic luôn luôn trả về giá trị logic.

None là tận cùng, là nhỏ hơn tất cả.

>>> None < 0.0 == 0 < {} < [1] < "" < ()
True

None không có bất kỳ một method nào, thậm chí chính nó là một method khi được dùng với filter hoặc map (xem phần dưới).

Cuối cùng NoneNone - đừng băn khoăn (^-^):

>>> None is None
True
>>> None == None
True

Việc hiểu rõ bản chất của None cùng các tương tác của nó với các phần tử không qua các phép toán logic là RẤT quan trọng khi bạn viết các lệnh if, filter…

Một hàm bất kỳ có thể trả về None nếu bạn viết return None, hoặc không return ở bất kỳ chỗ nào trong hàm. Một hàm như vậy khi tham gia vào biểu thực logic sẽ tạo ra những hiệu ứng mà bạn cần phải nắm rõ bản chất.

3. Loại bỏ các phần tử không trong danh sách

Nói chung các phần tử không sẽ không có ý nghĩa khi nó nằm trong danh sách. Một trong những cách để loại bỏ phần tử không là dùng filter. filter cùng với hàm func sẽ loại bỏ tất cả các phần tử trong danh sách mà tác động của hàm func lên phần tử này tạo ra phần tử không. Diễn giải dễ hiểu của nó như sau:

filter(func, list) 

<==>

S = [0, 0.0, [], (), {}, set([]), "", 0j, False]
def filter(func, list):
    return [x for x in list if func(x) not in S]

Ví dụ:

>>> filter(lambda x: not x, [3, 4, False, True, {1: 0}, []])
[False, []]

Để loại bỏ các phần tử không trong danh sách L, đơn giản là bạn dùng hàm ánh xạ đồng nhất f(x) = x: filter(lambda x: x, L). Hàm này tương đương với:

def filter(func, list):
    return [x for x in list if x not in S]

Cuối cùng một cách viết gây khó hiểu là thay thế lambda x:x bằng hàm None.

filter(None, list) <==> filter(lambda x: x, list)

Ví dụ:

>>> filter(None, [0, 0.0, "", 0+0j, set([]), (), [], {}, False])
[]
>>> filter(None, ["", "abc", " "])
['abc', ' ']
>>> filter(None, [1, 0, 2, 0.0])
[1, 2]

Ở đây chúng ta có cảm giác như None được dùng như một hàm. Thực ra không phải vậy, None có nghĩa là không có hàm nào ở đây cả, nói cách khác đối số đầu tiên của filter bị khuyết. Python lúc đó sẽ dùng hàm mặc định gì đó tương tự như lambda x: x.

4. Dùng None với map

>>> map(None, [1, 2, {1:2}])
[1, 2, {1: 2}]

map không thay đổi danh sách khi nó bị khuyết hàm tác động. Khi đó hàm None tương đương với ánh xạ đồng nhất (mặc dù không chính xác, vì thực ra là không có hàm nào cả, python có thể đã sử dụng hàm mặc định). Tuy nhiên dùng hàm None khi có hai danh sách trở lên thì lại tạo ra khả năng đặc biệt.

>>> map(None, [1, 2], [3, 4])
[(1, 3), (2, 4)]
>>> map(None, [1, 2], [3, 4], [5, 6])
[(1, 3, 5), (2, 4, 6)]

Khả năng này tương đương với zip

>>> zip([1, 2], [3, 4], [5, 6])
[(1, 3, 5), (2, 4, 6)]
>>> zip([1, 2], [3, 4])
[(1, 3), (2, 4)]

Diễn giải của nó như sau:

>>> map(lambda x, y: (x, y), [1, 2], [3, 4])
[(1, 3), (2, 4)]
>>> map(lambda x, y, z: (x, y, z), [1, 2], [3, 4], [5, 6])
[(1, 3, 5), (2, 4, 6)]

Một lần nữa trong mục này, mặc dù None bao hàm ý nghĩa về sự khuyết giá trị, song trong triển khai của hàm bất kỳ việc khuyết giá trị dẫn đến việc sử dụng các hàm mặc định. Lúc đó None có ý nghĩa là những gì mặc định. Đôi khi có thể ngắn gọn coi nó cũng là một hàm đặc biệt, hàm None.

Chú ý quan trọng: Các test của bài viết này được thử trên python 2.5.x

Hoaiptm.

Lập trình web với Python (1)

written by Nguyễn Thành Nam, on Dec 17, 2009 4:07:00 PM.

Trong loạt bài lập trình web với Python, tôi sẽ hướng dẫn bạn đọc những thao tác cơ bản từ việc cài đặt, cấu hình, cho đến lập trình, hoàn thành một ứng dụng web đơn giản. Qua quá trình đó, bạn đọc sẽ được giới thiệu về kỹ thuật CGI, đến FastCGI và cuối cùng là WSGI.

Cài đặt máy chủ web Apache

Để lập trình web, chúng ta cần một máy chủ phục vụ web. Máy chủ Apache HTTP là một trong những phần mềm máy chủ web phổ dụng trên Internet. Chúng ta sẽ cần tải bản cài đặt phần mềm này về. Tôi sẽ sử dụng phiên bản 2.2.14 (apache_2.2.14-win32-x86-openssl-0.9.8k.msi) cho các bài viết trong loạt bài này. Hệ điều hành tôi đang sử dụng là Windows 7.

Khi chạy tập tin cài đặt, chúng ta sẽ gặp giao diện như sau:

/static/web-programming/install-apache/apache-install-1.png

Nhấn vào nút Next để qua màn hình kế:

/static/web-programming/install-apache/apache-install-2.png

Chọn ô đầu tiên để đồng ý với cam kết bản quyền, và nhấn nút Next để qua trang kế:

/static/web-programming/install-apache/apache-install-3.png

Tiếp tục nhấn nút Next:

/static/web-programming/install-apache/apache-install-4.png

Điền thông tin vào các ô trống như trong hình ví dụ, và nhấn Next:

/static/web-programming/install-apache/apache-install-5.png

Chọn kiểu cài đặt Typical và nhấn nút Next:

/static/web-programming/install-apache/apache-install-6.png

Nếu bạn muốn thay đổi đường dẫn cài đặt thì bạn sẽ chỉnh trong trang này, còn không thì nhấn nút Next:

/static/web-programming/install-apache/apache-install-7.png

Nhấn nút Install để bắt đầu quá trình cài đặt:

/static/web-programming/install-apache/apache-install-8.png

Chúng ta sẽ được thông báo về quá trình cài đặt.

/static/web-programming/install-apache/apache-install-9.png

Sau khi cài đặt hoàn thành, nhấn Finish để kết thúc:

/static/web-programming/install-apache/apache-install-10.png

Nhấn vào nút Start và nhập vào services.msc như hình trên để kiểm tra sự tồn tại của máy chủ web Apache2:

/static/web-programming/install-apache/apache-install-11.png

Như hình trên, dịch vụ Apache2 đã được chạy (started). Để kiểm tra thì chúng ta sẽ mở Internet Explorer (IE) lên và truy cập vào địa chỉ http://localhost. Nếu bạn nhận được kết quả như hình bên dưới đây thì bạn đã hoàn thành việc cài đặt máy chủ web Apache rồi đó.

/static/web-programming/install-apache/apache-install-12.png

Trong bài tới chúng ta sẽ tiếp tục thực hiện việc cài đặt Python.

In chuỗi unicode ra màn hình

written by Nguyễn Thành Nam, on Dec 16, 2009 9:33:45 PM.

Một ngày nào đấy, có lẽ bạn sẽ rất bực mình khi gặp phải một lỗi tương tự như sau:

c:\tmp>c:\Python26\python.exe helloworld.py
Traceback (most recent call last):
  File "helloworld.py", line 3, in <module>
    print u"Xin chào bạn, Python!"
  File "c:\Python26\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u1ea1' in position
 10: character maps to <undefined>

c:\tmp>

Mã nguồn của helloworld.py chỉ đơn giản như sau:

# -*- encoding: utf-8 -*-

print u"Xin chào bạn, Python!"

Lỗi này xảy ra vì chúng ta đang in một chuỗi unicode, với các ký tự nằm ngoài bảng mã ASCII (hoặc bảng mã mặc định của màn hình hiện tại).

Khi gặp phải các ký tự nằm ngoài bảng mã này, Python mặc định sẽ nâng một biệt lệ cho biết chính xác đó là ký tự nào, nằm ở vị trí nào. Như ví dụ trên, đó là ký tự có mã unicode là 1EA1 nằm tại vị trí thứ 10 (vị trí bắt đầu là 0) trong chuỗi Xin chào bạn, Python!.

Có một số cách để khắc phục lỗi này, từ việc thay đổi một số biến môi trường, cho đến việc sửa từng dòng lệnh. Tất cả đều nhằm một mục đích là chuyển chuỗi unicode cần in thành chuỗi byte theo bảng mã UTF-8.

  • Thay đổi biến môi trường: Biến môi trường PYTHONIOENCODING được dùng để định nghĩa bảng mã cho các bộ nhập chuẩn, bộ xuất chuẩn, và bộ lỗi chuẩn (stdin, stdout, stderr). Chúng ta có thể định nghĩa biến môi trường này thành utf-8 như sau:
c:\tmp>set PYTHONIOENCODING=utf-8

c:\tmp>c:\Python26\python.exe helloworld.py
Xin chào bạn, Python!

c:\tmp>
  • Thay đổi bộ xuất chuẩn: Bộ xuất chuẩn (sys.stdout) có thể được “gói” trong bảng mã mới thông qua mô-đun codecs.
# -*- encoding: utf-8 -*-
import codecs
import sys

writer_factory = codecs.getwriter("utf-8")
sys.stdout = writer_factory(sys.stdout)

print u"Xin chào bạn, Python!"
c:\tmp>c:\Python26\python helloworld.py
Xin chào bạn, Python!

c:\tmp>
  • Thay đổi từng dòng lệnh print:
# -*- encoding: utf-8 -*-
print u"Xin chào bạn, Python!".encode("utf-8")
c:\tmp>c:\Python26\python helloworld.py
Xin chào bạn, Python!

c:\tmp>

Như chúng ta thấy, cách nào cũng dẫn đến cùng một kết quả mong muốn. Việc áp dụng cách nào sẽ phụ thuộc vào hoàn cảnh của từng chương trình.

Các bản cài đặt (implementation) của Python

written by Võ Đức Phương, on Dec 14, 2009 11:09:00 AM.

Có lẽ với nhiều người, khi nhắc tới Python sẽ chỉ nghĩ đến trình thông dịch được tải về từ trang web chính thức của ngôn ngữ này: www.python.org. Thế nhưng để đến với ngôn ngữ lập trình Python thì không chỉ có “con đường” đó. Là một chuẩn ngôn ngữ lập trình, Python có rất nhiều bản cài đặt khác nhau, với những mục tiêu cũng như những điểm mạnh, yếu khác nhau. Bài viết này sẽ giới thiệu một trong số những bản cài đặt đó, mong rằng nó sẽ hữu ích đối với những người muốn sử dụng Python nhưng vì một lí do nào đó mà không sử dụng được trình thông dịch chuẩn.

1- CPython:
Phiên bản mới nhất: 2.6 và 3.1
Đây chính là trình thông dịch chuẩn của Python, được coi là bản cài đặt tham chiếu cho ngôn ngữ này. Được viết bằng C và thực thi mã thông qua một trình thông dịch mã trung gian (bytecode interpreter). Là bản cài đặt chính thức, CPython có những tính năng mới nhất của Python, tuy nhiên bị hạn chế về một số mặt như tốc độ.

2- Jython:
Phiên bản mới nhất: 2.5
Được viết bằng Java, chương trình Python sử dụng các lớp của Java (Java class) thay vì mô đun của Python. Ngoài hầu hết các mô đun trong thư viện chuẩn Python, Jython có một ưu điểm rất lớn là có thể sử dụng các lớp trong thư viện chuẩn của Java. Mã lệnh của Jython không được biên dịch ra dạng Python bytecode như CPython mà sang dạng Java bytecode tương tự như các chương trình Java, và tất nhiên mã lệnh này phải được thực thi bởi máy ảo Java chứ không phải trình thông dịch như trong trường hợp của CPython.

3- IronPython:
Phiên bản mới nhất: 2.0, 2.6 (alpha)
Cũng tương tự như Jython, nhưng thay vì được biên dịch ra Java bytecode mà thực thi bởi máy ảo Java, mã lệnh một chương trình IronPython được biên dịch sang dạng CIL (Common Intermediate Language) và thực thi bởi máy ảo .NET. Một chương trình viết bằng IronPython có thể sử dụng được các lớp của khung chương trình .Net, do vậy IronPython rất hữu dụng trong việc tích hợp vào một hệ thống viết bằng .Net .

4- Psyco:
Phiên bản mới nhất: 1.6
Là một bản cài đặt đặc biệt sử dụng phương thức biên dịch tức thời (Just in time compiling) nhằm cải thiện tốc độ thực thi của Python. Tùy thuộc vào loại tác vụ mà Psyco có thể tăng tốc từ 1,5 đến hơn 40 lần.

5- PyPy:
Phiên bản mới nhất: 1.1
Tiền thân là Psyco, PyPy được viết trên một tập con các lệnh của Python (restricted Python - RPython) nhằm nâng cao tính đa nền tảng so với Psyco, ngoài ra việc sử dụng chính Python để viết khiến cho việc thay đổi và tối ưu đơn giản hơn. Cũng như người tiền nhiệm, PyPy là một trình biên dịch tức thời cho phép cải thiện tốc độ thực thi so với CPython. Tuy bắt đầu là một dự án mang tính nghiên cứu nhưng vì thấy được những ưu điểm của PyPy, hiện các tác giả của PyPy đang tập trung vào việc tương thích với CPython nhằm đưa PyPy vào sử dụng trong thực tiễn.

6- Unladen Swallow:
Phiên bản mới nhất: 2009Q3 (alpha)
Là một dự án đặc biệt của Google cũng nhằm tăng tốc độ thực thi của Python, nhưng khác với Psyco hay Pypy là dựa trên nền tảng LLVM. Unladen Swallow có mục đích là tăng ít nhất gấp 5 lần tốc độ của CPython. Điều này sẽ rất có lợi cho Google, do hãng này ứng dụng Python rất nhiều.

Ngoài những bản cài đặt ở trên, ngôn ngữ Python còn rất nhiều bản cài đặt khác như Stackless Python hay WPython v.v… tuy nhiên những bản cài đặt này thường có ứng dụng hẹp hơn, do vậy bài viết chỉ xin giới thiệu những bản cài đặt trên, mong rằng nếu như bạn không ưng ý với CPython thì giờ đây bạn có thể đến với Python theo một cách khác!

Python 2.7 alpha

written by Võ Đức Phương, on Dec 8, 2009 10:38:00 AM.

Phiên bản thử nghiệm alpha của Python 2.7 đã được phát hành, phiên bản này không có thêm chức năng gì mới mà chủ yếu là sửa chữa lỗi cộng với việc backport các tính năng của python 3000 về lại, đây cũng sẽ là phiên bản cuối cùng của dòng Python 2.

Theo đề xuất mới đây của Guido Van Rossum thì ngôn ngữ Python (cú pháp, thư viện tích hợp v.v…) sẽ tạm dừng phát triển trong vòng ít nhất 2 năm để cho các cài đặt khác của python như PyPy, Jython có thời gian để đuổi kịp nhánh cài đặt chính là CPython. Chính vì vậy mà 2 phiên bản 2.7 và 3.2 sẽ không có thay đổi gì quan trọng mà chỉ chủ yếu để sửa lỗi hay các nâng cấp nhỏ.

Thông tin chi tiết về phiên bản Python 2.7 có tại: http://www.python.org/download/releases/2.7/

Đóng băng ứng dụng với cx_Freeze

written by Nguyễn Thành Nam, on Dec 1, 2009 12:54:13 PM.

Python là ngôn ngữ thông dịch nên để chạy các ứng dụng viết bằng Python, chúng ta cần phải cài bộ thông dịch. Thao tác này hơi luộm thuộm đối với người dùng cuối, nên thông thường chúng ta hay tự hỏi liệu có cách nào đó để chuyển ứng dụng của chúng ta thành một tập tin .EXE như các ứng dụng Windows khác không.

Rất may mắn là chúng ta có thể đạt được mục đích này với chương trình cx_Freeze.

Chúng ta sẽ bắt đầu với một ví dụ đơn giản. Hãy tạo một tập tin helloworld.py với nội dung sau:

# helloworld.py
print "Hello World!"

Khi chạy chương trình bé nhỏ này (giả sử nó đang nằm trong thư mục c:\tmp, chúng ta nhận kết quả như sau:

c:\tmp>c:\Python26\python helloworld.py
Hello World!

c:\tmp>

Bây giờ chúng ta sẽ cài đặt cx_Freeze. Đối với ví dụ trên, chúng ta sẽ phải chọn bản cài đặt cho Windows, và cho phiên bản Python 2.6. Sau khi cài đặt cx_Freeze thì tập tin thực thi sẽ được đặt trong c:\python26\scripts\cxfreeze.

Để đóng băng chương trình helloworld.py, chúng ta thực hiện lệnh cxfreeze helloworld.py:

c:\tmp>c:\Python26\scripts\cxfreeze helloworld.py
coyping c:\python26\lib\site-packages\cx_Freeze\bases\Console.exe -> c:\tmp\dist
\helloworld.exe
coyping C:\Windows\system32\python26.dll -> c:\tmp\dist\python26.dll
writing zip file c:\tmp\dist\helloworld.exe

  Name                      File
  ----                      ----
m StringIO
m UserDict
m __builtin__
m __future__
m __main__                  helloworld.py
m _abcoll
m _bisect
m _codecs
m _codecs_cn
m _codecs_hk
m _codecs_iso2022
m _codecs_jp
m _codecs_kr
m _codecs_tw
m _collections
m _functools
m _heapq
m _locale
m _multibytecodec
m _random
m _sre
m _strptime
m _struct
m _subprocess
m _threading_local
m _warnings
m abc
m array
m base64
m bdb
m binascii
m bisect
m bz2                       c:\python26\DLLs\bz2.pyd
m cPickle
m cStringIO
m calendar
m cmd
m codecs
m collections
m copy
m copy_reg
m cx_Freeze__init__         c:\python26\lib\site-packages\cx_Freeze\initscripts\
Console.py
m datetime
m difflib
m dis
m doctest
m dummy_thread
P encodings
m encodings.aliases
m encodings.ascii
m encodings.base64_codec
m encodings.big5
m encodings.big5hkscs
m encodings.bz2_codec
m encodings.charmap
m encodings.cp037
m encodings.cp1006
m encodings.cp1026
m encodings.cp1140
m encodings.cp1250
m encodings.cp1251
m encodings.cp1252
m encodings.cp1253
m encodings.cp1254
m encodings.cp1255
m encodings.cp1256
m encodings.cp1257
m encodings.cp1258
m encodings.cp424
m encodings.cp437
m encodings.cp500
m encodings.cp737
m encodings.cp775
m encodings.cp850
m encodings.cp852
m encodings.cp855
m encodings.cp856
m encodings.cp857
m encodings.cp860
m encodings.cp861
m encodings.cp862
m encodings.cp863
m encodings.cp864
m encodings.cp865
m encodings.cp866
m encodings.cp869
m encodings.cp874
m encodings.cp875
m encodings.cp932
m encodings.cp949
m encodings.cp950
m encodings.euc_jis_2004
m encodings.euc_jisx0213
m encodings.euc_jp
m encodings.euc_kr
m encodings.gb18030
m encodings.gb2312
m encodings.gbk
m encodings.hex_codec
m encodings.hp_roman8
m encodings.hz
m encodings.idna
m encodings.iso2022_jp
m encodings.iso2022_jp_1
m encodings.iso2022_jp_2
m encodings.iso2022_jp_2004
m encodings.iso2022_jp_3
m encodings.iso2022_jp_ext
m encodings.iso2022_kr
m encodings.iso8859_1
m encodings.iso8859_10
m encodings.iso8859_11
m encodings.iso8859_13
m encodings.iso8859_14
m encodings.iso8859_15
m encodings.iso8859_16
m encodings.iso8859_2
m encodings.iso8859_3
m encodings.iso8859_4
m encodings.iso8859_5
m encodings.iso8859_6
m encodings.iso8859_7
m encodings.iso8859_8
m encodings.iso8859_9
m encodings.johab
m encodings.koi8_r
m encodings.koi8_u
m encodings.latin_1
m encodings.mac_arabic
m encodings.mac_centeuro
m encodings.mac_croatian
m encodings.mac_cyrillic
m encodings.mac_farsi
m encodings.mac_greek
m encodings.mac_iceland
m encodings.mac_latin2
m encodings.mac_roman
m encodings.mac_romanian
m encodings.mac_turkish
m encodings.mbcs
m encodings.palmos
m encodings.ptcp154
m encodings.punycode
m encodings.quopri_codec
m encodings.raw_unicode_escape
m encodings.rot_13
m encodings.shift_jis
m encodings.shift_jis_2004
m encodings.shift_jisx0213
m encodings.string_escape
m encodings.tis_620
m encodings.undefined
m encodings.unicode_escape
m encodings.unicode_internal
m encodings.utf_16
m encodings.utf_16_be
m encodings.utf_16_le
m encodings.utf_32
m encodings.utf_32_be
m encodings.utf_32_le
m encodings.utf_7
m encodings.utf_8
m encodings.utf_8_sig
m encodings.uu_codec
m encodings.zlib_codec
m errno
m functools
m gc
m genericpath
m getopt
m gettext
m heapq
m imp
m inspect
m itertools
m keyword
m linecache
m locale
m marshal
m math
m msvcrt
m nt
m ntpath
m opcode
m operator
m optparse
m os
m pdb
m pickle
m posixpath
m pprint
m quopri
m random
m re
m repr
m select                    c:\python26\DLLs\select.pyd
m shlex
m signal
m sre_compile
m sre_constants
m sre_parse
m stat
m string
m stringprep
m strop
m struct
m subprocess
m sys
m tempfile
m textwrap
m thread
m threading
m time
m token
m tokenize
m traceback
m types
m unicodedata               c:\python26\DLLs\unicodedata.pyd
m unittest
m warnings
m zipimport
m zlib

coyping c:\python26\DLLs\bz2.pyd -> c:\tmp\dist\bz2.pyd
coyping c:\python26\DLLs\select.pyd -> c:\tmp\dist\select.pyd
coyping c:\python26\DLLs\unicodedata.pyd -> c:\tmp\dist\unicodedata.pyd

c:\tmp>

Kết quả của lệnh này là helloworld.py được đóng băng trong thư mục dist:

c:\tmp>dir /s dist
 Volume in drive C is OS
 Volume Serial Number is B07D-8588

 Directory of c:\tmp\dist

12/01/2009  12:42 PM    <DIR>          .
12/01/2009  12:42 PM    <DIR>          ..
12/01/2009  12:42 PM            71,168 bz2.pyd
12/01/2009  12:42 PM         1,423,792 helloworld.exe
12/01/2009  12:42 PM         2,149,888 python26.dll
12/01/2009  12:42 PM            11,776 select.pyd
12/01/2009  12:42 PM           585,728 unicodedata.pyd
               5 File(s)      4,242,352 bytes

     Total Files Listed:
               5 File(s)      4,242,352 bytes
               2 Dir(s)  118,923,808,768 bytes free

c:\tmp>

Và bây giờ chúng ta có thể đóng gói, hoặc nén các tập tin trong thư mục này để chuyển đến người dùng cuối. Tập tin thực thi chính của chúng ta chính là helloworld.exe.

c:\tmp>cd dist

c:\tmp\dist>helloworld.exe
Hello World!

c:\tmp\dist>

cx_Freeze còn nhận một số tham số dòng lệnh khác. Bạn có thể tham khảo thêm bằng cách chạy cxfreeze --help.

Ngoài cx_Freeze còn có một số công cụ khác có chức năng tương tụ ví dụ như py2exe.

Vithon hoạt động trở lại

written by vithon, on Nov 25, 2009 2:52:00 PM.

Trong vài ngày qua, vì máy chủ cần được nâng cấp nên trang mạng vithon.org đã tạm ngừng hoạt động. Trong khi chờ đợi máy chủ nâng cấp hoàn thành, trang vithon.org đã được di dời qua một máy chủ mới.

Các bài viết và thảo luận diễn đàn đã được sao lưu đầy đủ. Nhóm Python cho người Việt sẽ tải dần tất cả những bài viết và thảo luận diễn đàn lên trang mạng trong các ngày tới.

Các bạn thành viên cũ có quyền cập nhật trang mạng xin vui lòng liên lạc quản trị để cấp lại tài khoản trên hệ thống Zine này.

Chân thành cáo lỗi cùng các bạn vì sự bất tiện này.

Hội thảo PyCon khu vực Châu Á - Thái Bình Dương 2010

written by vithon, on Oct 28, 2009 3:15:00 AM.

PyCon APAC 2010

Hội thảo PyCon Asia Pacific sẽ được tổ chức tại Singapore vào ngày 09 đến 11 tháng 06 năm 2010. Ngày 09 sẽ dành cho các bài hướng dẫn và ngày 10, 11 sẽ dành cho các bài thảo luận.

Ban tổ chức kêu gọi sự tham gia của các cá nhân, tập thể trong các bài hướng dẫn lẫn các bài tham luận hội thảo về tất cả các khía cạnh của Python – từ lập trình không chuyên đến lập trình chuyên nghiệp, về các ứng dụng hoặc khung phần mềm, và bạn sử dụng Python như thế nào trong công việc.

Các diễn giả lần đầu, đặc biệt là những diễn giả từ khu vực châu Á, được khuyến khích gửi bài cho ban tổ chức.

Thông tin thêm về hội thảo PyCon Châu Á - Thái Bình Dương có thể được tìm thấy tại http://apac.pycon.org/