Chúng ta có thể làm rất nhiều việc với các hàm như chuyển một hàm làm đối số cho một hàm khác, gọi một hàm từ một hàm khác, v.v. Trong Python, chúng ta cũng có thể tạo một hàm bên trong một hàm khác. Show Một hàm được tạo bên trong một hàm khác được gọi là hàm lồng nhau hoặc hàm bên trong. Trong chương này, chúng ta sẽ đọc về các hàm lồng nhau và ý nghĩa của chúng Định nghĩa một hàm lồng nhauMột hàm lồng nhau được xác định bằng cách tạo nó đơn giản bằng từ khóa def bên trong một hàm khác. Đây là một ví dụ def outer(): # outer function print("This is outer function") def inner(): print("This is inner function") inner() # calling inner function outer() # calling outer function Đây là chức năng bên ngoài Chúng tôi đã định nghĩa một hàm có tên là Khi hàm Lưu ý rằng một hàm bên trong luôn được gọi từ bên trong hàm mà nó được định nghĩa. Như vậy, để gọi hàm bên trong, chúng ta cần gọi hàm bên ngoài Một hàm lồng nhau có thể truy cập các biến được xác định trong hàm mà nó được tạo. Điều này được thể hiện trong ví dụ sau def outer(): # outer function x = 10 def inner(): print("Inside inner func", x) inner() # calling inner function print("Inside outer func", x) outer() # calling outer function Bên trong chức năng bên trong 10 Trong ví dụ này, chúng tôi đã định nghĩa một biến x có giá trị là 10 trong hàm Vì vậy, từ các ví dụ trên, bạn phải hiểu rằng các hàm lồng nhau chỉ là các hàm bình thường được định nghĩa và gọi bên trong một số hàm khác Hãy xem thêm một ví dụ def find_power(num): # outer function def power(n): return num ** n return power(2) # calling inner function and returning the value returned by it print(find_power(10)) # calling outer function Đây là một ví dụ thẳng về phía trước. Hàm def outer(): # outer function x = 10 def inner(): print("Inside inner func", x) inner() # calling inner function print("Inside outer func", x) outer() # calling outer function4 được gọi bằng cách chuyển 10 làm đối số, làm cho tham số num của nó bằng 10. Bên trong hàm def outer(): # outer function x = 10 def inner(): print("Inside inner func", x) inner() # calling inner function print("Inside outer func", x) outer() # calling outer function4, hàm lồng nhau def outer(): # outer function x = 10 def inner(): print("Inside inner func", x) inner() # calling inner function print("Inside outer func", x) outer() # calling outer function6 được gọi bằng cách chuyển 2 làm đối số, làm cho tham số n của hàm def outer(): # outer function x = 10 def inner(): print("Inside inner func", x) inner() # calling inner function print("Inside outer func", x) outer() # calling outer function6 bằng 2. Bên trong hàm def outer(): # outer function x = 10 def inner(): print("Inside inner func", x) inner() # calling inner function print("Inside outer func", x) outer() # calling outer function6, hàm def outer(): # outer function x = 10 def inner(): print("Inside inner func", x) inner() # calling inner function print("Inside outer func", x) outer() # calling outer function9 lũy thừa n (2) được trả về. Cuối cùng, giá trị này được trả về bởi hàm def outer(): # outer function x = 10 def inner(): print("Inside inner func", x) inner() # calling inner function print("Inside outer func", x) outer() # calling outer function6 được trả về bởi hàm def outer(): # outer function x = 10 def inner(): print("Inside inner func", x) inner() # calling inner function print("Inside outer func", x) outer() # calling outer function4 Ý nghĩa của các hàm lồng nhauCó thể có nhiều lý do để sử dụng các hàm lồng nhau. Hãy xem một số trong số họ Các hàm lồng nhau có thể đóng vai trò là các hàm trợ giúp của hàm mà chúng được xác định. Hãy xem một ví dụ trong đó hàm lồng đóng vai trò là hàm trợ giúp cho hàm cha của nó def print_even(lst): def find_even(num): if num % 2 == 0: return True else: return False new_list = [] for num in lst: if find_even(num) == True: new_list.append(num) print("Final list:", new_list) mylist = [1, 2, 4, 5, 6, 7, 10, 11, 12] print_even(mylist) Danh sách cuối cùng. [2, 4, 6, 10, 12] Ở đây, hàm def find_power(num): # outer function def power(n): return num ** n return power(2) # calling inner function and returning the value returned by it print(find_power(10)) # calling outer function2 nhận một danh sách làm đối số và in ra một danh sách mới chứa tất cả các phần tử chẵn của danh sách nhận được. Bạn hẳn đã hiểu phần còn lại của chương trình Bên trong hàm def find_power(num): # outer function def power(n): return num ** n return power(2) # calling inner function and returning the value returned by it print(find_power(10)) # calling outer function2, chúng ta có một hàm lồng nhau def find_power(num): # outer function def power(n): return num ** n return power(2) # calling inner function and returning the value returned by it print(find_power(10)) # calling outer function4 nhận một số làm đối số và trả về True nếu số truyền vào là số chẵn, ngược lại trả về False. Trong chương trình này, hàm lồng nhau do đó hoạt động như một hàm trợ giúp chỉ kiểm tra xem số đã truyền có phải là số chẵn hay không và không bị ảnh hưởng bởi bất kỳ mã hoặc biến nào khác bên trong hàm def find_power(num): # outer function def power(n): return num ** n return power(2) # calling inner function and returning the value returned by it print(find_power(10)) # calling outer function2 bên ngoài Có thể thấy một trường hợp sử dụng khác của các hàm lồng nhau từ ví dụ sau def get_factorial(num): def factorial(num): if num == 0 or num == 1: return 1 else: return num * factorial(num - 1) if not isinstance(num, int): raise TypeError("Failed! The value must be a number") if num < 0: raise ValueError("Failed! The number must be non-negative") return factorial(num) print(get_factorial(5)) Trong ví dụ trên, hàm def find_power(num): # outer function def power(n): return num ** n return power(2) # calling inner function and returning the value returned by it print(find_power(10)) # calling outer function6 nhận một số làm đối số và trả về giai thừa của số đó. Bên trong hàm def find_power(num): # outer function def power(n): return num ** n return power(2) # calling inner function and returning the value returned by it print(find_power(10)) # calling outer function6, chúng tôi đang thực hiện một số xử lý lỗi, trong đó chúng tôi đưa ra ngoại lệ TypeError nếu số được truyền không phải là số nguyên và ngoại lệ def find_power(num): # outer function def power(n): return num ** n return power(2) # calling inner function and returning the value returned by it print(find_power(10)) # calling outer function8 là số được truyền nhỏ hơn 0 (Bạn có thể tìm hiểu về cách tăng ngoại lệ từ chương này . Nếu không có ngoại lệ nào được đưa ra trong cả hai lần kiểm tra, thì hàm lồng nhau có tên def find_power(num): # outer function def power(n): return num ** n return power(2) # calling inner function and returning the value returned by it print(find_power(10)) # calling outer function9 được gọi để trả về giai thừa của số. Bây giờ, giả sử nếu mã cho cả xử lý lỗi và tính giai thừa được viết trong hàm def find_power(num): # outer function def power(n): return num ** n return power(2) # calling inner function and returning the value returned by it print(find_power(10)) # calling outer function6 mà không sử dụng hàm lồng nhau def find_power(num): # outer function def power(n): return num ** n return power(2) # calling inner function and returning the value returned by it print(find_power(10)) # calling outer function9, thì độ phức tạp của mã bên trong def find_power(num): # outer function def power(n): return num ** n return power(2) # calling inner function and returning the value returned by it print(find_power(10)) # calling outer function6 sẽ tăng lên Vì vậy, đến bây giờ, bạn hẳn đã biết khi nào bạn có thể sử dụng các hàm lồng nhau để giảm độ phức tạp của các hàm của mình. Hãy xem xét thêm một số trường hợp khi các hàm lồng nhau có thể được sử dụng Đôi khi chúng ta có thể muốn ngăn một số chức năng được truy cập trực tiếp từ bất kỳ đâu trong chương trình của bạn. Trong trường hợp đó, chúng ta có thể đặt hàm đó (chẳng hạn như def print_even(lst): def find_even(num): if num % 2 == 0: return True else: return False new_list = [] for num in lst: if find_even(num) == True: new_list.append(num) print("Final list:", new_list) mylist = [1, 2, 4, 5, 6, 7, 10, 11, 12] print_even(mylist)3) dưới dạng một hàm lồng bên trong một hàm khác (chẳng hạn như def print_even(lst): def find_even(num): if num % 2 == 0: return True else: return False new_list = [] for num in lst: if find_even(num) == True: new_list.append(num) print("Final list:", new_list) mylist = [1, 2, 4, 5, 6, 7, 10, 11, 12] print_even(mylist)4). Chúng tôi biết rằng một chức năng lồng nhau không thể được truy cập bên ngoài chức năng mà nó được xác định và do đó chúng tôi sẽ không thể truy cập chức năng đó từ các phần khác của chương trình nữa. Để gọi hàm f2() lồng nhau, trước tiên chúng ta sẽ phải gọi hàm cha của nó là def print_even(lst): def find_even(num): if num % 2 == 0: return True else: return False new_list = [] for num in lst: if find_even(num) == True: new_list.append(num) print("Final list:", new_list) mylist = [1, 2, 4, 5, 6, 7, 10, 11, 12] print_even(mylist)4, hàm này sẽ gọi def print_even(lst): def find_even(num): if num % 2 == 0: return True else: return False new_list = [] for num in lst: if find_even(num) == True: new_list.append(num) print("Final list:", new_list) mylist = [1, 2, 4, 5, 6, 7, 10, 11, 12] print_even(mylist)3 bên trong nó. Việc ẩn một số dữ liệu hoặc mã (chức năng trong trường hợp của chúng tôi) được gọi là đóng gói Nhưng tại sao chúng ta lại đóng gói một chức năng?Để trả lời câu hỏi đó, hãy lấy một trường hợp sử dụng mà chúng ta muốn dự đoán xem một công ty sẽ lãi hay lỗ. Giả sử chúng ta có một hàm chứa logic tính toán lợi nhuận kỳ vọng của một công ty. Logic này có thể chứa một số thông tin mà chúng tôi không muốn ai biết. Nếu chúng ta không muốn bất kỳ phần nào khác của chương trình truy cập trực tiếp logic trong hàm này, chúng ta có thể đặt nó dưới dạng một hàm lồng bên trong một hàm khác. Nhìn vào cấu trúc hàm sau def profit_or_loss(): def get_profit(): # calculates profit return profit if profit > 0: return "Profit" else: return "Loss" profit_or_loss() Giả sử def print_even(lst): def find_even(num): if num % 2 == 0: return True else: return False new_list = [] for num in lst: if find_even(num) == True: new_list.append(num) print("Final list:", new_list) mylist = [1, 2, 4, 5, 6, 7, 10, 11, 12] print_even(mylist)7 là hàm lồng nhau với logic tính toán và trả về lợi nhuận kỳ vọng, và def print_even(lst): def find_even(num): if num % 2 == 0: return True else: return False new_list = [] for num in lst: if find_even(num) == True: new_list.append(num) print("Final list:", new_list) mylist = [1, 2, 4, 5, 6, 7, 10, 11, 12] print_even(mylist)8 là hàm được gói gọn bên trong. Bây giờ, nếu người dùng muốn biết liệu sẽ có lãi hay lỗ, thì họ sẽ gọi hàm def print_even(lst): def find_even(num): if num % 2 == 0: return True else: return False new_list = [] for num in lst: if find_even(num) == True: new_list.append(num) print("Final list:", new_list) mylist = [1, 2, 4, 5, 6, 7, 10, 11, 12] print_even(mylist)8. Hàm này sẽ gọi hàm def print_even(lst): def find_even(num): if num % 2 == 0: return True else: return False new_list = [] for num in lst: if find_even(num) == True: new_list.append(num) print("Final list:", new_list) mylist = [1, 2, 4, 5, 6, 7, 10, 11, 12] print_even(mylist)7 để lấy lợi nhuận và sẽ trả về “Thành công” nếu lợi nhuận là số dương, ngược lại trả về “Lỗ”. Bằng cách này, không có phần nào khác của chương trình có thể truy cập hàm def print_even(lst): def find_even(num): if num % 2 == 0: return True else: return False new_list = [] for num in lst: if find_even(num) == True: new_list.append(num) print("Final list:", new_list) mylist = [1, 2, 4, 5, 6, 7, 10, 11, 12] print_even(mylist)7 lồng nhau Các hàm lồng nhau cũng được sử dụng để tạo các bao đóng. Chúng tôi sẽ đọc về đóng cửa trong Đóng cửa Bây giờ bạn đã hiểu hàm lồng nhau là gì và sử dụng chúng ở đâu, hãy bắt đầu đưa chúng vào chương trình của bạn bất cứ khi nào cần thiết Để học từ các video đơn giản, bạn luôn có thể xem khóa học video Python của chúng tôi trên CodesDope Pro. Nó có hơn 500 câu hỏi thực hành và hơn 20 dự án Điều đó có nghĩa là gì khi một chức năng được lồng vào nhau?Trong lập trình máy tính, một hàm lồng nhau (hoặc thủ tục lồng nhau hoặc chương trình con) là một hàm được định nghĩa bên trong một hàm khác, hàm bao quanh .
Chúng ta có thể gọi một hàm lồng nhau trong Python không?Hàm lồng nhau trong Python
. Nó thực thi khi display_name() được gọi bên trong hàm hello() .
Làm tổ chức năng là gì đưa ra một ví dụ?Ví dụ, ở đây chúng ta định nghĩa một hàm lồng nhau tên là square, và gọi nó hai lần. foo (double a, double b) { double square (double z) { return z * z; . The nested function can access all the variables of the containing function that are visible at the point of its definition. |