Kesederhanaan Python membolehkan pembangun menulis program berfungsi dengan cepat, tetapi teknik lanjutan boleh menjadikan kod anda lebih cekap, boleh diselenggara dan elegan. Petua dan contoh lanjutan ini akan membawa kemahiran Python anda ke peringkat seterusnya.
Apabila bekerja dengan set data yang besar, gunakan penjana dan bukannya senarai untuk menjimatkan memori:
# List consumes memory upfront numbers = [i**2 for i in range(1_000_000)] # Generator evaluates lazily numbers = (i**2 for i in range(1_000_000)) # Iterate over the generator for num in numbers: print(num) # Processes one item at a time
Sebab: Penjana mencipta item dengan cepat, mengelakkan keperluan untuk menyimpan keseluruhan urutan dalam ingatan.
Untuk kelas yang menyimpan data terutamanya, kelas data mengurangkan kod boilerplate:
from dataclasses import dataclass @dataclass class Employee: name: str age: int position: str # Instead of defining __init__, __repr__, etc. emp = Employee(name="Alice", age=30, position="Engineer") print(emp) # Employee(name='Alice', age=30, position='Engineer')
Sebab: kelas data mengendalikan __init__ , __repr__ dan kaedah lain secara automatik.
Pengurus konteks tersuai memudahkan pengurusan sumber:
from contextlib import contextmanager @contextmanager def open_file(file_name, mode): file = open(file_name, mode) try: yield file finally: file.close() # Usage with open_file("example.txt", "w") as f: f.write("Hello, world!")
Sebab: Pengurus konteks memastikan pembersihan yang betul (cth., menutup fail) walaupun pengecualian berlaku.
4. Manfaatkan Anotasi Fungsi
Anotasi meningkatkan kejelasan dan membolehkan analisis statik:
def calculate_area(length: float, width: float) -> float: return length * width # IDEs and tools like MyPy can validate these annotations area = calculate_area(5.0, 3.2)
Sebab: Anotasi membuat kod pendokumentasian sendiri dan membantu menangkap ralat jenis semasa pembangunan.
Penghias memanjangkan atau mengubah suai fungsi tanpa mengubah fungsi asal:
def log_execution(func): def wrapper(*args, **kwargs): print(f"Executing {func.__name__} with {args}, {kwargs}") return func(*args, **kwargs) return wrapper @log_execution def add(a, b): return a + b result = add(3, 5) # Output: Executing add with (3, 5), {}
Sebab: Penghias mengurangkan pertindihan untuk tugas seperti pengelogan, pengesahan atau fungsi pemasaan.
Modul functools memudahkan tingkah laku fungsi yang kompleks:
from functools import lru_cache @lru_cache(maxsize=100) def fibonacci(n): if n < 2: return n return fibonacci(n - 1) + fibonacci(n - 2) print(fibonacci(50)) # Efficient due to caching
Sebab: Fungsi seperti lru_cache mengoptimumkan prestasi dengan menghafal hasil panggilan fungsi yang mahal.
Modul koleksi menawarkan struktur data lanjutan:
from collections import defaultdict, Counter # defaultdict with default value word_count = defaultdict(int) for word in ["apple", "banana", "apple"]: word_count[word] += 1 print(word_count) # {'apple': 2, 'banana': 1} # Counter for frequency counting freq = Counter(["apple", "banana", "apple"]) print(freq.most_common(1)) # [('apple', 2)]
Sebab: lalai dan Kaunter memudahkan tugas seperti mengira kejadian.
Untuk tugas terikat CPU atau terikat IO, pelaksanaan selari mempercepatkan pemprosesan:
from concurrent.futures import ThreadPoolExecutor def square(n): return n * n with ThreadPoolExecutor(max_workers=4) as executor: results = executor.map(square, range(10)) print(list(results)) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Sebab: concurrent.futures menjadikan multi-threading dan multi-processing lebih mudah.
9. Gunakan pathlib untuk Operasi Fail
Modul pathlib menyediakan cara intuitif dan berkuasa untuk bekerja dengan laluan fail:
from pathlib import Path path = Path("example.txt") # Write to a file path.write_text("Hello, pathlib!") # Read from a file content = path.read_text() print(content) # Check if a file exists if path.exists(): print("File exists")
Sebab: pathlib lebih mudah dibaca dan serba boleh berbanding os dan os.path.
Uji sistem kompleks dengan mengejek kebergantungan:
# List consumes memory upfront numbers = [i**2 for i in range(1_000_000)] # Generator evaluates lazily numbers = (i**2 for i in range(1_000_000)) # Iterate over the generator for num in numbers: print(num) # Processes one item at a time
Sebab: Mengejek mengasingkan kod yang sedang diuji, memastikan kebergantungan luaran tidak mengganggu ujian anda.
Menguasai teknik lanjutan ini akan meningkatkan kemahiran pengekodan Python anda. Masukkannya ke dalam aliran kerja anda untuk menulis kod yang bukan sahaja berfungsi tetapi juga cekap, boleh diselenggara dan Pythonic. Selamat mengekod!
Atas ialah kandungan terperinci Petua Lanjutan untuk Memperbaik Kod Python Anda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!