Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengaturcaraan Python lanjutan, lapan kemahiran yang biasa digunakan!

Pengaturcaraan Python lanjutan, lapan kemahiran yang biasa digunakan!

WBOY
WBOYke hadapan
2023-04-18 09:34:02948semak imbas

Pengaturcaraan Python lanjutan, lapan kemahiran yang biasa digunakan!

Mengatur input rentetan

Masalah mengatur input pengguna adalah sangat biasa dalam proses pengaturcaraan. Selalunya, cukup untuk menukar aksara kepada huruf kecil atau huruf besar, dan kadangkala anda boleh menggunakan modul ungkapan biasa "Regex" untuk melakukan kerja. Tetapi jika masalahnya rumit, mungkin terdapat cara yang lebih baik untuk menyelesaikannya:

user_input = "Thisnstring hastsome whitespaces...rn"
character_map = {
ord('n') : ' ',
ord('t') : ' ',
ord('r') : None
}

user_input.translate(character_map)# This string has some whitespaces...

Dalam contoh ini, anda dapat melihat bahawa aksara ruang "n" dan "t" telah digantikan dengan satu space, "r" semuanya telah dipadamkan. Ini hanyalah contoh yang sangat mudah. ​​Kita boleh pergi lebih jauh dan menggunakan pakej "unicodedata" untuk menjana jadual pemetaan semula yang besar, dan menggunakan "combining()" di dalamnya untuk menjana dan memetakan hirisan lelaran (Slice)

Jika anda memotong iterator, "TypeError" akan dikembalikan, menunjukkan bahawa objek penjana tidak mempunyai subskrip, tetapi kami boleh menggunakan penyelesaian mudah untuk menyelesaikan masalah ini:

Kita boleh menggunakan "itertools.islice" untuk mencipta objek "islice", iaitu iterator yang boleh menghasilkan item yang kita inginkan. Walau bagaimanapun, perlu diingatkan bahawa operasi ini menggunakan semua item penjana sebelum kepingan, serta semua item dalam objek "islice".
import itertools
s = itertools.islice(range(50), 10, 20)# <itertools.islice object at 0x7f70fab88138>
for val in s:
...

Langkau permulaan objek boleh lelar

Kadangkala anda perlu berurusan dengan fail yang bermula dengan baris yang tidak diingini (seperti komen). "itertools" sekali lagi menyediakan penyelesaian mudah:

Kod ini hanya mencetak kandungan selepas bahagian ulasan awal. Kaedah ini berguna jika kita hanya mahu membuang permulaan objek boleh lelar (dalam kes ini, baris komen permulaan), tetapi kita tidak tahu berapa lama kita mahu bahagian ini.
string_from_file = """
// Author: ...
// License: ...
//
// Date: ...
Actual content...
"""
import itertools
for line in itertools.dropwhile(lambda line: line.startswith("//"), string_from_file.split("n")):
print(line)

Fungsi yang mengandungi hanya argumen kata kunci (kwargs)

Apabila kita menggunakan fungsi di bawah, adalah berguna untuk mencipta fungsi yang hanya memerlukan argumen kata kunci sebagai input untuk memberikan definisi fungsi yang lebih jelas :

Seperti yang anda lihat, menambah "*" sebelum hujah kata kunci menyelesaikan masalah. Jika kita meletakkan beberapa parameter sebelum parameter "*", ia jelas merupakan parameter kedudukan.
def test(*, a, b):
pass
test("value for a", "value for b")# TypeError: test() takes 0 positional arguments...
test(a="value", b="value 2")# Works...

Buat objek yang menyokong pernyataan "dengan"

Sebagai contoh, kita semua tahu cara menggunakan pernyataan "dengan" untuk membuka fail atau memperoleh kunci, tetapi bolehkah kita melaksanakan ungkapan kontekstual sendiri? Ya, kita boleh menggunakan "__enter__" dan "__exit__" untuk melaksanakan protokol pengurusan konteks:

Ini ialah cara paling biasa untuk melaksanakan pengurusan konteks dalam Python, tetapi terdapat cara yang lebih mudah:
class Connection:
def __init__(self):
...
def __enter__(self):
# Initialize connection...
def __exit__(self, type, value, traceback):
# Close connection...
with Connection() as c:
# __enter__() executes
...
# conn.__exit__() executes

Kod di atas melaksanakan protokol pengurusan kandungan menggunakan penghias pengurus bagi pengurus konteks. Bahagian pertama fungsi tag (bahagian sebelum hasil) dilaksanakan apabila blok dengan dimasukkan, kemudian blok dengan dilaksanakan, dan akhirnya fungsi tag yang lain dilaksanakan.
from contextlib import contextmanager
@contextmanager
def tag(name):
print(f"<{name}>")
yield
print(f"</{name}>")
with tag("h1"):
print("This is Title.")

Simpan memori dengan "__slots__"

Jika anda pernah menulis atur cara yang mencipta sejumlah besar kejadian kelas tertentu, maka anda mungkin perasan bahawa program anda tiba-tiba memerlukan banyak ingatan. Itu kerana Python menggunakan kamus untuk mewakili atribut contoh kelas, yang menjadikannya pantas, tetapi tidak begitu cekap memori. Biasanya, ini bukan masalah yang serius. Walau bagaimanapun, jika program anda terjejas teruk oleh perkara ini, anda juga boleh mencuba "__slots__":

Apabila kami mentakrifkan atribut "__slots__", Python tidak menggunakan kamus untuk mewakili atribut, tetapi menggunakan tatasusunan saiz tetap A yang kecil, yang sangat mengurangkan memori yang diperlukan setiap contoh. Menggunakan "__slots__" juga mempunyai beberapa kelemahan: kami tidak boleh mengisytiharkan sebarang atribut baharu, kami hanya boleh menggunakan atribut sedia ada pada "__slots__". Selain itu, kelas dengan "__slots__" tidak boleh menggunakan berbilang warisan.
class Person:
__slots__ = ["first_name", "last_name", "phone"]
def __init__(self, first_name, last_name, phone):
self.first_name = first_name
self.last_name = last_name
self.phone = phone

Hadkan "CPU" dan penggunaan memori

Jika anda tidak mahu mengoptimumkan memori program atau penggunaan CPU, tetapi ingin mengehadkannya terus kepada nombor tertentu, Python juga mempunyai The perpustakaan yang sepadan boleh melakukan:

Kita dapat melihat bahawa dalam coretan kod di atas, ia juga mengandungi pilihan untuk menetapkan masa berjalan CPU maksimum dan had penggunaan memori maksimum. Apabila mengehadkan masa jalan CPU, kami mula-mula mendapatkan had lembut dan keras untuk sumber khusus tersebut (RLIMIT_CPU) dan kemudian menetapkannya menggunakan bilangan saat yang ditentukan melalui parameter dan had keras yang diambil sebelum ini. Akhir sekali, jika CPU melebihi had, kami memberi isyarat kepada sistem untuk keluar. Dari segi penggunaan memori, kami mendapatkan semula had lembut dan keras dan menetapkannya menggunakan "setrlimit" dengan parameter "saiz" dan had keras yang diambil sebelum ini.
import signal
import resource
import os
# To Limit CPU time
def time_exceeded(signo, frame):
print("CPU exceeded...")
raise SystemExit(1)
def set_max_runtime(seconds):
# Install the signal handler and set a resource limit
soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))
signal.signal(signal.SIGXCPU, time_exceeded)
# To limit memory usage
def set_max_memory(size):
soft, hard = resource.getrlimit(resource.RLIMIT_AS)
resource.setrlimit(resource.RLIMIT_AS, (size, hard))

Kawal perkara yang boleh/tidak boleh diimport

Sesetengah bahasa mempunyai mekanisme yang sangat jelas untuk mengeksport ahli (pembolehubah, kaedah, antara muka Contohnya, di Golang hanya ahli yang bermula dengan huruf besar). dieksport. Walau bagaimanapun, dalam Python, semua ahli dieksport (melainkan kita menggunakan "__all__"):

Dalam kod di atas, kita tahu bahawa hanya fungsi "bar" dieksport. Begitu juga, kita boleh membiarkan "__all__" kosong supaya tiada apa yang akan dieksport, yang akan menyebabkan "AttributeError" apabila diimport daripada modul ini.
def foo():
pass
def bar():
pass
__all__ = ["bar"]

实现比较运算符的简单方法

为一个类实现所有的比较运算符(如 __lt__ , __le__ , __gt__ , __ge__)是很繁琐的。有更简单的方法可以做到这一点吗?这种时候,「functools.total_ordering」就是一个很好的帮手:

from functools import total_ordering
@total_ordering
class Number:
def __init__(self, value):
self.value = value
def __lt__(self, other):
return self.value < other.value
def __eq__(self, other):
return self.value == other.value
print(Number(20) > Number(3))
print(Number(1) < Number(5))
print(Number(15) >= Number(15))
print(Number(10) <= Number(2))

这里的工作原理究竟是怎样的呢?我们用「total_ordering」装饰器简化实现对类实例排序的过程。我们只需要定义「__lt__」和「__eq__」就可以了,它们是实现其余操作所需要的最小的操作集合(这里也体现了装饰器的作用——为我们填补空白)。

结语

并非本文中所有提到的功能在日常的 Python 编程中都是必需或有用的,但是其中某些功能可能会不时派上用场,而且它们也可能简化一些原本就很冗长且令人烦恼的任务。还需指出的是,所有这些功能都是 Python 标准库的一部分。而在我看来,其中一些功能似乎并不像标准库中包含的标准内容,所以当你使用 Python 实现本文提到的某些功能时,请先参阅 Python 的标准库,如果你不能找到想要的功能,可能只是因为你还没有尽力查找(如果真的没有,那它肯定也存在于一些第三方库)。

Atas ialah kandungan terperinci Pengaturcaraan Python lanjutan, lapan kemahiran yang biasa digunakan!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam