1.2.4.1. Định nghĩa chức năng
In [56]: def test[]: ....: print['in test function'] ....: ....: In [57]: test[] in test function
Cảnh báo
Các khối chức năng phải được thụt vào dưới dạng các khối dòng điều khiển khác.
1.2.4.2. Trở lại tuyên bố
Các chức năng có thể tùy chọn trả về các giá trị.
In [6]: def disk_area[radius]: ...: return 3.14 * radius * radius ...: In [8]: disk_area[1.5] Out[8]: 7.0649999999999995
Ghi chú
Theo mặc định, các chức năng trả về
In [6]: def disk_area[radius]: ...: return 3.14 * radius * radius ...: In [8]: disk_area[1.5] Out[8]: 7.06499999999999956.
Ghi chú
Theo mặc định, các chức năng trả về
In [6]: def disk_area[radius]: ...: return 3.14 * radius * radius ...: In [8]: disk_area[1.5] Out[8]: 7.06499999999999956.
- Lưu ý cú pháp để xác định hàm:
- Từ khóa
In [6]: def disk_area[radius]: ...: return 3.14 * radius * radius ...: In [8]: disk_area[1.5] Out[8]: 7.0649999999999995
7;name, then - được theo sau bởi tên chức năng, sau đó
- Các đối số của hàm được đưa ra giữa các dấu ngoặc đơn sau đó là một đại tràng.
- cơ thể chức năng;
Thực hiện thuật toán Quicksort, theo định nghĩa của Wikipedia
Các tham số bắt buộc [đối số vị trí]
In [81]: def double_it[x]: ....: return x * 2 ....: In [82]: double_it[3] Out[82]: 6 In [83]: double_it[] --------------------------------------------------------------------------- Traceback [most recent call last]: File "", line 1, in TypeError: double_it[] takes exactly 1 argument [0 given]
Tham số tùy chọn [từ khóa hoặc đối số được đặt tên]
In [84]: def double_it[x=2]: ....: return x * 2 ....: In [85]: double_it[] Out[85]: 4 In [86]: double_it[3] Out[86]: 6
Đối số từ khóa cho phép bạn chỉ định các giá trị mặc định.
Cảnh báo
Các giá trị mặc định được đánh giá khi hàm được xác định, không phải khi nó được gọi. Điều này có thể có vấn đề khi sử dụng các loại có thể thay đổi [ví dụ: từ điển hoặc danh sách] và sửa đổi chúng trong cơ thể chức năng, vì các sửa đổi sẽ tồn tại trong các lời mời của hàm.
Sử dụng một loại bất biến trong đối số từ khóa:
In [124]: bigx = 10 In [125]: def double_it[x=bigx]: .....: return x * 2 .....: In [126]: bigx = 1e9 # Now really big In [128]: double_it[] Out[128]: 20
Sử dụng một loại có thể thay đổi trong đối số từ khóa [và sửa đổi nó bên trong cơ thể chức năng]:
In [2]: def add_to_dict[args={'a': 1, 'b': 2}]: ...: for i in args.keys[]: ...: args[i] += 1 ...: print[args] ...: In [3]: add_to_dict Out[3]: In [4]: add_to_dict[] {'a': 2, 'b': 3} In [5]: add_to_dict[] {'a': 3, 'b': 4} In [6]: add_to_dict[] {'a': 4, 'b': 5}
Mẹo
Liên quan hơn là ví dụ thực hiện cắt lát Python:
In [98]: def slicer[seq, start=None, stop=None, step=None]: ....: """Implement basic python slicing.""" ....: return seq[start:stop:step] ....: In [101]: rhyme = 'one fish, two fish, red fish, blue fish'.split[] In [102]: rhyme Out[102]: ['one', 'fish,', 'two', 'fish,', 'red', 'fish,', 'blue', 'fish'] In [103]: slicer[rhyme] Out[103]: ['one', 'fish,', 'two', 'fish,', 'red', 'fish,', 'blue', 'fish'] In [104]: slicer[rhyme, step=2] Out[104]: ['one', 'two', 'red', 'blue'] In [105]: slicer[rhyme, 1, step=2] Out[105]: ['fish,', 'fish,', 'fish,', 'fish'] In [106]: slicer[rhyme, start=1, stop=4, step=2] Out[106]: ['fish,', 'fish,']
Thứ tự của các đối số từ khóa không quan trọng:
In [107]: slicer[rhyme, step=2, start=1, stop=4] Out[107]: ['fish,', 'fish,']
Nhưng đó là cách thực hành tốt để sử dụng cùng một thứ tự như định nghĩa chức năng.
Đối số từ khóa là một tính năng rất thuận tiện để xác định các hàm với số lượng đối số thay đổi, đặc biệt là khi các giá trị mặc định được sử dụng trong hầu hết các cuộc gọi đến hàm.
1.2.4.4. Đi qua giá trị
Mẹo
Bạn có thể sửa đổi giá trị của một biến bên trong một hàm không? Hầu hết các ngôn ngữ [C, Java, Tiết] phân biệt các lần vượt qua bằng giá trị và đường đi qua bởi tham chiếu. Trong Python, một sự khác biệt như vậy có phần giả tạo, và nó hơi tinh tế cho dù các biến của bạn sẽ được sửa đổi hay không. May mắn thay, tồn tại các quy tắc rõ ràng.
Các tham số cho các hàm là các tham chiếu đến các đối tượng, được truyền theo giá trị. Khi bạn chuyển một biến cho một hàm, Python sẽ chuyển tham chiếu đến đối tượng mà biến đề cập đến [giá trị]. Không phải là biến chính nó.value]. Not the variable itself.
Nếu giá trị được truyền trong một hàm là bất biến, hàm không sửa đổi biến người gọi. Nếu giá trị có thể thay đổi, hàm có thể sửa đổi biến người gọi tại chỗ:value passed in a function is immutable, the function does not modify the caller’s variable. If the value is mutable, the function may modify the caller’s variable in-place:
>>> def try_to_modify[x, y, z]: ... x = 23 ... y.append[42] ... z = [99] # new reference ... print[x] ... print[y] ... print[z] ... >>> a = 77 # immutable variable >>> b = [99] # mutable variable >>> c = [28] >>> try_to_modify[a, b, c] 23 [99, 42] [99] >>> print[a] 77 >>> print[b] [99, 42] >>> print[c] [28]
Các chức năng có một bảng biến cục bộ gọi là không gian tên cục bộ.
Biến
In [6]: def disk_area[radius]: ...: return 3.14 * radius * radius ...: In [8]: disk_area[1.5] Out[8]: 7.06499999999999959 chỉ tồn tại trong hàm
In [81]: def double_it[x]: ....: return x * 2 ....: In [82]: double_it[3] Out[82]: 6 In [83]: double_it[] --------------------------------------------------------------------------- Traceback [most recent call last]: File "", line 1, in TypeError: double_it[] takes exactly 1 argument [0 given]0.
1.2.4.5. Các biến toàn cầu
Các biến được khai báo bên ngoài hàm có thể được tham chiếu trong hàm:
In [114]: x = 5 In [115]: def addx[y]: .....: return x + y .....: In [116]: addx[10] Out[116]: 15
Nhưng các biến số toàn cầu của người Viking này không thể được sửa đổi trong hàm, trừ khi được tuyên bố toàn cầu trong hàm.global in the function.
Điều này không hoạt động:
In [6]: def disk_area[radius]: ...: return 3.14 * radius * radius ...: In [8]: disk_area[1.5] Out[8]: 7.06499999999999950
Những công việc này:
In [6]: def disk_area[radius]: ...: return 3.14 * radius * radius ...: In [8]: disk_area[1.5] Out[8]: 7.06499999999999951
1.2.4.6. Số lượng tham số biến đổi
Các hình thức đặc biệt của các tham số:In [81]: def double_it[x]: ....: return x * 2 ....: In [82]: double_it[3] Out[82]: 6 In [83]: double_it[] --------------------------------------------------------------------------- Traceback [most recent call last]: File "", line 1, in TypeError: double_it[] takes exactly 1 argument [0 given]
1: Bất kỳ số lượng đối số vị trí nào được đóng gói thành một bộIn [81]: def double_it[x]: ....: return x * 2 ....: In [82]: double_it[3] Out[82]: 6 In [83]: double_it[] --------------------------------------------------------------------------- Traceback [most recent call last]: File "", line 1, in TypeError: double_it[] takes exactly 1 argument [0 given]
2: Bất kỳ số lượng đối số từ khóa nào được đóng gói vào từ điển
In [6]: def disk_area[radius]: ...: return 3.14 * radius * radius ...: In [8]: disk_area[1.5] Out[8]: 7.06499999999999952
1.2.4.7. Tài liệu
Tài liệu về những gì chức năng làm và các tham số của nó. Hội nghị chung:
In [6]: def disk_area[radius]: ...: return 3.14 * radius * radius ...: In [8]: disk_area[1.5] Out[8]: 7.06499999999999953
1.2.4.8. Các chức năng là đối tượng
Các chức năng là các đối tượng hạng nhất, có nghĩa là chúng có thể:- được gán cho một biến
- một mục trong danh sách [hoặc bất kỳ bộ sưu tập nào]
- được truyền như một lập luận cho một chức năng khác.
In [6]: def disk_area[radius]: ...: return 3.14 * radius * radius ...: In [8]: disk_area[1.5] Out[8]: 7.06499999999999954
1.2.4.9.Phương pháp bình
Phương pháp là các hàm gắn liền với các đối tượng.Bạn đã thấy những điều này trong các ví dụ của chúng tôi về danh sách, từ điển, chuỗi, v.v ...
1.2.4.10.Bài tập
Bài tập: Trình tự Fibonacci
Viết một hàm hiển thị các Điều khoản đầu tiên của
In [81]: def double_it[x]: ....: return x * 2 ....: In [82]: double_it[3] Out[82]: 6 In [83]: double_it[] --------------------------------------------------------------------------- Traceback [most recent call last]: File "", line 1, in TypeError: double_it[] takes exactly 1 argument [0 given]3 của chuỗi Fibonacci, được xác định bởi:
Tập thể dục: Quicksort
Thực hiện thuật toán Quicksort, theo định nghĩa của Wikipedia
In [6]: def disk_area[radius]: ...: return 3.14 * radius * radius ...: In [8]: disk_area[1.5] Out[8]: 7.06499999999999955