def python là gì

Khi thao tác với Python, tất cả chúng ta thông thường bắt gặp thật nhiều function @ trước lúc khái niệm một hàm hay là 1 class. Đây là 1 trong feature đặc biệt quan trọng của Python. Nên bản thân và chúng ta bên cạnh nhau hiểu nhằm rõ ràng rộng lớn về nó nha 😁

Nhưng trước tiên, tất cả chúng ta hãy nằm trong trở lại và chính thức kể từ những Function của Python.

1. Function

Một function vô Python được khái niệm như sau:

Bạn đang xem: def python là gì

def function_name(name):
    return 'My name is %s' % name

Function bên trên lấy name thực hiện độ quý hiếm nguồn vào và trả về một string. Trong đó:

  • def là kể từ khóa được dùng nhằm khái niệm một hàm.
  • function_name là tên gọi của function.
  • Biến vô lốt ngoặc đơn (name) là đối số đề nghị cho tới function.
  • Những dòng sản phẩm tiếp theo sau ở vô là nội dung hoặc khái niệm của function.

2. Tính hóa học của function

Trong Python, những function được đánh giá như thể những đối tượng người sử dụng first-class. Như vậy Tức là Python coi 1 function là 1 trong value. Chúng tao rất có thể gán một function cho 1 biến hóa, gửi nó thực hiện đối số cho 1 function không giống hoặc trả về nó bên dưới dạng value từ là 1 function không giống.
Nói thì dường như dông dài thì bản thân nằm trong lấy 1 ví dụ nha.

def say_hello():
    print('Hello world!')

Ở trên đây tất cả chúng ta khái niệm một function say_hello'. Giờ thì tất cả chúng ta rất có thể gán độ quý hiếm cho tới nó.

>>> say_hi = say_hello

Giờ trên đây, tất cả chúng ta rất có thể gọi cho tới say_hi tương tự function say_hello.

>>> say_hi()
Hello world!

Chúng tao cũng rất có thể truyền một function cho 1 function khác ví như một đối số.

def execute(func):
    print('Before execution')
    func()
    print('After execution')

Vì vậy, khi tất cả chúng ta gửi function say_hello nhằm chạy, sản phẩm Output đầu ra sẽ tiến hành như sau:

>>> execute(say_hello)
Before execution
Hello world!
After execution

Python cũng tương hỗ tất cả chúng ta trong những công việc lồng những functions. Nó Tức là tất cả chúng ta rất có thể khái niệm một function vô toàn thân hoặc khái niệm một function không giống. Chúng tao nằm trong lấy 1 ví dụ không giống cho tới điều này:

def foo(x):
    def bar(y):
        return x+y
    return bar

Ở ví dụ bên trên, tôi đã dùng 2 định nghĩa được phát biểu ở trên:

  • Trả về một function (bar) bên dưới dạng value trả về của function foo.
  • Lồng function bar vô khái niệm của function foo.

Giờ tất cả chúng ta nằm trong chạy đoạn code bên trên nha.

>>> v1 = foo(3)

Ở trên đây, v1 tàng trữ value trả về của function foo, tức là function bar. Điều gì tiếp tục xẩy ra nếu như tất cả chúng ta gọi v1 với cùng một vài ba tham ô số?

>>> print(v1(7))
10

Khi một function được xử lý bên dưới dạng data (trong tình huống này là trả về bên dưới dạng value từ là 1 function khác), nó ngầm đem vấn đề quan trọng nhằm thực thi đua. Như vậy được gọi là tính gói gọn (closure) vô Python. Chúng tao rất có thể đánh giá việc gói gọn của function bằng phương pháp dùng tính chất __closure__ của function. Nó tiếp tục trả về cho tới tất cả chúng ta một tuple chứa chấp toàn bộ những closures của function bại liệt. Nếu tất cả chúng ta ham muốn coi ngẫu nhiên nội dung này của closure, tất cả chúng ta rất có thể thực hiện như tiếp sau đây.

>>> v1.__closure__
(<cell at 0x7f517bcc5d30: int object at 0xb010e0>,)
>>> v1.__closure__[0].cell_contents
3

Chúng tao đang được hiểu rằng cả hai tính chất của function, hãy coi tất cả chúng ta rất có thể dùng những tính chất này trong số trường hợp thực tiễn nha.
Giả sử tất cả chúng ta ham muốn tiến hành một trong những tác dụng công cộng trước hoặc sau thời điểm tiến hành function. Nó rất có thể tương tự một mệnh lệnh hiển thị thời hạn tiến hành của function ví dụ điển hình.

Xem thêm: mực lá tiếng anh là gì

Một cơ hội đơn giản nhằm thực hiện điều này là viết lách bất kì điều gì trước và sau thời điểm tiến hành bên dưới dạng những dòng sản phẩm code trước và sau ứng. Ví dụ:

def say_hello():
    print('Before execution')
    print('Hello world!')
    print('After execution')

Nhưng trên đây đem thực sự là 1 trong những cơ hội đảm bảo chất lượng nhằm thực hiện? Như bản thân phát biểu phía trên, đó là một tác dụng công cộng nên điều gì tiếp tục xẩy ra nếu như tất cả chúng ta nhiều hơn thế nữa 1 function và tất cả chúng ta nên tiến hành và một đoạn code cho tới toàn bộ function khác?

def say_hello():
    print('Hello world')
    
   
def say(func):
    def hello(*args, **kwargs):
        print('Before execution')
        execute = func(*args, **kwargs)
        print('After execution')
        return execute
    return hello

Function say_hello chỉ in rời khỏi Hello world. Còn function say nhận một function thực hiện đối số và đưa đến một function không giống là hello vô khái niệm của chính nó. hello tiến hành một trong những câu mệnh lệnh in trước và sau thời điểm tiến hành function được truyền vô bên dưới dạng đối số cho tới say.
Giờ tất cả chúng ta truyền function say_hello vô vào say nha.

>>> new_say_hello = say(say_hello)

new_say_hello là 1 trong những function không giống được return kể từ function say. Vậy thì output của function new_say_hello tiếp tục như vậy nào? Let's kiểm tra it.

>>> new_say_hello()
Before execution
Hello world
After execution

Và điều gì tiếp tục xẩy ra nếu như tất cả chúng ta nếu như tất cả chúng ta gán lại hàm vừa mới được trả về kể từ function say cho tới function say_hello?

>>> say_hello = say(say_hello)
>>> say_hello()
Before execution
Hello world
After execution

Chúng tao đang được thay cho thay đổi tác dụng của của function say_hello nhưng mà bất biến đoạn code của chủ yếu function này.
Vậy tiếp theo sau được xem là gì? Nếu đang được hiểu cho tới trên đây, thì tất cả chúng ta đang được thám thính hiểu xong xuôi về thực chất của decorator rồi bại liệt. Mình tiếp tục lý giải tăng nha.

3. Decorator

decorator là function được cho phép tất cả chúng ta rất có thể tự tại không ngừng mở rộng hoặc sửa đổi function một cơ hội hoạt bát nhưng mà ko cần thiết tiến hành thay cho thay đổi code lúc đầu của chính nó.
Trong ví dụ tren, hàm say cung ứng cho tới tất cả chúng ta tác dụng này (nó thay cho thay đổi output của hàm say_hello). Vì vậy, say được gọi là decorator. Thay vì thế truyền trực tiếp say_hello cho tới say, tất cả chúng ta rất có thể viết lách tắt:

@say
def say_hello():
    print('Hello world')

Mình kỳ vọng chúng ta đang được nắm được decorator là gì. Có lúc nào chúng ta tự động chất vấn tại vì sao tất cả chúng ta cần thiết return một function kể từ say? Mà tất cả chúng ta chỉ việc gọi function say, vô bại liệt tất cả chúng ta rất có thể in những dòng sản phẩm mệnh lệnh cùng theo với việc tiến hành function đối số?

def say_1(func):
    print('Before execution')
    func()
    print('After execution')

Giả sử, bản thân đồng ý với khêu ý này. Nhưng bản thân cũng đều có một vài ba câu hỏi:

  • Giờ trên đây, say_hello tiếp tục lưu độ quý hiếm là gì? Nó rất có thể gọi luôn luôn được không?.

=> say_hello tiếp tục lưu độ quý hiếm None là độ quý hiếm trả về cho tới say_1. Nên tất cả chúng ta ko thể gọi say_hello ngay lập tức tức tốc.

Xem thêm: class diagram là gì

  • Điều gì tiếp tục xẩy ra nếu như tất cả chúng ta ham muốn không ngừng mở rộng một function mang trong mình 1 vài ba đối số như bên dưới đây:
def say_2(func, arg1, arg2):
    print('Before execution')
    func(arg1, arg2)
    print('After execution')

Nhưng yếu tố ở trên đây là: thực hiện thế này nhằm nhận giá tốt trị của arg1arg2 bên trên thời gian truyền ngẫu nhiên function này cho tới say_2?

>>> say_hello = say_2(say_hello, arg1, arg2)

Ở trên đây, tất cả chúng ta ko thể lấy giá tốt trị của arg1arg2.
Mình kỳ vọng 2 thắc mắc này rất có thể lý giải được tại vì sao decorator rất cần được return một function.

4. Một vài ba ví dụ về decorator

  • Tính thời hạn tiến hành một function:
def compute_execution_time(func):
    def compute(*args, **kwargs):
        start_time = time.time()
        response = func(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)
        return response
    return compute
  • Hoặc vô một phần mềm trang web, nó rất có thể dùng nhằm đánh giá user đang được login hoặc chưa:
def login_required(func):
    def check_login(request, *args, **kwargs):
        if request.user.is_authenticated():
            return func(request, *args, **kwargs)
        else:
            return redirect('/login')
    return check_login

5. Lời kết

Cảm ơn chúng ta đang được hiểu cho tới trên đây. Mình kỳ vọng nội dung bài viết này rất có thể cung ứng những kiến thức và kỹ năng cơ bạn dạng nhất về decorator vô Python và một trong những tình huống dùng. Nếu chúng ta đem một trong những khêu ý nhằm rất có thể canh ty quý khách tiếp cận cho tới decorator một cơ hội dễ dàng nắm bắt nhất, hãy comment ở bên dưới nha.

Related links

  • https://www.programiz.com/python-programming/function
  • https://dbader.org/blog/python-decorators