Cách chuyển một biến từ hàm này sang hàm khác python

Trong bài viết này, chúng ta sẽ thảo luận về cách sử dụng một biến từ một hàm khác trong Python. Nói chung, các chức năng giới hạn phạm vi của các biến trong khối chức năng và chúng không thể được truy cập từ bên ngoài chức năng

Hàm trong Python

Hàm được coi là đối tượng trong Python. Điều đó có nghĩa là chúng có thể được truyền dưới dạng đối số, được gán và lưu trữ trong các biến. Cũng có thể liên kết biến với hàm trong Python. Đây là cách chúng ta sẽ tiếp cận nhiệm vụ hiện tại là truy cập một biến từ bên ngoài hàm. Điều này được thực hiện tương tự như cách chúng ta truy cập các thành viên của một lớp theo đối tượng của chúng bằng cách sử dụng “. " nhà điều hành

Cách sử dụng một biến từ một hàm khác trong Python

Biến có thể được gán cho đối tượng hàm bên trong thân hàm. Vì vậy, biến chỉ tồn tại sau khi hàm được gọi. Khi hàm đã được gọi, biến sẽ được liên kết với đối tượng hàm. Biến này hiện có thể được sử dụng ở bất kỳ đâu bên trong hoặc bên ngoài bất kỳ chức năng nào. Hãy xem một triển khai mẫu tương tự trong đoạn mã dưới đây

def function_1[]:
    # assigning a string as a member of the function object
    function_1.var = "variable inside function_1"
    print["function_1 has been called"]

def function_2[]:
    print["function_2 has been called"]
    print[function_1.var]

function_1[]
function_2[]

Lưu ý rằng hàm_1 phải được gọi trước, nếu không hàm_2 sẽ truy cập vào một biến chưa được tạo. Chạy cùng mã mà không có hàm_1[] sẽ dẫn đến lỗi thuộc tính. Đầu ra cho đoạn mã trên như sau

function_1 has been called
function_2 has been called
variable inside function_1

Đầu ra giải thích rõ ràng luồng điều khiển bên trong mã. Hàm_2 truy cập thuộc tính của hàm_1 phải được gọi trước. Do đó, tôi hy vọng bạn thấy bài viết này hữu ích trong việc hiểu cách truy cập các biến từ một hàm khác trong Python

Xem thêm

  • Lớp và đối tượng trong Python

9 phản hồi cho “Cách sử dụng biến từ hàm khác trong Python”

  1. Rahul tripathi nói.

    Tháng Sáu 24, 2021 tại 11. 52 giờ sáng

    Ahhh,,,,cuối cùng tôi cũng có giải pháp mà tôi đang loay hoay trong một giờ qua.
    các trang web như thế này làm cho việc viết mã trở nên thú vị.
    rất nhiều tình yêu dành cho trang web và những lời chúc tốt đẹp nhất.

    Hồi đáp

  2. Rajesh Kumar nói.

    Tháng Bảy 28, 2021 tại 12. 12 giờ sáng

    Cảm ơn. Viết rất hay và gọn gàng. Các blog/bài báo khác hơi khó hiểu và gây hiểu nhầm. Điều này là đơn giản và lên đến nhãn hiệu

    Hồi đáp

  3. Evelyn Lau nói.

    Tháng Chín 1, 2021 tại 8. 16 giờ chiều

    Xin chào, nếu tôi có hai biến trong hàm đầu tiên và chỉ muốn sử dụng các biến thứ hai trong hàm thứ hai thì sao?

    Hồi đáp

    • Rajeev D nói.

      5 Tháng Mười tại 8. 57 giờ sáng

      Mã này hoạt động vì tên của hàm chính là tên của biến. Nếu bạn có một biến thứ hai trong cùng một hàm, rõ ràng tên sẽ cần phải khác. Trong trường hợp đó, bạn sẽ cần khai báo nó là toàn cầu. Chỉ khi đó nó mới có thể truy cập được vào các chức năng khác

      Hồi đáp

  4. Cá ngừ nói.

    Tháng Chín 9, 2021 tại 1. 21 giờ đêm

    Tôi đang thực hiện đánh giá OOP ngay bây giờ và điều này đã giúp giải quyết vấn đề số 1 của tôi. Cảm ơn bạn rất nhiều, và nó cũng có ý nghĩa. 😀

    ** Bỏ qua tên của tôi btw **

    Hồi đáp

  5. TallGibbs nói.

    Tháng Sáu 9, 2022 tại 10. 03 giờ chiều

    Tôi không hiểu chức năng_1. var có thể được nhìn thấy bởi function_2[]

    Sự hiểu biết của tôi là chức năng đó_1. var là một biến cục bộ và chỉ được định nghĩa trong phạm vi của hàm đó. Làm cách nào mà hàm_2 có thể “thấy” biến này để in nó?

    Hồi đáp

  6. shabeer youzef nói.

    Tháng Bảy 21, 2022 tại 4. 35 giờ chiều

    tôi cũng đang nghĩ về cái đó. Tôi đang làm việc với một chương trình nhỏ như vậy, nếu có ai nhận được câu trả lời thì liên hệ với tôi…

    Một chức năng hoặc thủ tục thường cần một số thông tin về môi trường, trong đó nó đã được gọi. Giao diện giữa môi trường, từ đó chức năng đã được gọi, và chức năng, i. e. thân hàm, bao gồm các biến đặc biệt, được gọi là tham số. Bằng cách sử dụng các tham số này, có thể sử dụng tất cả các loại đối tượng từ "bên ngoài" bên trong hàm. Cú pháp về cách các tham số được khai báo và ngữ nghĩa về cách các đối số được truyền cho các tham số của hàm hoặc thủ tục tùy thuộc vào ngôn ngữ lập trình

    Rất thường các thuật ngữ tham số và đối số được sử dụng đồng nghĩa, nhưng có một sự khác biệt rõ ràng. Các tham số nằm bên trong các hàm hoặc thủ tục, trong khi các đối số được sử dụng trong các lời gọi thủ tục, i. e. các giá trị được truyền cho hàm trong thời gian chạy

    "gọi theo giá trị" và "gọi theo tên"

    Chiến lược đánh giá cho lập luận, tôi. e. cách các đối số từ lời gọi hàm được chuyển đến các tham số của hàm, khác nhau giữa các ngôn ngữ lập trình. Các chiến lược đánh giá phổ biến nhất là "gọi theo giá trị" và "gọi theo tham chiếu"

    • Gọi theo giá trị Chiến lược phổ biến nhất là đánh giá theo giá trị gọi, đôi khi còn được gọi là chuyển theo giá trị. Chiến lược này được sử dụng trong C và C++, ví dụ. Trong gọi theo giá trị, biểu thức đối số được đánh giá và kết quả của đánh giá này được liên kết với biến tương ứng trong hàm. Vì vậy, nếu biểu thức là một biến, giá trị của nó sẽ được gán [sao chép] cho tham số tương ứng. Điều này đảm bảo rằng biến trong phạm vi của người gọi sẽ không thay đổi khi hàm trả về

    • Gọi theo tham chiếu Trong đánh giá theo tham chiếu, còn được gọi là truyền theo tham chiếu, một hàm nhận tham chiếu ẩn tới đối số, thay vì bản sao giá trị của nó. Kết quả là, hàm có thể sửa đổi đối số, tôi. e. giá trị của biến trong phạm vi của người gọi có thể được thay đổi. Bằng cách sử dụng Gọi theo tham chiếu, chúng tôi tiết kiệm cả thời gian tính toán và dung lượng bộ nhớ vì không cần phải sao chép các đối số. Mặt khác, điều này có nhược điểm là các biến có thể bị "vô tình" thay đổi trong một lệnh gọi hàm. Vì vậy, phải đặc biệt cẩn thận để "bảo vệ" các giá trị không nên thay đổi. Nhiều ngôn ngữ lập trình hỗ trợ gọi theo tham chiếu, như C hoặc C++, nhưng Perl sử dụng nó làm mặc định

    Trong ALGOL 60 và COBOL đã có một khái niệm khác gọi là gọi theo tên, không còn được sử dụng trong các ngôn ngữ hiện đại

    Đào tạo Python trực tiếp

    Thưởng thức trang này?

    Nhìn thấy. Tổng quan về các khóa học Python trực tiếp

    đăng ký tại đây

    còn Python thì sao?

    Có một số cuốn sách gọi chiến lược gọi theo giá trị của Python và một số cuốn sách gọi nó theo tham chiếu. Bạn có thể tự hỏi mình, điều gì là đúng

    Humpty Dumpty đưa ra lời giải thích

    --- "Khi tôi dùng một từ," Humpty Dumpty nói, với giọng khá khinh bỉ, "nó chỉ có nghĩa theo ý tôi muốn - không hơn không kém. "

    --- "Câu hỏi đặt ra là," Alice nói, "liệu bạn có thể làm cho các từ có nhiều nghĩa khác nhau hay không. "

    --- "Vấn đề là," Humpty Dumpty nói, "thế nào là chủ - chỉ vậy thôi. "

    Lewis Carroll, Qua gương soi

    Để quay lại câu hỏi ban đầu của chúng tôi, chiến lược đánh giá nào được sử dụng trong Python. các tác giả gọi cơ chế gọi theo giá trị và những người gọi nó gọi theo tham chiếu đang kéo dài các định nghĩa cho đến khi chúng phù hợp

    Nói một cách chính xác, Python sử dụng một cơ chế, được gọi là "Gọi theo đối tượng", đôi khi còn được gọi là "Gọi theo tham chiếu đối tượng" hoặc "Gọi theo chia sẻ"

    Nếu bạn truyền các đối số không thay đổi như số nguyên, chuỗi hoặc bộ dữ liệu cho một hàm, thì việc truyền đó hoạt động như gọi theo giá trị. Tham chiếu đối tượng được chuyển đến các tham số chức năng. Không thể thay đổi chúng trong chức năng, bởi vì chúng không thể thay đổi được, tôi. e. chúng là bất biến. Nó khác, nếu chúng ta truyền các đối số có thể thay đổi. Chúng cũng được truyền theo tham chiếu đối tượng, nhưng chúng có thể được thay đổi tại chỗ trong hàm. Nếu chúng ta chuyển một danh sách cho một hàm, chúng ta phải xem xét hai trường hợp. Các phần tử của một danh sách có thể được thay đổi tại chỗ, tôi. e. danh sách sẽ được thay đổi ngay cả trong phạm vi của người gọi. Nếu một danh sách mới được gán cho tên, danh sách cũ sẽ không bị ảnh hưởng, i. e. danh sách trong phạm vi của người gọi sẽ không bị ảnh hưởng

    Đầu tiên, chúng ta hãy xem các biến số nguyên bên dưới. Tham số bên trong hàm vẫn là tham chiếu đến biến của đối số, miễn là tham số không bị thay đổi. Ngay khi một giá trị mới được gán cho nó, Python sẽ tạo một biến cục bộ riêng. Biến của người gọi sẽ không bị thay đổi theo cách này

    def ref_demo[x]:
        print["x=",x," id=",id[x]]
        x=42
        print["x=",x," id=",id[x]]
    

    Trong ví dụ trên, chúng tôi đã sử dụng hàm id[], lấy một đối tượng làm tham số. id[obj] trả về "danh tính" của đối tượng "obj". Danh tính này, giá trị trả về của hàm, là một số nguyên duy nhất và không đổi cho đối tượng này trong suốt thời gian tồn tại của nó. Hai đối tượng khác nhau có thời gian tồn tại không chồng chéo có thể có cùng giá trị id[]

    Nếu bạn gọi hàm ref_demo[] của ví dụ trước - giống như chúng ta làm trong khối màu xanh bên dưới - chúng ta có thể kiểm tra điều gì xảy ra với x bằng hàm id[]. Chúng ta có thể thấy rằng trong phạm vi chính, x có danh tính 140709692940944. Trong câu lệnh in đầu tiên của hàm ref_demo[], x từ phạm vi chính được sử dụng, bởi vì chúng ta có thể thấy rằng chúng ta có cùng một danh tính. Sau khi chúng tôi gán giá trị 42 cho x, x nhận được một danh tính mới 140709692942000, tôi. e. một vị trí bộ nhớ riêng biệt từ toàn cầu x. Vì vậy, khi chúng tôi quay lại phạm vi chính x vẫn có giá trị ban đầu là 9 và id 140709692940944

    Nói cách khác, ban đầu Python hoạt động giống như gọi theo tham chiếu, nhưng ngay khi chúng ta thay đổi giá trị của một biến như vậy, tôi. e. ngay khi chúng ta gán một đối tượng mới cho nó, Python "chuyển" sang gọi theo giá trị. Tức là một biến cục bộ x sẽ được tạo ra và giá trị của biến toàn cục x sẽ được sao chép vào đó

    x = 9
    id[x]
    

    ĐẦU RA

    140709692940944

    ref_demo[x]
    

    ĐẦU RA

    x= 9  id= 140709692940944
    x= 42  id= 140709692942000
    

    id[x]
    

    ĐẦU RA

    140709692940944

    Phản ứng phụ

    Một chức năng được cho là có tác dụng phụ, nếu ngoài việc tạo ra giá trị trả về, nó còn sửa đổi môi trường của người gọi theo những cách khác. Ví dụ: một hàm có thể sửa đổi biến toàn cục hoặc biến tĩnh, sửa đổi một trong các đối số của nó, đưa ra một ngoại lệ, ghi dữ liệu vào màn hình hoặc tệp, v.v.

    Có những tình huống, trong đó những tác dụng phụ này được dự định, tôi. e. chúng là một phần của đặc tả chức năng. Nhưng trong những trường hợp khác, chúng không được mong muốn, chúng là những tác dụng phụ tiềm ẩn. Trong chương này, chúng ta chỉ quan tâm đến các tác dụng phụ làm thay đổi một hoặc nhiều biến toàn cục đã được truyền dưới dạng đối số cho một hàm. Giả sử, chúng ta đang chuyển một danh sách tới một hàm. Chúng tôi hy vọng chức năng không thay đổi danh sách này. Đầu tiên, chúng ta hãy xem xét một chức năng không có tác dụng phụ. Khi một danh sách mới được gán cho danh sách tham số trong func1[], một vị trí bộ nhớ mới được tạo cho danh sách và danh sách trở thành một biến cục bộ

    def no_side_effects[cities]:
        print[cities]
        cities = cities + ["Birmingham", "Bradford"]
        print[cities]
    locations = ["London", "Leeds", "Glasgow", "Sheffield"]
    no_side_effects[locations]
    

    ĐẦU RA

    function_1 has been called
    function_2 has been called
    variable inside function_1
    0

    function_1 has been called
    function_2 has been called
    variable inside function_1
    1

    ĐẦU RA

    x = 9
    id[x]
    
    0

    Điều này sẽ thay đổi đáng kể, nếu chúng ta tăng danh sách bằng cách sử dụng toán tử gán tăng cường +=. Để hiển thị điều này, chúng tôi thay đổi tên hàm trước đó thành "side_effects" trong ví dụ sau

    x = 9
    id[x]
    
    1

    ĐẦU RA

    function_1 has been called
    function_2 has been called
    variable inside function_1
    0

    function_1 has been called
    function_2 has been called
    variable inside function_1
    1

    ĐẦU RA

    x = 9
    id[x]
    
    4

    Chúng ta có thể thấy rằng Birmingham và Bradford cũng được bao gồm trong các vị trí trong danh sách toàn cầu, bởi vì += hoạt động như một hoạt động tại chỗ

    Người dùng chức năng này có thể ngăn tác dụng phụ này bằng cách chuyển một bản sao cho chức năng. Một bản sao nông là đủ, vì không có cấu trúc lồng nhau trong danh sách. Để làm hài lòng các khách hàng Pháp của chúng tôi, chúng tôi thay đổi tên thành phố trong ví dụ tiếp theo để chứng minh tác dụng của toán tử slice trong lệnh gọi hàm

    x = 9
    id[x]
    
    5

    ĐẦU RA

    x = 9
    id[x]
    
    6

    function_1 has been called
    function_2 has been called
    variable inside function_1
    1

    ĐẦU RA

    x = 9
    id[x]
    
    8

    Chúng ta có thể thấy rằng các vị trí danh sách toàn cầu không bị ảnh hưởng bởi việc thực thi chức năng

    Đào tạo Python trực tiếp

    Thưởng thức trang này?

    Nhìn thấy. Tổng quan về các khóa học Python trực tiếp

    Các khóa học trực tuyến sắp tới

    Khái niệm cơ bản về Python cho người mới bắt đầu

    Khóa học nâng cao chuyên sâu

    Python dành cho kỹ sư và nhà khoa học

    Lập trình hướng đối tượng với Python

    đăng ký tại đây

    Đối số dòng lệnh

    Nếu bạn sử dụng giao diện dòng lệnh, tôi. e. giao diện người dùng văn bản [TUI] chứ không phải giao diện người dùng đồ họa [GUI], các đối số dòng lệnh rất hữu ích. Chúng là các đối số được thêm vào sau lệnh gọi hàm trong cùng một dòng

    Thật dễ dàng để viết các tập lệnh Python bằng các đối số dòng lệnh. Nếu bạn gọi tập lệnh Python từ trình bao, các đối số sẽ được đặt sau tên tập lệnh. Các đối số được phân tách bằng dấu cách. Bên trong tập lệnh, các đối số này có thể truy cập được thông qua biến danh sách sys. argv. Tên của tập lệnh được bao gồm trong danh sách này sys. argv[0]. hệ thống. argv[1] chứa tham số đầu tiên, sys. argv[2] thứ hai, v.v. Đoạn script sau [đối số. py] in tất cả các đối số

    x = 9
    id[x]
    
    9

    Lặp lại trên tất cả các đối số

    140709692940944
    0

    Ví dụ gọi đến tập lệnh này

    140709692940944
    1

    Cuộc gọi này tạo ra đầu ra sau

    140709692940944
    2

    Đào tạo Python trực tiếp

    Thưởng thức trang này?

    Nhìn thấy. Tổng quan về các khóa học Python trực tiếp

    đăng ký tại đây

    Độ dài thay đổi của tham số

    Bây giờ chúng tôi sẽ giới thiệu các hàm có thể nhận số lượng đối số tùy ý. Những người có một số nền tảng lập trình trong C hoặc C++ biết điều này từ tính năng varargs của các ngôn ngữ này

    Một số định nghĩa không thực sự cần thiết cho các trường hợp sau. Hàm có số đối số tùy ý thường được gọi là hàm biến thiên trong khoa học máy tính. Để sử dụng một thuật ngữ đặc biệt khác. Một chức năng biến đổi là một chức năng của arity không xác định. Số hạng của một hàm hoặc một phép toán là số đối số hoặc toán hạng mà hàm hoặc phép toán đó nhận. Thuật ngữ này bắt nguồn từ các từ như "đơn nguyên", "nhị phân", "bộ ba", tất cả đều kết thúc bằng "ary"

    Dấu hoa thị "*" được sử dụng trong Python để xác định số lượng đối số thay đổi. Ký tự dấu hoa thị phải đứng trước một mã định danh biến trong danh sách tham số

    140709692940944
    3

    ĐẦU RA

    140709692940944
    4

    140709692940944
    5

    ĐẦU RA

    140709692940944
    6

    Chúng ta biết được từ ví dụ trước rằng các đối số được truyền cho lời gọi hàm của varpafu[] được thu thập trong một bộ, có thể được truy cập dưới dạng biến "bình thường" x trong phần thân của hàm. Nếu hàm được gọi mà không có bất kỳ đối số nào, giá trị của x là một bộ trống

    Đôi khi, cần sử dụng các tham số vị trí theo sau là một số tham số tùy ý trong định nghĩa hàm. Điều này là có thể, nhưng các tham số vị trí luôn phải đứng trước các tham số tùy ý. Trong ví dụ sau, chúng ta có một tham số vị trí "thành phố", - vị trí chính - luôn phải được cung cấp, theo sau là một số tùy ý các vị trí khác

    140709692940944
    7

    ĐẦU RA

    140709692940944
    8

    * trong lời gọi hàm

    Dấu * cũng có thể xuất hiện trong lời gọi hàm, như chúng ta vừa thấy trong bài tập trước. Ngữ nghĩa trong trường hợp này là "nghịch đảo" thành một ngôi sao trong định nghĩa hàm. Một đối số sẽ được giải nén và không được đóng gói. Nói cách khác, các phần tử của danh sách hoặc bộ dữ liệu được số ít hóa

    140709692940944
    9

    ĐẦU RA

    ref_demo[x]
    
    0

    Hầu như không cần phải đề cập rằng cách gọi chức năng này của chúng tôi thoải mái hơn cách sau

    ref_demo[x]
    
    1

    ĐẦU RA

    ref_demo[x]
    
    0

    Ngoài ra, cuộc gọi trước đó [f[p[0],p[1],p[2]]] không hoạt động trong trường hợp chung, tôi. e. danh sách có độ dài không xác định. "Không xác định" có nghĩa là độ dài chỉ được biết trong thời gian chạy chứ không phải khi chúng tôi viết tập lệnh

    Đào tạo Python trực tiếp

    Thưởng thức trang này?

    Nhìn thấy. Tổng quan về các khóa học Python trực tiếp

    đăng ký tại đây

    Tham số từ khóa tùy ý

    Ngoài ra còn có một cơ chế cho một số tham số từ khóa tùy ý. Để làm điều này, chúng tôi sử dụng ký hiệu dấu hoa thị kép "**"

    ref_demo[x]
    
    3

    ĐẦU RA

    ref_demo[x]
    
    4

    ref_demo[x]
    
    5

    ĐẦU RA

    ref_demo[x]
    
    6

    Dấu hoa thị kép trong lời gọi hàm

    Ví dụ sau minh họa việc sử dụng ** trong một lệnh gọi hàm

    ref_demo[x]
    
    7

    ĐẦU RA

    ref_demo[x]
    
    8

    và bây giờ kết hợp với *

    ref_demo[x]
    
    9

    ĐẦU RA

    x= 9  id= 140709692940944
    x= 42  id= 140709692942000
    
    0

    Tập thể dục

    Viết hàm tính trung bình cộng của một số biến có giá trị

    Dung dịch

    x= 9  id= 140709692940944
    x= 42  id= 140709692942000
    
    1

    Bạn có thể tự hỏi tại sao chúng ta sử dụng cả tham số vị trí "x" và tham số biến "l" trong định nghĩa hàm của mình. Chúng tôi chỉ có thể sử dụng l để chứa tất cả các số của chúng tôi. Chúng tôi muốn thực thi rằng chúng tôi luôn có một danh sách các số không trống. Điều này là cần thiết để ngăn lỗi chia cho 0, vì giá trị trung bình của một danh sách số trống không được xác định

    Trong phiên Python tương tác sau đây, chúng ta có thể tìm hiểu cách sử dụng chức năng này. Chúng tôi giả định rằng hàm aritmetic_mean được lưu trong một tệp có tên là stats. py

    x= 9  id= 140709692940944
    x= 42  id= 140709692942000
    
    2

    Điều này hoạt động tốt, nhưng có một nhược điểm. Điều gì sẽ xảy ra nếu ai đó muốn gọi hàm bằng một danh sách, thay vì một số lượng số thay đổi, như chúng tôi đã trình bày ở trên?

Chủ Đề