Hàm được gọi trong Python có nghĩa là gì?

Tìm hiểu nghệ thuật viết các hàm của riêng bạn bằng Python, cũng như các khái niệm chính như xác định phạm vi và xử lý lỗi

Xem chi tiết Mũi tên phải

bắt đầu khóa học

Viết hàm trong Python

Người bắt đầu

4 giờ

62. 7k

Học cách sử dụng các phương pháp hay nhất để viết các hàm phức tạp, có thể bảo trì, tái sử dụng với tài liệu tốt

Một đối tượng có thể gọi được là một đối tượng có thể chấp nhận một số đối số [còn được gọi là tham số] và có thể trả về một đối tượng [thường là một bộ chứa nhiều đối tượng]

Một hàm là đối tượng có thể gọi được đơn giản nhất trong Python, nhưng cũng có những đối tượng khác, chẳng hạn như các lớp hoặc các thể hiện lớp nhất định

Định Nghĩa Các Hàm[sửa | sửa mã nguồn]. sửa nguồn]

Một hàm được định nghĩa trong Python theo định dạng sau

def functionname[arg1, arg2, ...]:
    statement1
    statement2
    ...

>>> def functionname[arg1,arg2]:
..     return arg1+arg2
...
>>> t = functionname[24,24] # Result: 48

Nếu một hàm không có đối số, nó vẫn phải bao gồm các dấu ngoặc đơn, nhưng không có gì trong đó

def functionname[]:
    statement1
    statement2
    ...

Các đối số trong định nghĩa hàm liên kết các đối số được truyền khi gọi hàm [i. e. khi hàm được gọi], được gọi là tham số thực, với tên được đặt khi hàm được xác định, được gọi là tham số hình thức. Phần bên trong của hàm không có kiến ​​​​thức về tên được đặt cho các tham số thực tế;

Ví dụ, một hàm có thể 'trả về' một giá trị

Một hàm có thể xác định các biến trong thân hàm, được coi là 'cục bộ' của hàm. Các cục bộ cùng với các đối số bao gồm tất cả các biến trong phạm vi của hàm. Bất kỳ tên nào trong hàm đều không bị ràng buộc khi hàm trả về hoặc đến cuối thân hàm

Bạn có thể trả về nhiều giá trị như sau

def first2items[list1]:
  return list1[0], list1[1]
a, b = first2items[["Hello", "world", "hi", "universe"]]
print[a + " " + b]

từ khóa. trả về nhiều giá trị, nhiều giá trị trả về

Khi gọi một hàm nhận một số giá trị để xử lý thêm, chúng ta cần gửi một số giá trị dưới dạng Đối số hàm. Ví dụ

>>> def find_max[a,b]:
   if[a > b]:
      return str[a] + " is greater than " + str[b]
   elif[b > a]:
      return str[b] + " is greater than " + str[a]
>>> find_max[30, 45]  #Here [30, 45] are the arguments passing for finding max between this two numbers
The output will be: 45 is greater than 30

Giá trị đối số mặc định[sửa | sửa mã nguồn]. sửa nguồn]

Nếu bất kỳ tham số hình thức nào trong định nghĩa hàm được khai báo với định dạng "arg = value", thì bạn sẽ có tùy chọn không chỉ định giá trị cho các đối số đó khi gọi hàm. Nếu bạn không chỉ định giá trị thì tham số đó sẽ có giá trị mặc định được cung cấp khi hàm thực thi

>>> def display_message[message, truncate_after=4]:
..     print[message[:truncate_after]]
...
>>> display_message["message"]
mess
>>> display_message["message", 6]
messag

liên kết

Danh sách đối số có độ dài thay đổi[sửa | sửa mã nguồn]. sửa nguồn]

Python cho phép bạn khai báo hai đối số đặc biệt cho phép bạn tạo danh sách đối số có độ dài tùy ý. Điều này có nghĩa là mỗi lần bạn gọi hàm, bạn có thể chỉ định bất kỳ số đối số nào trên một số nhất định

def function[first,second,*remaining]:
    statement1
    statement2
    ...

Khi gọi hàm trên, bạn phải cung cấp giá trị cho từng đối số trong hai đối số đầu tiên. Tuy nhiên, vì tham số thứ ba được đánh dấu bằng dấu hoa thị nên bất kỳ tham số thực tế nào sau hai tham số đầu tiên sẽ được đóng gói thành một bộ và được liên kết với "còn lại. "

>>> def print_tail[first,*tail]:
..     print[tail]
...
>>> print_tail[1, 5, 2, "omega"]
[5, 2, 'omega']

Nếu chúng ta khai báo một tham số hình thức có tiền tố là hai dấu hoa thị, thì nó sẽ được liên kết với một từ điển chứa bất kỳ đối số từ khóa nào trong các tham số thực tế không tương ứng với bất kỳ tham số hình thức nào. Chẳng hạn, xét hàm

________số 8

Nếu chúng ta gọi hàm này với bất kỳ đối số từ khóa nào ngoài max_length, chúng sẽ được đặt trong từ điển "mục nhập. " Nếu chúng tôi bao gồm đối số từ khóa của max_length, nó sẽ được liên kết với tham số chính thức max_length, như thường lệ

>>> make_dictionary[max_length=2, key1=5, key2=7, key3=9]
{'key3': 9, 'key2': 7}

liên kết

Theo giá trị và theo tham chiếu[sửa | sửa mã nguồn]. sửa nguồn]

Các đối tượng được truyền dưới dạng đối số cho các hàm được truyền theo tham chiếu; . Do đó, việc chuyển một danh sách lớn dưới dạng đối số không liên quan đến việc sao chép tất cả các thành viên của nó sang một vị trí mới trong bộ nhớ. Lưu ý rằng số nguyên chẵn là đối tượng. Tuy nhiên, sự khác biệt giữa theo giá trị và theo tham chiếu có trong một số ngôn ngữ lập trình khác thường dùng để phân biệt liệu các đối số được truyền có thể thực sự được thay đổi bởi hàm được gọi hay không và liệu hàm gọi có thể nhìn thấy các thay đổi hay không.

Các đối tượng đã truyền thuộc loại có thể thay đổi, chẳng hạn như danh sách và từ điển, có thể được thay đổi bởi hàm được gọi và những thay đổi này hiển thị đối với hàm gọi. Các đối tượng được truyền có kiểu bất biến như số nguyên và chuỗi không thể bị thay đổi bởi hàm được gọi; . Để biết khả năng thay đổi, hãy xem thêm chương Kiểu dữ liệu

Một ví dụ

>>> def functionname[arg1,arg2]:
..     return arg1+arg2
...
>>> t = functionname[24,24] # Result: 48
0

Một đối số không thể được khai báo là hằng số, không thể thay đổi bởi hàm được gọi. Nếu một đối số thuộc loại bất biến, thì nó không thể thay đổi được, nhưng nếu nó thuộc loại có thể thay đổi, chẳng hạn như danh sách, thì hàm gọi sẽ phụ thuộc vào hàm được gọi. Do đó, nếu chức năng gọi muốn đảm bảo danh sách đã truyền không bị thay đổi, thì nó phải truyền một bản sao của danh sách

Một ví dụ

>>> def functionname[arg1,arg2]:
..     return arg1+arg2
...
>>> t = functionname[24,24] # Result: 48
1

Một hàm có thể được gọi bằng cách thêm các đối số trong dấu ngoặc đơn vào tên hàm hoặc một bộ dấu ngoặc đơn phù hợp trống nếu hàm không có đối số

Giá trị trả về của một hàm có thể được sử dụng bằng cách gán nó cho một biến, như vậy

Như đã trình bày ở trên, khi gọi một hàm, bạn có thể chỉ định các tham số theo tên và bạn có thể thực hiện theo thứ tự bất kỳ

>>> def functionname[arg1,arg2]:
..     return arg1+arg2
...
>>> t = functionname[24,24] # Result: 48
2

Điều này ở trên là hợp lệ và bắt đầu sẽ có giá trị mặc định là 0. Một hạn chế đặt ra cho điều này là sau đối số được đặt tên đầu tiên thì tất cả các đối số sau nó cũng phải được đặt tên. Sau đây là không hợp lệ

>>> def functionname[arg1,arg2]:
..     return arg1+arg2
...
>>> t = functionname[24,24] # Result: 48
3

bởi vì đối số thứ ba ["tin nhắn của tôi"] là một đối số không tên

Các hàm lồng nhau là các hàm được định nghĩa bên trong các hàm khác. Mức độ lồng nhau tùy ý là có thể

Các hàm lồng nhau có thể đọc các biến được khai báo trong hàm bên ngoài ngay lập tức. Đối với các biến có thể thay đổi như vậy, các hàm lồng nhau thậm chí có thể sửa đổi chúng. Đối với các biến không thay đổi như số nguyên, cố gắng sửa đổi trong hàm lồng nhau sẽ ném UnboundLocalError. Trong Python 3, một biến bên ngoài bất biến ngay lập tức có thể được khai báo trong hàm lồng nhau là không cục bộ, tương tự như biến toàn cục. Khi điều này được thực hiện, hàm lồng nhau có thể gán một giá trị mới cho biến đó và sửa đổi đó sẽ được nhìn thấy bên ngoài hàm lồng nhau

Các chức năng lồng nhau có thể được sử dụng trong #Closures, xem bên dưới. Hơn nữa, chúng có thể được sử dụng để giảm sự lặp lại mã chỉ liên quan đến một chức năng duy nhất, thường với danh sách đối số giảm do nhìn thấy các biến bên ngoài ngay lập tức

Một ví dụ về hàm lồng nhau sửa đổi một biến bên ngoài ngay lập tức là một danh sách và do đó có thể thay đổi

>>> def functionname[arg1,arg2]:
..     return arg1+arg2
...
>>> t = functionname[24,24] # Result: 48
4

Một ví dụ trong đó biến bên ngoài được truy cập lần đầu bên dưới định nghĩa hàm lồng nhau và nó vẫn hoạt động

>>> def functionname[arg1,arg2]:
..     return arg1+arg2
...
>>> t = functionname[24,24] # Result: 48
5

từ khóa. hàm bên trong, hàm bên trong, hàm cục bộ

liên kết

Bao đóng là một hàm lồng nhau có quyền truy cập sau khi trả về dữ liệu của hàm bên ngoài, trong đó hàm lồng nhau được trả về bởi hàm bên ngoài dưới dạng một đối tượng hàm. Do đó, ngay cả khi hàm bên ngoài đã hoàn thành việc thực thi sau khi được gọi, hàm đóng được trả về bởi nó có thể tham chiếu đến các giá trị của các biến mà hàm bên ngoài có khi nó xác định hàm đóng

Một ví dụ

>>> def functionname[arg1,arg2]:
..     return arg1+arg2
...
>>> t = functionname[24,24] # Result: 48
6

Có thể đóng trong Python vì các hàm là đối tượng hạng nhất. Một hàm chỉ đơn thuần là một đối tượng của kiểu hàm. Là một đối tượng có nghĩa là có thể chuyển một đối tượng hàm [một hàm chưa được gọi] xung quanh làm đối số hoặc giá trị trả về hoặc gán một tên khác cho đối tượng hàm. Một tính năng độc đáo làm cho việc đóng trở nên hữu ích là hàm kèm theo có thể sử dụng các tên được xác định trong phạm vi của hàm cha

Lambda là một hàm ẩn danh [chưa đặt tên]. Nó được sử dụng chủ yếu để viết các hàm rất ngắn gây rắc rối khi xác định theo cách thông thường. Một chức năng như thế này

>>> def functionname[arg1,arg2]:
..     return arg1+arg2
...
>>> t = functionname[24,24] # Result: 48
7

cũng có thể được xác định bằng lambda

>>> def functionname[arg1,arg2]:
..     return arg1+arg2
...
>>> t = functionname[24,24] # Result: 48
8

Lambda thường được sử dụng làm đối số cho các hàm khác mong đợi một đối tượng hàm, chẳng hạn như đối số 'key' của sorted[]

>>> def functionname[arg1,arg2]:
..     return arg1+arg2
...
>>> t = functionname[24,24] # Result: 48
9

Biểu mẫu lambda thường hữu ích dưới dạng đóng, chẳng hạn như được minh họa trong ví dụ sau

def functionname[]:
    statement1
    statement2
    ...
0

Lưu ý rằng hàm lambda có thể sử dụng các giá trị của biến từ phạm vi mà nó được tạo [như trước và sau]. Đây là bản chất của đóng cửa

liên kết

Khi thảo luận về vòng lặp, bạn đã bắt gặp khái niệm iterator. Điều này lần lượt tạo ra từng phần tử của một số trình tự, thay vì toàn bộ trình tự cùng một lúc, cho phép bạn xử lý các trình tự lớn hơn nhiều so với mức có thể vừa với bộ nhớ cùng một lúc

Bạn có thể tạo các trình vòng lặp của riêng mình, bằng cách xác định cái được gọi là hàm tạo. Để minh họa tính hữu ích của điều này, chúng ta hãy bắt đầu bằng cách xem xét một hàm đơn giản để trả về kết nối của hai danh sách

def functionname[]:
    statement1
    statement2
    ...
1

Hãy tưởng tượng bạn muốn làm điều gì đó như

def functionname[]:
    statement1
    statement2
    ...
4

Điều đó sẽ hiệu quả, nhưng nó sẽ tiêu tốn rất nhiều bộ nhớ

Xem xét một định nghĩa thay thế, lấy hai trình vòng lặp làm đối số

def functionname[]:
    statement1
    statement2
    ...
2

Lưu ý việc sử dụng câu lệnh năng suất, thay vì trả về. Bây giờ chúng ta có thể sử dụng cái gì đó như

def functionname[]:
    statement1
    statement2
    ...
3

và in ra rất nhiều số mà không cần sử dụng nhiều bộ nhớ

Ghi chú. Bạn vẫn có thể chuyển một danh sách hoặc loại trình tự khác bất cứ nơi nào Python mong đợi một trình vòng lặp [chẳng hạn như đối số của hàm

def functionname[]:
    statement1
    statement2
    ...
5 của bạn];

Nó có ý nghĩa gì đối với một chức năng được gọi?

Để "gọi" có nghĩa là tạo một tham chiếu trong mã của bạn tới một hàm được viết ở nơi khác . Chức năng "gọi" này có thể được thực hiện cho thư viện Python tiêu chuẩn [nội dung được cài đặt với Python], thư viện của bên thứ ba [nội dung người khác đã viết mà bạn muốn sử dụng] hoặc mã của riêng bạn [nội dung bạn đã viết].

Điều gì xảy ra khi một chức năng được gọi?

Bây giờ, bất cứ khi nào một hàm được gọi một khung ngăn xếp mới được tạo với tất cả dữ liệu của hàm và khung ngăn xếp này được đẩy vào ngăn xếp chương trình, and the stack pointer that always points the top of the program stack points the stack frame pushed as it is on the top of the program stack.

Chức năng được gọi và gọi trong Python là gì?

Gọi và Hàm được gọi ? . Chức năng thực thi hoạt động như thế nào? . The Function which calls another Function is called Calling Function and function which is called by another Function is call Called Function. How does Function execution work? A stack data structure is used during the execution of the function calls.

Chủ Đề