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ă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.0649999999999995
6.

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.0649999999999995
6.

  • 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]: <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.0649999999999995
9 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.0649999999999995
0

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.0649999999999995
1

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.0649999999999995
2

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.0649999999999995
3

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.0649999999999995
4

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:

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

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.0649999999999995
5

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.