Các đối tượng có thể được truyền dưới dạng đối số Python không?

Khi lần đầu tiên tôi gặp một ví dụ về hàm sửa đổi tham số số nguyên được truyền cho nó trong Python, tôi đã ngạc nhiên rằng giá trị đó không thay đổi trong trình gọi, bên ngoài phạm vi hàm. Điều khiến tôi bối rối hơn nữa là đối với các danh sách, giá trị trên thực tế đã thay đổi trong trình gọi

Chúng ta hãy xem một mã Python đơn giản để chứng minh hành vi này

Ví dụ sửa đổi tham số Python

Khi đào sâu thêm một chút về hành vi có vẻ kỳ lạ này, tôi biết được rằng điều này là do lược đồ truyền tham số “Truyền theo tham chiếu đối tượng” được sử dụng bởi Python

Hai trong số các sơ đồ truyền tham số phổ biến hơn được sử dụng bởi các ngôn ngữ lập trình là

  1. Truyền theo giá trị, trong đó một bản sao của giá trị gốc được truyền dưới dạng tham số và do đó giá trị gốc trong trình gọi không thay đổi
  2. Truyền theo tham chiếu, trong đó một tham chiếu đến giá trị ban đầu được truyền dưới dạng tham số và do đó, giá trị ban đầu trong trình gọi cũng được sửa đổi

Trong Tham chiếu đối tượng truyền qua của Python, tham chiếu đối tượng được truyền theo giá trị. Một biến có thể được coi là một tên [hoặc tham chiếu] được gán cho một đối tượng và đối tượng có thể thay đổi được [ví dụ:. danh sách] hoặc bất biến [ví dụ:. số nguyên]. Khi một biến được truyền dưới dạng tham số hàm, thực tế là một bản sao của tham chiếu này được truyền

Pass-By-Object-Reference cho các loại có thể thay đổi và không thể thay đổi

Bây giờ khi chúng ta sửa đổi tham chiếu này trong hàm, đối tượng được tham chiếu được sửa đổi cho các đối tượng có thể thay đổi, nhưng bản sao tham chiếu chỉ tham chiếu một đối tượng mới cho các đối tượng không thể thay đổi

Hãy để chúng tôi cập nhật hàm modify_params trong đoạn mã trên để in id của các tham số trước và sau khi sửa đổi chúng bên trong hàm

Đã cập nhật Chức năng In ID Thông số

ID biến trong Người gọi và trong Chức năng

Như chúng ta có thể quan sát, các biến trong trình gọi tham chiếu đến các đối tượng giống nhau trước và sau khi hàm modify_params được gọi

Trong hàm modify_params, các tham số tham chiếu đến các đối tượng giống như chúng thực hiện trong trình gọi trước khi các biến được sửa đổi. Sau khi các biến được sửa đổi, biến a tham chiếu đến đối tượng bất biến int, tham chiếu đến một đối tượng mới, nhưng biến

def func2[text]:
    return text.upper[]

def func3[text]:
    return text.lower[]

def func1[func]:
    # storing the function in a variable
    res = func["Hello World"]
    print[res]

#funtion calls
func1[func2]
func1[func3]
0 tham chiếu đến đối tượng có thể thay đổi là
def func2[text]:
    return text.upper[]

def func3[text]:
    return text.lower[]

def func1[func]:
    # storing the function in a variable
    res = func["Hello World"]
    print[res]

#funtion calls
func1[func2]
func1[func3]
1, vẫn tham chiếu đến đối tượng cũ và nó được sửa đổi

Tôi hy vọng điều này sẽ giúp làm rõ lược đồ truyền tham số được sử dụng trong Python và tránh một số lỗi gây nhiễu nhất định

Tài nguyên

[1] https. //robertheaton. com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/

[2] https. //www. chuyên viên máy tính. org/is-python-call-by-reference-or-call-by-value/

[3] https. //www. chuyên viên máy tính. org/mutable-vs-immutable-objects-in-python/

Thêm nội dung tại PlainEnglish. io. Đăng ký nhận bản tin miễn phí hàng tuần của chúng tôi. Theo dõi chúng tôi trên Twitter và LinkedIn. Tham gia cộng đồng của chúng tôi

Trong bài viết này, chúng ta sẽ tìm hiểu cách truyền một phương thức làm đối số trong Python. Chúng ta sẽ thảo luận về phương pháp khác nhau của việc chuyển các phương thức và hàm làm đối số bằng cách sử dụng mã tùy chỉnh

Trong Python, mọi thứ như đối tượng, biến, v.v. được coi là một đối tượng. Do đó, các chức năng/phương thức, cũng được coi là đối tượng. Trong bài viết này, chúng tôi sẽ dính vào các phương pháp. Một phương thức có thể nhận nhiều đối số, như đối tượng, biến [cùng hoặc khác loại dữ liệu] và thậm chí cả các phương thức khác vì phương thức python là đối tượng hạng nhất. Các phương thức là các đối tượng có thể gọi được để bạn có thể chuyển chúng, lưu trữ chúng và có thể làm bất cứ điều gì bạn muốn. Phương thức

def func2[text]:
    return text.upper[]

def func3[text]:
    return text.lower[]

def func1[func]:
    # storing the function in a variable
    res = func["Hello World"]
    print[res]

#funtion calls
func1[func2]
func1[func3]
2 được liên kết với mọi phương thức và được gọi tự động khi bạn gọi phương thức có hoặc không có đối số. Bạn có thể nghĩ về một phương thức [hoặc hàm] như một biến có giá trị là đối tượng mã thực tế có thể gọi được. Cả hai phương thức do người dùng định nghĩa hoặc một phương thức tích hợp đều có thể được truyền dưới dạng đối số cho một phương thức khác trong python

Ghi chú

Trong bài viết này, chúng ta sẽ sử dụng các phương thức trong các ví dụ sau, nhưng lưu ý rằng mọi thứ bên dưới đều áp dụng giống hệt nhau cho các hàm [ngoại trừ không có tham số

def func2[text]:
    return text.upper[]

def func3[text]:
    return text.lower[]

def func1[func]:
    # storing the function in a variable
    res = func["Hello World"]
    print[res]

#funtion calls
func1[func2]
func1[func3]
3]. Các hàm và phương thức đều là các khối mã tiện ích, nhưng khi một hàm tiện ích được định nghĩa bên trong một lớp, nó được gọi là một phương thức. Đừng nhầm lẫn giữa phương thức và chức năng. Tất cả các hàm trong Python có thể được truyền dưới dạng đối số cho một hàm khác

Ví dụ. Phương thức lớp được truyền dưới dạng đối số

Các phương thức được truyền dưới dạng đối số giống như một biến. Trong ví dụ này, chúng ta định nghĩa một lớp và các đối tượng của nó. Chúng ta tạo một đối tượng để gọi các phương thức của lớp. Bây giờ, để gọi một phương thức hoặc hàm đã truyền, bạn chỉ cần sử dụng tên mà nó được liên kết giống như cách bạn sẽ sử dụng tên thông thường của phương thức [hoặc hàm]

def func2[text]:
    return text.upper[]

def func3[text]:
    return text.lower[]

def func1[func]:
    # storing the function in a variable
    res = func["Hello World"]
    print[res]

#funtion calls
func1[func2]
func1[func3]
4 Nếu bạn muốn truyền một phương thức của một lớp làm đối số nhưng chưa có đối tượng mà bạn sẽ gọi nó, bạn có thể chỉ cần truyền đối tượng sau khi bạn có nó làm đối số đầu tiên [i. e. đối số "bản thân"]

class my_class:
    def method1[self]:
        return "Hello World"
    def method2[self, methodToRun]:
        result = methodToRun[]
        return result

obj = my_class[]
#method1 is passed as an argument
print[obj.method2[obj.method1]]


Chào thế giới

Ví dụ. Hàm bậc cao hơn được truyền dưới dạng đối số

Giống như các phương thức lớp được gọi bằng cách sử dụng các đối tượng lớp và được truyền dưới dạng đối số, một hàm chung do người dùng định nghĩa cũng có thể được truyền dưới dạng đối số cho hàm khác vì hàm là đối tượng. Các hàm có thể nhận một hàm khác làm đối số được gọi là hàm bậc cao. Trong ví dụ dưới đây, một hàm func1 được tạo lấy một hàm làm đối số

def func2[text]:
    return text.upper[]

def func3[text]:
    return text.lower[]

def func1[func]:
    # storing the function in a variable
    res = func["Hello World"]
    print[res]

#funtion calls
func1[func2]
func1[func3]


Xin chào thế giới
xin chào thế giới

Ví dụ. Hàm bao bọc được truyền dưới dạng đối số

Trong Python, các hàm Wrapper hoặc trình trang trí bọc một hàm khác để mở rộng hành vi của hàm được bao bọc mà không sửa đổi vĩnh viễn nó. Trong Decorators, các hàm được truyền dưới dạng đối số cho một hàm khác và sau đó chúng được gọi bên trong hàm bao bọc

Ví dụ dưới đây định nghĩa một trình trang trí đơn giản hello_decorator. inner1 là một hàm Wrapper trong đó đối số được gọi. Hàm bên trong có thể truy cập các hàm cục bộ bên ngoài như trong trường hợp này là func[]. func[] được gọi bên trong hàm bao bọc

#decorator
def hello_decorator[func]:
    #Wrapper function
    def inner1[]:
        print["Hello, this is before function execution"]

        func[]
        print["This is after function execution"]
    
    return  inner1

# defining a function, to be called inside wrapper
def function_to_be_used[]:
    print["This is inside the function !!"]

# pass 'function_to_be_used' inside the decorator to control its behavior
function_to_be_used = hello_decorator[function_to_be_used]

# calling the function
function_to_be_used[]


Xin chào, đây là trước khi thực thi hàm
Đây là bên trong hàm.
Đây là sau khi thực hiện chức năng

Ví dụ. Lambda Được chuyển làm đối số cho map[]

Ví dụ quan trọng nhất về truyền phương thức làm đối số là lambda. Bạn thường sử dụng

def func2[text]:
    return text.upper[]

def func3[text]:
    return text.lower[]

def func1[func]:
    # storing the function in a variable
    res = func["Hello World"]
    print[res]

#funtion calls
func1[func2]
func1[func3]
5 và
def func2[text]:
    return text.upper[]

def func3[text]:
    return text.lower[]

def func1[func]:
    # storing the function in a variable
    res = func["Hello World"]
    print[res]

#funtion calls
func1[func2]
func1[func3]
6 cùng nhau để thực hiện các thao tác danh sách khác nhau và nhiều thao tác khác trong python. Trong python, biểu thức lambda là một cú pháp đặc biệt để tạo một hàm ẩn danh. Khi bạn đánh giá một biểu thức lambda, đối tượng bạn nhận được được gọi là hàm lambda. Các hàm Lambda giống như các hàm Python thông thường, với một số lưu ý

Python triển khai hàm map[] trong đó tham số đầu tiên là một hàm và tham số thứ hai có thể lặp lại. Trong ví dụ này, lệnh gọi hàm chuyển hàm sqr[x] làm đối số hàm bằng cách sử dụng phương thức bản đồ. Một cách khác để sử dụng phương thức map[] là truyền lambda làm đối số với iterable

def sqr[x]:
    return x ** 2

list1 = [1, 3, 5, 7, 9]
list[map[sqr, list1]]

#use lambda
print[list[map[[lambda x: x**2], list1]]]


[1, 9, 25, 49, 81]

Phần kết luận

Trong bài viết này, chúng ta đã học cách truyền một phương thức và hàm làm đối số cho một hàm khác. Mỗi ví dụ đều có phương pháp riêng. Biểu thức lambda làm đối số cho phương thức map[] là ví dụ tốt nhất để hiểu bài viết này vì bạn đã sử dụng chúng cùng nhau nhiều lần. Hãy thử chuyển các hàm khác nhau làm đối số cho các hàm khác và quan sát hành vi

Bạn có thể chuyển một đối tượng làm đối số không?

Để chuyển một đối tượng làm đối số, chúng ta viết tên đối tượng làm đối số trong khi gọi hàm giống như cách chúng ta thực hiện đối với các biến khác . cú pháp. tên_hàm[tên_đối_tượng]; . Trong ví dụ này, có một lớp có biến số nguyên 'a' và hàm 'add' lấy một đối tượng làm đối số.

Khi một đối tượng được truyền dưới dạng đối số?

Khi một đối tượng được truyền dưới dạng đối số cho một phương thức, đối tượng này thực sự được truyền . đây là tên của một biến tham chiếu luôn có sẵn cho một phương thức thể hiện và tham chiếu đến đối tượng đang gọi phương thức đó. Trường mảng này chứa số phần tử mà mảng có.

Chủ Đề