Page 29 - Python Simple
P. 29

4. Bàn thêm về luồng điều khiển                                  http://www.vithon.org/tutorial/2.5/node6.html



             Chúng ta có thể tạo một hàm in ra dãy Fibonacci:
                >>> def fib(n):    # write Fibonacci series up to n
                ...     """Print a Fibonacci series up to n."""
                ...     a, b = 0, 1
                ...     while b < n:
                ...         print b,
                ...         a, b = b, a+b
                ...
                >>> # Now call the function we just defined:
                ... fib(2000)
                1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

             Từ khóa def khai báo một định nghĩa hàm . Nó phải được theo sau bởi tên hàm, và một danh sách các
             thông số chính quy trong ngoặc đơn. Các câu lệnh tạo nên thân hàm bắt đầu từ dòng kế tiếp, và bắt
             buộc phải được thụt vào. Câu lệnh đầu tiên của thân hàm có thể là một chuỗi; chuỗi này là chuỗi tài
             liệu, hoặc docstringcủa hàm.

             Có những công cụ sử dụng docstrings để tự động sinh tài liệu trực tuyến hoặc để in, hoặc cho phép
             người dùng duyệt mã một cách tương tác; việc thêm docstrings vào mã rất được khuyến khích, cho nên
             bạn hãy tạo thói quen tốt đó cho mình.
             Việc thực thi một hàm tạo ra một bảng ký hiệu mới dùng cho các biến cục bộ của hàm. Chính xác hơn,
             mọi phép gán biến trong một hàm chứa giá trị vào bảng ký hiệu cục bộ; và các tham chiếu biến sẽ trước
             hết tìm trong bảng ký hiệu cục bộ rồi trong bảng ký hiệu toàn cục, và trong bảng các tên có sẵn. Do
             đó, các biến toàn cục không thể được gán giá trị trực tiếp trong một hàm (trừ khi được đặt trong câu
             lệnh global ), mặc dù chúng có thể dược tham chiếu tới.

             Thông số thật sự của một lệnh gọi hàm được tạo ra trong bảng ký hiệu cục bộ của hàm được gọi khi nó
             được gọi; do đó các thông số được truyền theo truyền theo giá trị (call by value) (mà giá trị luôn là một
             tham chiếu đối tượng, không phải là giá trị của đối tượng). 4.1  Khi một hàm gọi một hàm khác, một bảng
             ký hiệu cục bộ được tạo ra cho lệnh gọi đó.

             Một định nghĩa hàm tạo tên hàm trong bảng ký hiệu hiện tại. Giá trị của tên hàm có một kiểu được
             nhận ra bởi trình thông dịch là hàm do người dùng định nghĩa. Giá trị này có thể được gán vào một tên
             khác và sau đó có thể được sử dụng như một hàm. Đây là một cách đổi tên tổng quát:
                >>> fib
                <function fib at 10042ed0>
                >>> f = fib
                >>> f(100)
                1 1 2 3 5 8 13 21 34 55 89

             Bạn có thể nói rằng fib không phải là một hàm (function) mà là một thủ tục (procedure). Trong
             Python, cũng như C, thủ tục chẳng qua là hàm không có giá trị trả về. Thật sự, nói rõ hơn một chút,
             thủ tục cũng trả về giá trị mặc dù là một giá trị vô nghĩa. Giá trị này được gọi là None (nó là một tên có
             sẵn). In ra giá trị None thường bị trình thông dịch bỏ qua nếu nó là giá trị duy nhất được in ra. Bạn có
             thể thấy nó nếu bạn muốn:
                >>> print fib(0)
                None

             Bạn cũng có thể dễ dàng viết một hàm trả về một danh sách các số của dãy Fibonacci thay vì in nó ra:

                >>> def fib2(n): # return Fibonacci series up to n
                ...     """Return a list containing the Fibonacci series up to n."""
                ...     result = []
                ...     a, b = 0, 1
                ...     while b < n:
                ...         result.append(b)    # see below
                ...         a, b = b, a+b
                ...     return result
                ...
                >>> f100 = fib2(100)    # call it
                >>> f100                # write the result
                [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]



     3 of 7                                                                                   08/31/2011 07:39 AM
   24   25   26   27   28   29   30   31   32   33   34