Bạn có thể gọi các biến từ các hàm khác 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

    Các chức năng có thể sử dụng các biến từ các chức năng khác không?

    Không, các biến được khai báo trong hàm là cục bộ của hàm đó . Bạn nên khai báo biến ngoài hàm để sử dụng trong nhiều hàm.

    Tôi có thể gọi một hàm khác trong hàm Python không?

    Trong Python, bất kỳ hàm nào được viết ra đều có thể được gọi bởi một hàm khác . Lưu ý rằng đây có thể là cách đơn giản nhất để chia vấn đề thành các phần nhỏ của vấn đề.

    Làm cách nào để truy cập biến từ một hàm khác trong cùng một lớp trong Python?

    Các biến được định nghĩa bên trong lớp nhưng bên ngoài phương thức có thể được truy cập trong lớp (bao gồm tất cả các phương thức) bằng cách sử dụng thể hiện của một lớp. Ví dụ – bản thân. var_name. Nếu bạn muốn sử dụng biến đó ngay cả bên ngoài lớp, bạn phải khai báo biến đó là biến toàn cục.

    Bạn có thể chuyển một biến cho một hàm trong Python không?

    Khi bạn truyền một biến cho hàm, python sẽ chuyển tham chiếu đến đối tượng mà biến tham chiếu (giá trị) . Không phải bản thân biến. Các hàm có một bảng biến cục bộ được 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.