Bạn có thể gọi một hàm trong một hàm trong python không?

Điều quan trọng là phải hiểu rằng mỗi hàm chúng ta viết có thể được sử dụng và gọi từ các hàm khác mà chúng ta viết. Đây là một trong những cách quan trọng nhất mà các nhà khoa học máy tính xử lý một vấn đề lớn và chia nhỏ nó thành một nhóm các vấn đề nhỏ hơn. Quá trình chia vấn đề này thành các vấn đề con nhỏ hơn được gọi là phân rã chức năng

Đây là một ví dụ đơn giản về phân rã chức năng bằng hai chức năng. Hàm đầu tiên có tên là

def drawSquare[tx, sz]:        # a new version of drawSquare
    drawRectangle[tx, sz, sz]
2 chỉ đơn giản là tính bình phương của một số đã cho. Hàm thứ hai có tên là
def drawSquare[tx, sz]:        # a new version of drawSquare
    drawRectangle[tx, sz, sz]
3 sử dụng bình phương để tính tổng của ba số đã được bình phương

Hoạt động. MãLens 6. 6. 1 [tổng bình phương]

Mặc dù đây là một ý tưởng khá đơn giản, nhưng trên thực tế, ví dụ này minh họa nhiều khái niệm Python rất quan trọng, bao gồm các biến cục bộ và biến toàn cục cùng với việc truyền tham số. Lưu ý rằng khi bạn xem qua ví dụ này, codelens sẽ in đậm dòng 1 và dòng 5 khi các chức năng được xác định. Phần thân của hình vuông không được thực thi cho đến khi nó được gọi từ hàm

def drawSquare[tx, sz]:        # a new version of drawSquare
    drawRectangle[tx, sz, sz]
3 lần đầu tiên trên dòng 6. Cũng lưu ý rằng khi
def drawSquare[tx, sz]:        # a new version of drawSquare
    drawRectangle[tx, sz, sz]
2 được gọi, có hai nhóm biến cục bộ, một cho
def drawSquare[tx, sz]:        # a new version of drawSquare
    drawRectangle[tx, sz, sz]
2 và một cho
def drawSquare[tx, sz]:        # a new version of drawSquare
    drawRectangle[tx, sz, sz]
3. Khi bạn xem qua, bạn sẽ nhận thấy rằng
def drawSquare[tx, sz]:        # a new version of drawSquare
    drawRectangle[tx, sz, sz]
8 và
def drawSquare[tx, sz]:        # a new version of drawSquare
    drawRectangle[tx, sz, sz]
9 là các biến cục bộ trong cả hai hàm và thậm chí có thể có các giá trị khác nhau. Điều này chứng tỏ rằng mặc dù chúng được đặt tên giống nhau, nhưng trên thực tế, chúng rất khác nhau.

Bây giờ chúng ta sẽ xem xét một ví dụ khác sử dụng hai hàm. Ví dụ này minh họa một kỹ thuật giải quyết vấn đề khoa học máy tính quan trọng được gọi là khái quát hóa. Giả sử chúng ta muốn viết một hàm để vẽ một hình vuông. Bước khái quát hóa là nhận ra rằng hình vuông chỉ là một loại hình chữ nhật đặc biệt

Để vẽ một hình chữ nhật, chúng ta cần có thể gọi một hàm với các đối số khác nhau cho chiều rộng và chiều cao. Không giống như trường hợp của hình vuông, chúng ta không thể lặp lại cùng một thứ 4 lần, vì bốn cạnh không bằng nhau. Tuy nhiên, đó là trường hợp vẽ mặt dưới và mặt phải theo trình tự giống như vẽ mặt trên và mặt trái. Vì vậy, cuối cùng chúng tôi nghĩ ra đoạn mã khá hay này có thể vẽ một hình chữ nhật

def drawRectangle[t, w, h]:
    """Get turtle t to draw a rectangle of width w and height h."""
    for i in range[2]:
        t.forward[w]
        t.left[90]
        t.forward[h]
        t.left[90]

Tên tham số được chọn dưới dạng các chữ cái đơn lẻ cho ngắn gọn. Trong các chương trình thực tế, chúng tôi sẽ nhấn mạnh vào các tên biến tốt hơn tên này. Vấn đề là chương trình không “hiểu” rằng bạn đang vẽ một hình chữ nhật hay các tham số biểu thị chiều rộng và chiều cao. Các khái niệm như hình chữ nhật, chiều rộng và chiều cao có ý nghĩa đối với con người. Chúng không phải là những khái niệm mà chương trình hoặc máy tính hiểu được

Suy nghĩ như một nhà khoa học máy tính liên quan đến việc tìm kiếm các mẫu và mối quan hệ. Trong đoạn mã trên, chúng tôi đã làm điều đó ở một mức độ nào đó. Chúng tôi không chỉ vẽ bốn phía. Thay vào đó, chúng tôi phát hiện ra rằng chúng tôi có thể vẽ hình chữ nhật thành hai nửa và sử dụng một vòng lặp để lặp lại mẫu đó hai lần

Nhưng bây giờ chúng ta có thể phát hiện ra rằng hình vuông là một loại hình chữ nhật đặc biệt. Một hình vuông chỉ cần sử dụng cùng một giá trị cho cả chiều cao và chiều rộng. Chúng ta đã có một hàm vẽ hình chữ nhật, vì vậy chúng ta có thể sử dụng hàm đó để vẽ hình vuông của mình

def drawSquare[tx, sz]:        # a new version of drawSquare
    drawRectangle[tx, sz, sz]

Đây là toàn bộ ví dụ với mã thiết lập cần thiết

Có một số điểm đáng chú ý ở đây

  • Các chức năng có thể gọi các chức năng khác

  • Viết lại

    def drawSquare[tx, sz]:        # a new version of drawSquare
        drawRectangle[tx, sz, sz]
    
    0 như thế này để ghi lại mối quan hệ mà chúng tôi đã phát hiện

  • Người gọi hàm này có thể nói

    def drawSquare[tx, sz]:        # a new version of drawSquare
        drawRectangle[tx, sz, sz]
    
    1. Các tham số của hàm này,
    def drawSquare[tx, sz]:        # a new version of drawSquare
        drawRectangle[tx, sz, sz]
    
    2 và
    def drawSquare[tx, sz]:        # a new version of drawSquare
        drawRectangle[tx, sz, sz]
    
    3, được gán các giá trị của đối tượng tess và số nguyên 50 tương ứng

  • Trong phần thân của hàm,

    def drawSquare[tx, sz]:        # a new version of drawSquare
        drawRectangle[tx, sz, sz]
    
    4 và
    def drawSquare[tx, sz]:        # a new version of drawSquare
        drawRectangle[tx, sz, sz]
    
    3 giống như bất kỳ biến nào khác

  • Khi cuộc gọi được thực hiện tới

    def drawSquare[tx, sz]:        # a new version of drawSquare
        drawRectangle[tx, sz, sz]
    
    6, các giá trị trong biến
    def drawSquare[tx, sz]:        # a new version of drawSquare
        drawRectangle[tx, sz, sz]
    
    2 và
    def drawSquare[tx, sz]:        # a new version of drawSquare
        drawRectangle[tx, sz, sz]
    
    3 được tìm nạp trước, sau đó cuộc gọi sẽ xảy ra. Vì vậy, khi chúng ta nhập đỉnh của hàm
    def drawSquare[tx, sz]:        # a new version of drawSquare
        drawRectangle[tx, sz, sz]
    
    6, biến
    def drawSquare[tx, sz]:        # a new version of drawSquare
        drawRectangle[tx, sz, sz]
    
    20 của nó được gán đối tượng tess và cả
    def drawSquare[tx, sz]:        # a new version of drawSquare
        drawRectangle[tx, sz, sz]
    
    21 và
    def drawSquare[tx, sz]:        # a new version of drawSquare
        drawRectangle[tx, sz, sz]
    
    22 trong hàm đó đều được gán giá trị 50

Cho đến nay, có thể không rõ tại sao việc tạo ra tất cả các chức năng mới này lại đáng giá. Trên thực tế, có rất nhiều lý do, nhưng ví dụ này cho thấy hai

  1. Tạo một hàm mới cho bạn cơ hội đặt tên cho một nhóm câu lệnh. Các hàm có thể đơn giản hóa một chương trình bằng cách ẩn một phép tính phức tạp đằng sau một lệnh duy nhất. Hàm [bao gồm cả tên của nó] có thể nắm bắt được khối tinh thần hoặc sự trừu tượng hóa của bạn về vấn đề

  2. Tạo một chức năng mới có thể làm cho chương trình nhỏ hơn bằng cách loại bỏ mã lặp đi lặp lại

  3. Đôi khi bạn có thể viết các hàm cho phép bạn giải quyết một vấn đề cụ thể bằng cách sử dụng một giải pháp tổng quát hơn

phòng thí nghiệm

  • Vẽ hình tròn Trong bài tập trong phòng thí nghiệm có hướng dẫn này, chúng ta sẽ giải bài tập đơn giản liên quan đến vẽ hình tròn với con rùa

    Bạn có thể gọi một hàm trong một hàm không?

    Việc gọi một hàm từ bên trong chính nó được gọi là đệ quy và câu trả lời đơn giản là có.

    Chúng ta có thể gọi một chức năng trong chức năng in không?

    Có, đúng như vậy . Giá trị trả về là những gì sẽ in. Có nhưng với tư cách là một “cuộc gọi”, họ không yêu cầu một cuộc gọi trong ngữ cảnh của hàm in, họ muốn bạn “gọi” hàm cha đã xác định “calculate_age[]”… Như đã lưu ý ở trên, print[calculate_age[1970] .

    Các chức năng có thể được lồng nhau?

    Việc sử dụng hàm làm một trong các đối số trong công thức sử dụng hàm được gọi là lồng nhau và chúng tôi sẽ gọi hàm đó là hàm lồng nhau.

    Hàm lồng nhau trong Python là gì?

    Các hàm lồng nhau [hoặc bên trong, lồng nhau] là các hàm mà chúng ta định nghĩa bên trong các hàm khác để truy cập trực tiếp vào các biến và tên được xác định trong hàm kèm theo. Nested functions have many uses, primarily for creating closures and decorators.

Chủ Đề