Hướng dẫn how to pass a variable to a function in python - cách truyền biến vào hàm trong python
1.2.4.1. Định nghĩa chức năngIn [56]: def test(): ....: print('in test function') ....: ....: In [57]: test() in test function Show
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.
Thực hiện thuật toán Quicksort, theo định nghĩa của WikipediaCá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 " 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]: <function __main__.add_to_dict> 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 "0. 1.2.4.5. Các biến toàn cầuCá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 đổiCác hình thức đặc biệt của các tham số:
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ệuTà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ượngCác chức năng là các đối tượng hạng nhất, có nghĩa là chúng có thể:
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ìnhPhươ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ậpBà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 "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 Bạn có thể chuyển một biến cho một chức năng trong Python không?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ó.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 x chỉ tồn tại trong hàm try_to_modify.. Not the variable itself. Functions have a local variable table called a local namespace. The variable x only exists within the function try_to_modify .
Chúng ta có thể chuyển các biến cho các chức năng không?Gọi theo giá trị ở đây Các giá trị của các biến được truyền bởi hàm gọi cho hàm được gọi.Nếu bất kỳ giá trị nào của tham số trong hàm được gọi phải được sửa đổi, thay đổi sẽ chỉ được phản ánh trong hàm được gọi.the values of the variables are passed by the calling function to the called function. If any value of the parameter in the called function has to be modified the change will be reflected only in the called function. |