Bisakah saya memanggil fungsi lain dengan python?

Seperti yang kita ketahui, fungsi adalah blok pernyataan yang digunakan untuk melakukan beberapa tugas tertentu dalam pemrograman. Ini juga membantu memecah kelompok besar kode menjadi potongan atau modul yang lebih kecil. Fungsi dapat dipanggil di mana saja dan berapa kali dalam suatu program. Ini memungkinkan kita untuk menggunakan kembali kode hanya dengan memanggil fungsi atau blok tertentu dalam suatu program. Dengan demikian, ini menghindari pengulangan kode yang sama. Kita dapat mendefinisikan fungsi di dalam kelas, modul, fungsi bersarang, dll

Fitur Fungsi

Berikut adalah fitur-fitur dari Fungsi Python

  1. Ini digunakan untuk menghindari pengulangan kode
  2. Dengan menggunakan fungsi tersebut, kita dapat membagi sekelompok kode menjadi modul yang lebih kecil
  3. Ini membantu menyembunyikan kode dan membuat kejelasan untuk memahami modul
  4. Ini memungkinkan kode dapat digunakan kembali, sehingga menghemat memori
  5. Pernyataan yang ditulis di dalam suatu fungsi hanya dapat dijalankan dengan nama fungsi
  6. Fungsi Python dimulai dengan def dan kemudian titik dua (. ) diikuti dengan nama fungsi

Aturan untuk mendefinisikan fungsi

  1. Kata kunci def digunakan dalam fungsi Python untuk mendeklarasikan dan mendefinisikan suatu fungsi
  2. Nama fungsi harus dimulai dengan pengidentifikasi berikut seperti. A-Z, a-z, dan garis bawah (_)
  3. Setiap fungsi harus mengikuti titik dua (. ) dan kemudian lekukan untuk menulis program
  4. Dalam fungsi Python, kata yang dicadangkan tidak dapat digunakan sebagai nama fungsi atau pengidentifikasi
  5. Di Python, parameter fungsi bisa kosong atau kelipatan

Buat fungsi dengan Python

Untuk membuat sebuah fungsi, kita perlu menggunakan kata kunci def untuk mendeklarasikan atau menulis sebuah fungsi dengan Python. Berikut adalah sintaks untuk membuat fungsi

Sintaksis

Mari kita buat program fungsi dengan Python

Kesenanganku. py

Keluaran

Pemanggilan Fungsi dengan Python

Setelah sebuah fungsi dibuat dengan Python, kita dapat memanggilnya dengan menulis nama_fungsi() itu sendiri atau fungsi lain/fungsi bersarang. Berikut ini adalah sintaks untuk memanggil suatu fungsi

Sintaksis

Pertimbangkan contoh berikut untuk mencetak Pesan Selamat Datang menggunakan fungsi di Python

CallFun. py

Keluaran

Hello World
 Welcome to the JavaTpoint

Dalam contoh di atas, kita memanggil fungsi MyFun() yang mencetak pernyataan

Memanggil Fungsi Bersarang dengan Python

Ketika kita membangun satu fungsi di dalam yang lain, itu disebut fungsi bersarang. Kita dapat membuat fungsi bersarang menggunakan kata kunci def. Setelah membuat fungsi, kita harus memanggil fungsi luar dan dalam untuk mengeksekusi pernyataan. Mari kita buat sebuah program untuk memahami konsep fungsi bersarang dan bagaimana kita dapat memanggil fungsi tersebut

Sarang. py

Keluaran

Hello, it is the outer function
Hello, it is the inner function
_

Seperti yang dapat kita lihat pada contoh di atas, fungsi InFun() didefinisikan di dalam fungsi OutFun(). Untuk memanggil fungsi InFun(), pertama-tama kita memanggil fungsi OutFun() di dalam program. Setelah itu, fungsi OutFun() akan mulai dijalankan dan kemudian memanggil InFun() sebagai output di atas

Catatan. Untuk memanggil fungsi dalam, pertama-tama kita harus memanggil fungsi luar. Jika fungsi eksternal tidak dipanggil, fungsi dalam tidak akan dijalankan

Program untuk mencetak perkalian dua angka menggunakan fungsi bersarang di Python

Nest_arg. py

Keluaran

Display the value of outer variable 6
Display the sum of inner function 8

Berfungsi sebagai Objek Kelas Satu

Dalam Python, fungsinya sebagai Objek Kelas Satu. Karena memperlakukan sama dengan objek, dan memiliki properti dan metode yang sama dengan objek. Suatu fungsi dapat ditugaskan ke variabel, meneruskannya sebagai argumen, menyimpannya dalam struktur data dan mengembalikan nilai dari fungsi lain. Itu bisa dimanipulasi, seperti objek lain di Python. Selanjutnya, semua data dalam program Python direpresentasikan dalam objek atau relasi. Oleh karena itu juga disebut warga negara kelas pertama dari fungsi Python

Fungsi dalam, juga dikenal sebagai fungsi bersarang, adalah fungsi yang Anda tentukan di dalam fungsi lain. Di Python, fungsi semacam ini memiliki akses langsung ke variabel dan nama yang ditentukan dalam fungsi terlampir. Fungsi bagian dalam memiliki banyak kegunaan, terutama sebagai pabrik penutup dan fungsi dekorator

Dalam tutorial ini, Anda akan mempelajari caranya

  • Berikan enkapsulasi dan sembunyikan fungsi Anda dari akses eksternal
  • Tulis fungsi pembantu untuk memfasilitasi penggunaan kembali kode
  • Buat fungsi penutupan pabrik yang mempertahankan status di antara panggilan
  • Fungsi dekorator kode untuk menambahkan perilaku ke fungsi yang ada

Bonus Gratis. Klik di sini untuk mendapatkan Cheat Sheet Python dan mempelajari dasar-dasar Python 3, seperti bekerja dengan tipe data, kamus, daftar, dan fungsi Python

Membuat Fungsi Dalam Python

Fungsi yang didefinisikan di dalam fungsi lain dikenal sebagai fungsi dalam atau fungsi bersarang. Di Python, fungsi semacam ini dapat diakses di fungsi terlampir. Berikut adalah contoh cara membuat fungsi batin dengan Python

>>>

>>> def outer_func():
..     def inner_func():
..         print("Hello, World!")
..     inner_func()
...

>>> outer_func()
Hello, World!
_

Dalam kode ini, Anda mendefinisikan

>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
_6 di dalam
>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
7 untuk mencetak pesan
>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
8 ke layar. Untuk melakukannya, hubungi
>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
_6 di baris terakhir
>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
7. Ini adalah cara tercepat untuk menulis fungsi dalam dengan Python. Namun, fungsi dalam memberikan banyak kemungkinan menarik di luar apa yang Anda lihat dalam contoh ini

Fitur inti dari fungsi dalam adalah kemampuannya untuk mengakses variabel dan objek dari fungsi penutupnya bahkan setelah fungsi ini dikembalikan. Fungsi penutup menyediakan ruang nama yang dapat diakses oleh fungsi bagian dalam

>>>

>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
_

Sekarang Anda dapat meneruskan string sebagai argumen ke

>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
7, dan
>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
6 akan mengakses argumen itu melalui nama
>>> def factorial(number):
..     # Validate input
..     if not isinstance(number, int):
..         raise TypeError("Sorry. 'number' must be an integer.")
..     if number < 0:
..         raise ValueError("Sorry. 'number' must be zero or positive.")
..     # Calculate the factorial of number
..     def inner_factorial(number):
..         if number <= 1:
..             return 1
..         return number * inner_factorial(number - 1)
..     return inner_factorial(number)
...

>>> factorial(4)
24
3. Nama ini, bagaimanapun, didefinisikan dalam
>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
7. Nama yang Anda tetapkan dalam lingkup lokal dari fungsi luar dikenal sebagai nama nonlokal. Mereka bukan lokal dari sudut pandang
>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
_6

Berikut adalah contoh cara membuat dan menggunakan fungsi dalam yang lebih rumit

>>>

>>> def factorial(number):
..     # Validate input
..     if not isinstance(number, int):
..         raise TypeError("Sorry. 'number' must be an integer.")
..     if number < 0:
..         raise ValueError("Sorry. 'number' must be zero or positive.")
..     # Calculate the factorial of number
..     def inner_factorial(number):
..         if number <= 1:
..             return 1
..         return number * inner_factorial(number - 1)
..     return inner_factorial(number)
...

>>> factorial(4)
24
_

Di

>>> def factorial(number):
..     # Validate input
..     if not isinstance(number, int):
..         raise TypeError("Sorry. 'number' must be an integer.")
..     if number < 0:
..         raise ValueError("Sorry. 'number' must be zero or positive.")
..     # Calculate the factorial of number
..     def inner_factorial(number):
..         if number <= 1:
..             return 1
..         return number * inner_factorial(number - 1)
..     return inner_factorial(number)
...

>>> factorial(4)
24
_6, pertama-tama Anda memvalidasi data input untuk memastikan bahwa pengguna Anda memberikan bilangan bulat yang sama dengan atau lebih besar dari nol. Kemudian Anda mendefinisikan fungsi dalam rekursif yang disebut
>>> def factorial(number):
..     # Validate input
..     if not isinstance(number, int):
..         raise TypeError("Sorry. 'number' must be an integer.")
..     if number < 0:
..         raise ValueError("Sorry. 'number' must be zero or positive.")
..     # Calculate the factorial of number
..     def inner_factorial(number):
..         if number <= 1:
..             return 1
..         return number * inner_factorial(number - 1)
..     return inner_factorial(number)
...

>>> factorial(4)
24
7 yang melakukan perhitungan faktorial dan mengembalikan hasilnya. Langkah terakhir adalah menelepon
>>> def factorial(number):
..     # Validate input
..     if not isinstance(number, int):
..         raise TypeError("Sorry. 'number' must be an integer.")
..     if number < 0:
..         raise ValueError("Sorry. 'number' must be zero or positive.")
..     # Calculate the factorial of number
..     def inner_factorial(number):
..         if number <= 1:
..             return 1
..         return number * inner_factorial(number - 1)
..     return inner_factorial(number)
...

>>> factorial(4)
24
7

Catatan. Untuk pembahasan yang lebih mendetail tentang fungsi rekursi dan rekursif, lihat Berpikir Secara Rekursif dengan Python dan Rekursi dengan Python. Sebuah Pengantar

Keuntungan utama menggunakan pola ini adalah, dengan melakukan semua pemeriksaan argumen di fungsi luar, Anda dapat dengan aman melewati pemeriksaan kesalahan di fungsi dalam dan fokus pada komputasi yang ada.

Hilangkan iklan

Menggunakan Fungsi Dalam. Dasar

Kasus penggunaan fungsi dalam Python bervariasi. Anda dapat menggunakannya untuk menyediakan enkapsulasi dan menyembunyikan fungsi Anda dari akses eksternal, Anda dapat menulis fungsi dalam pembantu, dan Anda juga dapat membuat penutup dan dekorator. Di bagian ini, Anda akan mempelajari tentang dua kasus penggunaan fungsi dalam sebelumnya, dan di bagian selanjutnya, Anda akan mempelajari cara membuat dan

Menyediakan Enkapsulasi

Kasus penggunaan umum fungsi dalam muncul saat Anda perlu melindungi, atau menyembunyikan, fungsi tertentu dari semua yang terjadi di luarnya sehingga fungsi tersebut benar-benar tersembunyi dari lingkup global. Perilaku semacam ini umumnya dikenal sebagai enkapsulasi

Inilah contoh yang menyoroti konsep itu

>>>

>>> def increment(number):
..     def inner_increment():
..         return number + 1
..     return inner_increment()
...

>>> increment(10)
11

>>> # Call inner_increment()
>>> inner_increment()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    inner_increment()
NameError: name 'inner_increment' is not defined
_

Dalam contoh ini, Anda tidak dapat mengakses ________12______9 secara langsung. Jika Anda mencoba melakukannya, maka Anda mendapatkan

>>> def increment(number):
..     def inner_increment():
..         return number + 1
..     return inner_increment()
...

>>> increment(10)
11

>>> # Call inner_increment()
>>> inner_increment()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    inner_increment()
NameError: name 'inner_increment' is not defined
0. Itu karena
>>> def increment(number):
..     def inner_increment():
..         return number + 1
..     return inner_increment()
...

>>> increment(10)
11

>>> # Call inner_increment()
>>> inner_increment()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    inner_increment()
NameError: name 'inner_increment' is not defined
_1 benar-benar menyembunyikan
>>> def factorial(number):
..     # Validate input
..     if not isinstance(number, int):
..         raise TypeError("Sorry. 'number' must be an integer.")
..     if number < 0:
..         raise ValueError("Sorry. 'number' must be zero or positive.")
..     # Calculate the factorial of number
..     def inner_factorial(number):
..         if number <= 1:
..             return 1
..         return number * inner_factorial(number - 1)
..     return inner_factorial(number)
...

>>> factorial(4)
24
9, mencegah Anda mengaksesnya dari lingkup global

Membangun Fungsi Batin Pembantu

Terkadang Anda memiliki fungsi yang menjalankan potongan kode yang sama di beberapa tempat di dalam tubuhnya. Misalnya, Anda ingin menulis sebuah fungsi untuk memproses file CSV yang berisi informasi tentang hotspot Wi-Fi di New York City. Untuk mengetahui jumlah total hotspot di New York serta perusahaan yang menyediakan sebagian besar, Anda membuat skrip berikut

# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)

Di sini,

>>> def increment(number):
..     def inner_increment():
..         return number + 1
..     return inner_increment()
...

>>> increment(10)
11

>>> # Call inner_increment()
>>> inner_increment()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    inner_increment()
NameError: name 'inner_increment' is not defined
3 mengambil
>>> def increment(number):
..     def inner_increment():
..         return number + 1
..     return inner_increment()
...

>>> increment(10)
11

>>> # Call inner_increment()
>>> inner_increment()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    inner_increment()
NameError: name 'inner_increment' is not defined
4 sebagai argumen. Fungsi memeriksa apakah
>>> def increment(number):
..     def inner_increment():
..         return number + 1
..     return inner_increment()
...

>>> increment(10)
11

>>> # Call inner_increment()
>>> inner_increment()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    inner_increment()
NameError: name 'inner_increment' is not defined
_4 adalah jalur berbasis string ke file fisik atau. Kemudian ia memanggil fungsi batin pembantu
>>> def increment(number):
..     def inner_increment():
..         return number + 1
..     return inner_increment()
...

>>> increment(10)
11

>>> # Call inner_increment()
>>> inner_increment()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    inner_increment()
NameError: name 'inner_increment' is not defined
6, yang mengambil objek file dan melakukan operasi berikut

  1. Baca konten file ke dalam generator yang menghasilkan kamus menggunakan
  2. Buat daftar penyedia Wi-Fi
  3. Hitung jumlah hotspot Wi-Fi per penyedia menggunakan objek
  4. Cetak pesan dengan informasi yang diambil

Jika Anda menjalankan fungsi, maka Anda mendapatkan output berikut

>>>

>>> from hotspots import process_hotspots

>>> file_obj = open("./NYC_Wi-Fi_Hotspot_Locations.csv", "r")
>>> process_hotspots(file_obj)
There are 3319 Wi-Fi hotspots in NYC.
LinkNYC - Citybridge has the most with 1868.

>>> process_hotspots("./NYC_Wi-Fi_Hotspot_Locations.csv")
There are 3319 Wi-Fi hotspots in NYC.
LinkNYC - Citybridge has the most with 1868.
_

Apakah Anda memanggil

>>> def increment(number):
..     def inner_increment():
..         return number + 1
..     return inner_increment()
...

>>> increment(10)
11

>>> # Call inner_increment()
>>> inner_increment()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    inner_increment()
NameError: name 'inner_increment' is not defined
_3 dengan jalur file berbasis string atau dengan objek file, Anda mendapatkan hasil yang sama

Menggunakan Fungsi Pembantu Dalam vs Pribadi

Biasanya, Anda membuat fungsi batin pembantu seperti

>>> def increment(number):
..     def inner_increment():
..         return number + 1
..     return inner_increment()
...

>>> increment(10)
11

>>> # Call inner_increment()
>>> inner_increment()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    inner_increment()
NameError: name 'inner_increment' is not defined
6 saat Anda ingin menyediakan enkapsulasi. Anda juga dapat membuat fungsi dalam jika Anda pikir Anda tidak akan memanggilnya di tempat lain selain dari fungsi yang memuatnya

Meskipun menulis fungsi pembantu Anda sebagai fungsi dalam mencapai hasil yang diinginkan, Anda mungkin akan lebih baik jika mengekstraknya sebagai fungsi tingkat atas. Dalam hal ini, Anda dapat menggunakan garis bawah di depan (

# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
1) pada nama fungsi untuk menunjukkan bahwa fungsi tersebut bersifat pribadi untuk modul atau kelas saat ini. Ini akan memungkinkan Anda untuk mengakses fungsi pembantu Anda dari tempat lain di modul atau kelas saat ini dan menggunakannya kembali sesuai kebutuhan

Mengekstrak fungsi dalam ke fungsi pribadi tingkat atas dapat membuat kode Anda lebih bersih dan lebih mudah dibaca. Praktek ini dapat menghasilkan fungsi yang akibatnya menerapkan prinsip tanggung jawab tunggal

Mempertahankan Status Dengan Fungsi Dalam. Penutupan

Dalam Python, fungsinya adalah. Ini berarti mereka setara dengan objek lain, seperti angka, string, daftar, tupel, modul, dan sebagainya. Anda dapat membuat atau menghancurkannya secara dinamis, menyimpannya dalam struktur data, meneruskannya sebagai argumen ke fungsi lain, menggunakannya sebagai nilai kembalian, dan seterusnya

Anda juga dapat membuat fungsi tingkat tinggi dengan Python. Fungsi tingkat tinggi adalah fungsi yang beroperasi pada fungsi lain dengan mengambilnya sebagai argumen, mengembalikannya, atau keduanya

Semua contoh fungsi dalam yang telah Anda lihat sejauh ini adalah fungsi biasa yang kebetulan bersarang di dalam fungsi lain. Kecuali jika Anda perlu menyembunyikan fungsi Anda dari dunia luar, tidak ada alasan khusus bagi mereka untuk bersarang. Anda dapat mendefinisikan fungsi tersebut sebagai fungsi tingkat atas pribadi, dan Anda sebaiknya melakukannya

Di bagian ini, Anda akan belajar tentang fungsi penutupan pabrik. Penutupan adalah fungsi yang dibuat secara dinamis yang dikembalikan oleh fungsi lain. Fitur utama mereka adalah bahwa mereka memiliki akses penuh ke variabel dan nama yang ditentukan di namespace lokal tempat penutupan dibuat, meskipun fungsi penutup telah kembali dan selesai dieksekusi

Dalam Python, saat Anda mengembalikan objek fungsi bagian dalam, interpreter mengemas fungsi beserta lingkungan atau penutupannya. Objek fungsi menyimpan snapshot dari semua variabel dan nama yang ditentukan dalam cakupannya. Untuk menentukan penutupan, Anda perlu melakukan tiga langkah

  1. Buat fungsi batin
  2. Variabel referensi dari fungsi penutup
  3. Kembalikan fungsi batin

Dengan pengetahuan dasar ini, Anda dapat langsung mulai membuat penutupan dan memanfaatkan fitur utamanya. mempertahankan keadaan antara pemanggilan fungsi

Hilangkan iklan

Mempertahankan Negara dalam Penutupan

Penutupan menyebabkan fungsi dalam mempertahankan keadaan lingkungannya saat dipanggil. Penutupan bukanlah fungsi bagian dalam itu sendiri tetapi fungsi bagian dalam bersama dengan lingkungan yang melingkupinya. Penutupan menangkap variabel dan nama lokal dalam fungsi yang berisi dan menyimpannya

Perhatikan contoh berikut

 1# powers.py
 2
 3def generate_power(exponent):
 4    def power(base):
 5        return base ** exponent
 6    return power

Inilah yang terjadi dalam fungsi ini

  • Baris 3 membuat
    # hotspots.py
    
    import csv
    from collections import Counter
    
    def process_hotspots(file):
        def most_common_provider(file_obj):
            hotspots = []
            with file_obj as csv_file:
                content = csv.DictReader(csv_file)
    
                for row in content:
                    hotspots.append(row["Provider"])
    
            counter = Counter(hotspots)
            print(
                f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
                f"{counter.most_common(1)[0][0]} has the most with "
                f"{counter.most_common(1)[0][1]}."
            )
    
        if isinstance(file, str):
            # Got a string-based filepath
            file_obj = open(file, "r")
            most_common_provider(file_obj)
        else:
            # Got a file object
            most_common_provider(file)
    
    2, yang merupakan fungsi penutupan pabrik. Ini berarti ia membuat penutupan baru setiap kali dipanggil dan kemudian mengembalikannya ke pemanggil
  • Baris 4 mendefinisikan
    # hotspots.py
    
    import csv
    from collections import Counter
    
    def process_hotspots(file):
        def most_common_provider(file_obj):
            hotspots = []
            with file_obj as csv_file:
                content = csv.DictReader(csv_file)
    
                for row in content:
                    hotspots.append(row["Provider"])
    
            counter = Counter(hotspots)
            print(
                f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
                f"{counter.most_common(1)[0][0]} has the most with "
                f"{counter.most_common(1)[0][1]}."
            )
    
        if isinstance(file, str):
            # Got a string-based filepath
            file_obj = open(file, "r")
            most_common_provider(file_obj)
        else:
            # Got a file object
            most_common_provider(file)
    
    _3, yang merupakan fungsi dalam yang menggunakan argumen tunggal,
    # hotspots.py
    
    import csv
    from collections import Counter
    
    def process_hotspots(file):
        def most_common_provider(file_obj):
            hotspots = []
            with file_obj as csv_file:
                content = csv.DictReader(csv_file)
    
                for row in content:
                    hotspots.append(row["Provider"])
    
            counter = Counter(hotspots)
            print(
                f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
                f"{counter.most_common(1)[0][0]} has the most with "
                f"{counter.most_common(1)[0][1]}."
            )
    
        if isinstance(file, str):
            # Got a string-based filepath
            file_obj = open(file, "r")
            most_common_provider(file_obj)
        else:
            # Got a file object
            most_common_provider(file)
    
    4, dan mengembalikan hasil ekspresi
    # hotspots.py
    
    import csv
    from collections import Counter
    
    def process_hotspots(file):
        def most_common_provider(file_obj):
            hotspots = []
            with file_obj as csv_file:
                content = csv.DictReader(csv_file)
    
                for row in content:
                    hotspots.append(row["Provider"])
    
            counter = Counter(hotspots)
            print(
                f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
                f"{counter.most_common(1)[0][0]} has the most with "
                f"{counter.most_common(1)[0][1]}."
            )
    
        if isinstance(file, str):
            # Got a string-based filepath
            file_obj = open(file, "r")
            most_common_provider(file_obj)
        else:
            # Got a file object
            most_common_provider(file)
    
    5
  • Baris 6 mengembalikan
    # hotspots.py
    
    import csv
    from collections import Counter
    
    def process_hotspots(file):
        def most_common_provider(file_obj):
            hotspots = []
            with file_obj as csv_file:
                content = csv.DictReader(csv_file)
    
                for row in content:
                    hotspots.append(row["Provider"])
    
            counter = Counter(hotspots)
            print(
                f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
                f"{counter.most_common(1)[0][0]} has the most with "
                f"{counter.most_common(1)[0][1]}."
            )
    
        if isinstance(file, str):
            # Got a string-based filepath
            file_obj = open(file, "r")
            most_common_provider(file_obj)
        else:
            # Got a file object
            most_common_provider(file)
    
    _6 sebagai objek fungsi, tanpa memanggilnya

Dari mana

# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
_3 mendapatkan nilai
# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
8? . Dalam contoh ini,
# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
_3 mendapatkan nilai
# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
8 dari fungsi luar,
# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
2. Inilah yang dilakukan Python saat Anda memanggil
# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
2

  1. Tentukan instance baru
    # hotspots.py
    
    import csv
    from collections import Counter
    
    def process_hotspots(file):
        def most_common_provider(file_obj):
            hotspots = []
            with file_obj as csv_file:
                content = csv.DictReader(csv_file)
    
                for row in content:
                    hotspots.append(row["Provider"])
    
            counter = Counter(hotspots)
            print(
                f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
                f"{counter.most_common(1)[0][0]} has the most with "
                f"{counter.most_common(1)[0][1]}."
            )
    
        if isinstance(file, str):
            # Got a string-based filepath
            file_obj = open(file, "r")
            most_common_provider(file_obj)
        else:
            # Got a file object
            most_common_provider(file)
    
    _3, yang menggunakan satu argumen
    # hotspots.py
    
    import csv
    from collections import Counter
    
    def process_hotspots(file):
        def most_common_provider(file_obj):
            hotspots = []
            with file_obj as csv_file:
                content = csv.DictReader(csv_file)
    
                for row in content:
                    hotspots.append(row["Provider"])
    
            counter = Counter(hotspots)
            print(
                f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
                f"{counter.most_common(1)[0][0]} has the most with "
                f"{counter.most_common(1)[0][1]}."
            )
    
        if isinstance(file, str):
            # Got a string-based filepath
            file_obj = open(file, "r")
            most_common_provider(file_obj)
        else:
            # Got a file object
            most_common_provider(file)
    
    4
  2. Ambil snapshot keadaan sekitar
    # hotspots.py
    
    import csv
    from collections import Counter
    
    def process_hotspots(file):
        def most_common_provider(file_obj):
            hotspots = []
            with file_obj as csv_file:
                content = csv.DictReader(csv_file)
    
                for row in content:
                    hotspots.append(row["Provider"])
    
            counter = Counter(hotspots)
            print(
                f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
                f"{counter.most_common(1)[0][0]} has the most with "
                f"{counter.most_common(1)[0][1]}."
            )
    
        if isinstance(file, str):
            # Got a string-based filepath
            file_obj = open(file, "r")
            most_common_provider(file_obj)
        else:
            # Got a file object
            most_common_provider(file)
    
    _3, yang mencakup
    # hotspots.py
    
    import csv
    from collections import Counter
    
    def process_hotspots(file):
        def most_common_provider(file_obj):
            hotspots = []
            with file_obj as csv_file:
                content = csv.DictReader(csv_file)
    
                for row in content:
                    hotspots.append(row["Provider"])
    
            counter = Counter(hotspots)
            print(
                f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
                f"{counter.most_common(1)[0][0]} has the most with "
                f"{counter.most_common(1)[0][1]}."
            )
    
        if isinstance(file, str):
            # Got a string-based filepath
            file_obj = open(file, "r")
            most_common_provider(file_obj)
        else:
            # Got a file object
            most_common_provider(file)
    
    8 dengan nilainya saat ini
  3. Kembalikan
    # hotspots.py
    
    import csv
    from collections import Counter
    
    def process_hotspots(file):
        def most_common_provider(file_obj):
            hotspots = []
            with file_obj as csv_file:
                content = csv.DictReader(csv_file)
    
                for row in content:
                    hotspots.append(row["Provider"])
    
            counter = Counter(hotspots)
            print(
                f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
                f"{counter.most_common(1)[0][0]} has the most with "
                f"{counter.most_common(1)[0][1]}."
            )
    
        if isinstance(file, str):
            # Got a string-based filepath
            file_obj = open(file, "r")
            most_common_provider(file_obj)
        else:
            # Got a file object
            most_common_provider(file)
    
    _3 beserta seluruh keadaan sekitarnya

Dengan cara ini, saat Anda memanggil instance

# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
_3 yang dikembalikan oleh
# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
2, Anda akan melihat bahwa fungsi mengingat nilai
# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
8

>>>

>>> from powers import generate_power

>>> raise_two = generate_power(2)
>>> raise_three = generate_power(3)

>>> raise_two(4)
16
>>> raise_two(5)
25

>>> raise_three(4)
64
>>> raise_three(5)
125
_

Dalam contoh ini,

 1# powers.py
 2
 3def generate_power(exponent):
 4    def power(base):
 5        return base ** exponent
 6    return power
1 mengingat bahwa
 1# powers.py
 2
 3def generate_power(exponent):
 4    def power(base):
 5        return base ** exponent
 6    return power
2, dan
 1# powers.py
 2
 3def generate_power(exponent):
 4    def power(base):
 5        return base ** exponent
 6    return power
3 mengingat bahwa
 1# powers.py
 2
 3def generate_power(exponent):
 4    def power(base):
 5        return base ** exponent
 6    return power
4. Perhatikan bahwa kedua penutupan mengingat
# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
8 masing-masing di antara panggilan

Sekarang pertimbangkan contoh lain

>>>

>>> def has_permission(page):
..     def permission(username):
..         if username.lower() == "admin":
..             return f"'{username}' has access to {page}."
..         else:
..             return f"'{username}' doesn't have access to {page}."
..     return permission
...

>>> check_admin_page_permision = has_permission("Admin Page")

>>> check_admin_page_permision("admin")
"'admin' has access to Admin Page."

>>> check_admin_page_permision("john")
"'john' doesn't have access to Admin Page."
_

Fungsi bagian dalam memeriksa apakah pengguna tertentu memiliki izin yang benar untuk mengakses halaman tertentu. Anda dapat dengan cepat memodifikasi ini untuk menarik pengguna dalam sesi untuk memeriksa apakah mereka memiliki kredensial yang benar untuk mengakses rute tertentu

Alih-alih memeriksa apakah pengguna sama dengan

 1# powers.py
 2
 3def generate_power(exponent):
 4    def power(base):
 5        return base ** exponent
 6    return power
6, Anda dapat meminta database SQL untuk memeriksa izin dan kemudian mengembalikan tampilan yang benar bergantung pada apakah kredensial sudah benar

Biasanya Anda akan membuat penutupan yang tidak mengubah status penutupannya, atau penutupan dengan status penutupan statis, seperti yang Anda lihat pada contoh di atas. Namun, Anda juga dapat membuat penutupan yang mengubah status penyertaannya dengan menggunakan objek yang dapat diubah, seperti kamus, set, atau daftar

Misalkan Anda perlu menghitung rata-rata kumpulan data. Data datang dalam aliran pengukuran berturut-turut dari parameter yang sedang dianalisis, dan Anda memerlukan fungsi Anda untuk mempertahankan pengukuran sebelumnya di antara panggilan. Dalam hal ini, Anda dapat membuat kode fungsi penutupan pabrik seperti ini

>>>

>>> def mean():
..     sample = []
..     def inner_mean(number):
..         sample.append(number)
..         return sum(sample) / len(sample)
..     return inner_mean
...

>>> sample_mean = mean()
>>> sample_mean(100)
100.0
>>> sample_mean(105)
102.5
>>> sample_mean(101)
102.0
>>> sample_mean(98)
101.0
_

Penutupan yang ditetapkan ke

 1# powers.py
 2
 3def generate_power(exponent):
 4    def power(base):
 5        return base ** exponent
 6    return power
7 mempertahankan status
 1# powers.py
 2
 3def generate_power(exponent):
 4    def power(base):
 5        return base ** exponent
 6    return power
8 antara panggilan yang berurutan. Meskipun Anda mendefinisikan
 1# powers.py
 2
 3def generate_power(exponent):
 4    def power(base):
 5        return base ** exponent
 6    return power
8 di
>>> from powers import generate_power

>>> raise_two = generate_power(2)
>>> raise_three = generate_power(3)

>>> raise_two(4)
16
>>> raise_two(5)
25

>>> raise_three(4)
64
>>> raise_three(5)
125
0, itu masih tersedia di penutupan, sehingga Anda dapat memodifikasinya. Dalam hal ini,
 1# powers.py
 2
 3def generate_power(exponent):
 4    def power(base):
 5        return base ** exponent
 6    return power
_8 berfungsi sebagai semacam keadaan penutup dinamis

Memodifikasi Status Penutupan

Biasanya, variabel penutupan benar-benar tersembunyi dari dunia luar. Namun, Anda dapat menyediakan fungsi dalam pengambil dan penyetel untuk mereka

>>>

>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
0

Di sini,

>>> from powers import generate_power

>>> raise_two = generate_power(2)
>>> raise_three = generate_power(3)

>>> raise_two(4)
16
>>> raise_two(5)
25

>>> raise_three(4)
64
>>> raise_three(5)
125
2 mengembalikan penutupan yang mewakili objek
>>> from powers import generate_power

>>> raise_two = generate_power(2)
>>> raise_three = generate_power(3)

>>> raise_two(4)
16
>>> raise_two(5)
25

>>> raise_three(4)
64
>>> raise_three(5)
125
3. Objek ini memiliki fungsi getter dan setter terpasang. Anda dapat menggunakan fungsi tersebut untuk mendapatkan akses baca dan tulis ke variabel
>>> from powers import generate_power

>>> raise_two = generate_power(2)
>>> raise_three = generate_power(3)

>>> raise_two(4)
16
>>> raise_two(5)
25

>>> raise_three(4)
64
>>> raise_three(5)
125
4 dan
>>> from powers import generate_power

>>> raise_two = generate_power(2)
>>> raise_three = generate_power(3)

>>> raise_two(4)
16
>>> raise_two(5)
25

>>> raise_three(4)
64
>>> raise_three(5)
125
5, yang didefinisikan dalam lingkup terlampir dan dikirimkan dengan penutup

Meskipun fungsi ini membuat penutupan yang mungkin bekerja lebih cepat daripada kelas yang setara, Anda perlu menyadari bahwa teknik ini tidak menyediakan fitur utama, termasuk pewarisan, properti, deskriptor, dan metode kelas dan statis. Jika Anda ingin mendalami teknik ini lebih dalam, periksa Alat Sederhana untuk Mensimulasikan Kelas Menggunakan Penutupan dan Cakupan Bersarang (Resep Python)

Hilangkan iklan

Menambahkan Perilaku Dengan Fungsi Dalam. Dekorator

Dekorator python adalah kasus penggunaan populer dan nyaman lainnya untuk fungsi dalam, terutama untuk penutupan. Dekorator adalah fungsi tingkat tinggi yang menggunakan callable (fungsi, metode, kelas) sebagai argumen dan mengembalikan callable lainnya

Anda dapat menggunakan fungsi dekorator untuk menambahkan tanggung jawab ke callable yang sudah ada secara dinamis dan memperluas perilakunya secara transparan tanpa memengaruhi atau memodifikasi callable asli

Catatan. Untuk detail lebih lanjut tentang objek yang dapat dipanggil Python, lihat di dokumentasi Python dan gulir ke bawah ke “Jenis yang dapat dipanggil. ”

Untuk membuat dekorator, Anda hanya perlu mendefinisikan callable (fungsi, metode, atau kelas) yang menerima objek fungsi sebagai argumen, memprosesnya, dan mengembalikan objek fungsi lain dengan perilaku tambahan.

Setelah Anda memiliki fungsi dekorator, Anda dapat menerapkannya ke semua callable. Untuk melakukannya, Anda perlu menggunakan simbol at (

>>> from powers import generate_power

>>> raise_two = generate_power(2)
>>> raise_three = generate_power(3)

>>> raise_two(4)
16
>>> raise_two(5)
25

>>> raise_three(4)
64
>>> raise_three(5)
125
6) di depan nama dekorator dan kemudian menempatkannya pada barisnya sendiri tepat sebelum callable yang dihias

>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
_1

Sintaks ini membuat

>>> from powers import generate_power

>>> raise_two = generate_power(2)
>>> raise_three = generate_power(3)

>>> raise_two(4)
16
>>> raise_two(5)
25

>>> raise_three(4)
64
>>> raise_three(5)
125
7 secara otomatis mengambil
>>> from powers import generate_power

>>> raise_two = generate_power(2)
>>> raise_three = generate_power(3)

>>> raise_two(4)
16
>>> raise_two(5)
25

>>> raise_three(4)
64
>>> raise_three(5)
125
8 sebagai argumen dan memprosesnya di dalam tubuhnya. Operasi ini adalah singkatan untuk tugas berikut

>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
_2

Berikut adalah contoh cara membuat fungsi dekorator untuk menambahkan fungsionalitas baru ke fungsi yang sudah ada

>>>

>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
3

Dalam hal ini, Anda menggunakan

>>> from powers import generate_power

>>> raise_two = generate_power(2)
>>> raise_three = generate_power(3)

>>> raise_two(4)
16
>>> raise_two(5)
25

>>> raise_three(4)
64
>>> raise_three(5)
125
_9 untuk menghias
>>> def has_permission(page):
..     def permission(username):
..         if username.lower() == "admin":
..             return f"'{username}' has access to {page}."
..         else:
..             return f"'{username}' doesn't have access to {page}."
..     return permission
...

>>> check_admin_page_permision = has_permission("Admin Page")

>>> check_admin_page_permision("admin")
"'admin' has access to Admin Page."

>>> check_admin_page_permision("john")
"'john' doesn't have access to Admin Page."
0. Ini menambahkan fungsionalitas baru ke fungsi yang didekorasi. Sekarang ketika Anda memanggil
>>> def has_permission(page):
..     def permission(username):
..         if username.lower() == "admin":
..             return f"'{username}' has access to {page}."
..         else:
..             return f"'{username}' doesn't have access to {page}."
..     return permission
...

>>> check_admin_page_permision = has_permission("Admin Page")

>>> check_admin_page_permision("admin")
"'admin' has access to Admin Page."

>>> check_admin_page_permision("john")
"'john' doesn't have access to Admin Page."
_0, alih-alih hanya mencetak
>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
8, fungsi Anda mencetak dua pesan baru

Kasus penggunaan untuk dekorator Python bervariasi. Inilah beberapa di antaranya

  • Men-debug
  • Caching
  • Penebangan
  • Pengaturan waktu

Praktik umum untuk men-debug kode Python adalah memasukkan panggilan ke

>>> def has_permission(page):
..     def permission(username):
..         if username.lower() == "admin":
..             return f"'{username}' has access to {page}."
..         else:
..             return f"'{username}' doesn't have access to {page}."
..     return permission
...

>>> check_admin_page_permision = has_permission("Admin Page")

>>> check_admin_page_permision("admin")
"'admin' has access to Admin Page."

>>> check_admin_page_permision("john")
"'john' doesn't have access to Admin Page."
3 untuk memeriksa nilai variabel, untuk mengonfirmasi bahwa blok kode dijalankan, dan seterusnya. Menambah dan menghapus panggilan ke
>>> def has_permission(page):
..     def permission(username):
..         if username.lower() == "admin":
..             return f"'{username}' has access to {page}."
..         else:
..             return f"'{username}' doesn't have access to {page}."
..     return permission
...

>>> check_admin_page_permision = has_permission("Admin Page")

>>> check_admin_page_permision("admin")
"'admin' has access to Admin Page."

>>> check_admin_page_permision("john")
"'john' doesn't have access to Admin Page."
_3 dapat mengganggu, dan Anda berisiko melupakan beberapa di antaranya. Untuk mencegah situasi ini, Anda dapat menulis dekorator seperti ini

>>>

>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
4

Contoh ini memberikan

>>> def has_permission(page):
..     def permission(username):
..         if username.lower() == "admin":
..             return f"'{username}' has access to {page}."
..         else:
..             return f"'{username}' doesn't have access to {page}."
..     return permission
...

>>> check_admin_page_permision = has_permission("Admin Page")

>>> check_admin_page_permision("admin")
"'admin' has access to Admin Page."

>>> check_admin_page_permision("john")
"'john' doesn't have access to Admin Page."
5, yang merupakan dekorator yang menggunakan fungsi sebagai argumen dan mencetak tanda tangannya dengan nilai saat ini dari setiap argumen dan nilai pengembalian yang sesuai. Anda dapat menggunakan dekorator ini untuk men-debug fungsi Anda. Setelah Anda mendapatkan hasil yang diinginkan, Anda dapat menghapus panggilan dekorator
>>> def has_permission(page):
..     def permission(username):
..         if username.lower() == "admin":
..             return f"'{username}' has access to {page}."
..         else:
..             return f"'{username}' doesn't have access to {page}."
..     return permission
...

>>> check_admin_page_permision = has_permission("Admin Page")

>>> check_admin_page_permision("admin")
"'admin' has access to Admin Page."

>>> check_admin_page_permision("john")
"'john' doesn't have access to Admin Page."
6, dan fungsi Anda akan siap untuk langkah selanjutnya

Catatan. Jika Anda tertarik untuk mempelajari lebih dalam tentang cara kerja

>>> def has_permission(page):
..     def permission(username):
..         if username.lower() == "admin":
..             return f"'{username}' has access to {page}."
..         else:
..             return f"'{username}' doesn't have access to {page}."
..     return permission
...

>>> check_admin_page_permision = has_permission("Admin Page")

>>> check_admin_page_permision("admin")
"'admin' has access to Admin Page."

>>> check_admin_page_permision("john")
"'john' doesn't have access to Admin Page."
7 dan
>>> def has_permission(page):
..     def permission(username):
..         if username.lower() == "admin":
..             return f"'{username}' has access to {page}."
..         else:
..             return f"'{username}' doesn't have access to {page}."
..     return permission
...

>>> check_admin_page_permision = has_permission("Admin Page")

>>> check_admin_page_permision("admin")
"'admin' has access to Admin Page."

>>> check_admin_page_permision("john")
"'john' doesn't have access to Admin Page."
8 di Python, lihat Python args dan kwargs. Demistifikasi

Inilah contoh terakhir cara membuat dekorator. Kali ini, Anda akan menerapkan kembali

# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
2 sebagai fungsi dekorator

>>>

>>> def outer_func(who):
..     def inner_func():
..         print(f"Hello, {who}")
..     inner_func()
...

>>> outer_func("World!")
Hello, World!
5

Versi

# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
_2 ini menghasilkan hasil yang sama dengan yang Anda dapatkan pada implementasi aslinya. Dalam hal ini, Anda menggunakan penutupan untuk mengingat
# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
8 dan dekorator yang mengembalikan versi modifikasi dari fungsi masukan,
>>> def mean():
..     sample = []
..     def inner_mean(number):
..         sample.append(number)
..         return sum(sample) / len(sample)
..     return inner_mean
...

>>> sample_mean = mean()
>>> sample_mean(100)
100.0
>>> sample_mean(105)
102.5
>>> sample_mean(101)
102.0
>>> sample_mean(98)
101.0
2

Di sini, dekorator perlu mengambil argumen (

# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
8), jadi Anda perlu memiliki dua tingkat fungsi dalam yang bersarang. Tingkat pertama diwakili oleh
# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
_3, yang mengambil fungsi yang dihias sebagai argumen. Tingkat kedua diwakili oleh
>>> def mean():
..     sample = []
..     def inner_mean(number):
..         sample.append(number)
..         return sum(sample) / len(sample)
..     return inner_mean
...

>>> sample_mean = mean()
>>> sample_mean(100)
100.0
>>> sample_mean(105)
102.5
>>> sample_mean(101)
102.0
>>> sample_mean(98)
101.0
_5, yang mengemas argumen
# hotspots.py

import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"There are {len(hotspots)} Wi-Fi hotspots in NYC.\n"
            f"{counter.most_common(1)[0][0]} has the most with "
            f"{counter.most_common(1)[0][1]}."
        )

    if isinstance(file, str):
        # Got a string-based filepath
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Got a file object
        most_common_provider(file)
8 di
>>> def mean():
..     sample = []
..     def inner_mean(number):
..         sample.append(number)
..         return sum(sample) / len(sample)
..     return inner_mean
...

>>> sample_mean = mean()
>>> sample_mean(100)
100.0
>>> sample_mean(105)
102.5
>>> sample_mean(101)
102.0
>>> sample_mean(98)
101.0
7, membuat perhitungan akhir pangkat, dan mengembalikan hasilnya

Hilangkan iklan

Kesimpulan

Jika Anda mendefinisikan fungsi di dalam fungsi lain, Anda membuat fungsi dalam, juga dikenal sebagai fungsi bersarang. Di Python, fungsi dalam memiliki akses langsung ke variabel dan nama yang Anda tentukan dalam fungsi terlampir. Ini memberikan mekanisme bagi Anda untuk membuat fungsi pembantu, penutupan, dan dekorator

Dalam tutorial ini, Anda belajar caranya

  • Berikan enkapsulasi dengan fungsi bersarang di fungsi lain
  • Tulis fungsi pembantu untuk menggunakan kembali potongan kode
  • Terapkan fungsi pabrik penutupan yang mempertahankan status di antara panggilan
  • Bangun fungsi dekorator untuk menyediakan fungsionalitas baru

Anda sekarang siap memanfaatkan banyak kegunaan fungsi dalam dalam kode Anda sendiri. Jika Anda memiliki pertanyaan atau komentar, pastikan untuk membagikannya di bagian komentar di bawah

Tandai sebagai Selesai

Tonton Sekarang Tutorial ini memiliki kursus video terkait yang dibuat oleh tim Real Python. Tonton bersama dengan tutorial tertulis untuk memperdalam pemahaman Anda. Fungsi Dalam Python

🐍 Trik Python 💌

Dapatkan Trik Python singkat & manis yang dikirim ke kotak masuk Anda setiap beberapa hari. Tidak pernah ada spam. Berhenti berlangganan kapan saja. Dikuratori oleh tim Real Python

Bisakah saya memanggil fungsi lain dengan python?

Kirimi Saya Trik Python »

Tentang Leodanis Pozo Ramos

Bisakah saya memanggil fungsi lain dengan python?
Bisakah saya memanggil fungsi lain dengan python?

Leodanis adalah seorang insinyur industri yang menyukai Python dan pengembangan perangkat lunak. Dia adalah pengembang Python otodidak dengan pengalaman lebih dari 6 tahun. Dia adalah seorang penulis teknis yang rajin dengan semakin banyak artikel yang diterbitkan di Real Python dan situs lainnya

» Lebih lanjut tentang Leodanis


Setiap tutorial di Real Python dibuat oleh tim pengembang sehingga memenuhi standar kualitas tinggi kami. Anggota tim yang mengerjakan tutorial ini adalah

Bisakah saya memanggil fungsi lain dengan python?

Aldren

Bisakah saya memanggil fungsi lain dengan python?

Kerekan

Bisakah saya memanggil fungsi lain dengan python?

Geir Arne

Bisakah saya memanggil fungsi lain dengan python?

Jim

Bisakah saya memanggil fungsi lain dengan python?

Joanna

Bisakah saya memanggil fungsi lain dengan python?

Yakub

Bisakah saya memanggil fungsi lain dengan python?

Michael

Master Keterampilan Python Dunia Nyata Dengan Akses Tanpa Batas ke Python Nyata

Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas pakar Pythonista

Tingkatkan Keterampilan Python Anda »

Guru Keterampilan Python Dunia Nyata
Dengan Akses Tak Terbatas ke Real Python

Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video langsung, dan komunitas ahli Pythonista

Tingkatkan Keterampilan Python Anda »

Bagaimana menurut anda?

Nilai artikel ini

Tweet Bagikan Bagikan Email

Apa takeaway # 1 Anda atau hal favorit yang Anda pelajari?

Kiat Berkomentar. Komentar yang paling berguna adalah yang ditulis dengan tujuan belajar dari atau membantu siswa lain. dan dapatkan jawaban atas pertanyaan umum di portal dukungan kami