ホームページ  >  記事  >  バックエンド開発  >  高度な Python プログラミング、よく使われる 8 つのスキル!

高度な Python プログラミング、よく使われる 8 つのスキル!

WBOY
WBOY転載
2023-04-18 09:34:02944ブラウズ

高度な Python プログラミング、よく使われる 8 つのスキル!

文字列入力の整理

ユーザー入力の整理に関する問題は、プログラミング プロセスにおいて非常に一般的です。多くの場合、文字を小文字または大文字に変換するだけで十分ですが、正規表現モジュール「Regex」を使用してその作業を実行できる場合もあります。ただし、問題が複雑な場合は、より良い解決方法がある可能性があります。

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...

この例では、スペース文字「n」と「t」が 1 つのスペースに置き換えられていることがわかります。 「r」を削除しました。これは非常に単純な例です。さらに進んで、「unicodedata」パッケージを使用して大きな再マッピング テーブルを生成し、その中で「combining()」を使用して生成とマッピングを行うことができます。 (スライス)

イテレータをスライスすると、ジェネレータ オブジェクトに添字がないことを示す「TypeError」が返されますが、この問題を解決するには簡単な解決策を使用できます。

import itertools
s = itertools.islice(range(50), 10, 20)# <itertools.islice object at 0x7f70fab88138>
for val in s:
...

「itertools.islice」を使用して、必要な項目を生成できるイテレータである「islice」オブジェクトを作成できます。ただし、この操作では、スライスの前のすべてのジェネレーター項目と、「islice」オブジェクト内のすべての項目が使用されることに注意してください。

反復可能なオブジェクトの先頭をスキップする

不要な行 (コメントなど) で始まるファイルを処理する必要がある場合があります。 「itertools」は、ここでも簡単な解決策を提供します。

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)

このコードは、最初のコメント部分の後のコンテンツのみを出力します。このメソッドは、反復可能なオブジェクトの先頭 (この場合は最初のコメント行) のみを破棄したいが、この部分をどのくらいの長さにしたいのかがわからない場合に便利です。

キーワード引数のみを含む関数 (kwargs)

次の関数を使用する場合、より明確な関数定義を提供するために、入力としてキーワード引数のみを必要とする関数を作成すると便利です。 :

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...

ご覧のとおり、キーワード引数の前に「*」を追加すると問題が解決します。 「*」パラメータの前にいくつかのパラメータを置く場合、それらは明らかに位置パラメータです。

「with」ステートメントをサポートするオブジェクトを作成する

たとえば、「with」ステートメントを使用してファイルを開いたり、ロックを取得したりする方法は誰もが知っていますが、次のようなオブジェクトを実装できるでしょうか。独自のコンテキスト表現?はい、「__enter__」と「__exit__」を使用してコンテキスト管理プロトコルを実装できます:

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

これは Python でコンテキスト管理を実装する最も一般的な方法ですが、もっと簡単な方法もあります:

from contextlib import contextmanager
@contextmanager
def tag(name):
print(f"<{name}>")
yield
print(f"</{name}>")
with tag("h1"):
print("This is Title.")

上記のコードは、contextmanager のマネージャー デコレーターを使用してコンテンツ管理プロトコルを実装します。 with ブロックが入力された時点でタグ関数の最初の部分 (yield の前の部分) が実行され、次に with ブロックが実行され、最後にタグ関数の残りの部分が実行されます。

「__slots__」を使用してメモリを節約する

特定のクラスのインスタンスを大量に作成するプログラムを作成したことがある場合は、プログラムで突然大量のメモリが必要になることに気づいたかもしれません。記憶の。これは、Python が辞書を使用してクラス インスタンスの属性を表すため、高速ではありますが、メモリ効率があまり高くないためです。通常、これは深刻な問題ではありません。ただし、プログラムがこれによって深刻な影響を受ける場合は、「__slots__」を試してみるとよいでしょう:

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

「__slots__」属性を定義するとき、Python は属性を表すために辞書を使用せず、小さな固定サイズの配列により、インスタンスごとに必要なメモリが大幅に削減されます。 「__slots__」の使用にはいくつかの欠点もあります。新しい属性を宣言することはできず、「__slots__」では既存の属性しか使用できません。また、「__slots__」を持つクラスは多重継承を使用できません。

「CPU」とメモリの使用量を制限する

プログラムのメモリや CPU の使用量を最適化したくないが、特定の数値に直接制限したい場合、Python には次の機能もあります。対応するライブラリはこれを行うことができます:

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))

上記のコード スニペットには、最大 CPU 実行時間と最大メモリ使用制限を設定するオプションも含まれていることがわかります。 CPU の実行時間を制限する場合、最初にその特定のリソース (RLIMIT_CPU) のソフト制限とハード制限を取得し、次にパラメーターで指定された秒数と以前に取得したハード制限を使用して設定します。最後に、CPU が制限を超えた場合、システムに終了するよう信号を送ります。メモリ使用量に関しては、ソフト制限とハード制限を再度取得し、「size」パラメータと以前に取得したハード制限を指定した「setrlimit」を使用して設定します。

インポートできるものとできないものを制御する

一部の言語には、メンバー (変数、メソッド、インターフェイス) をエクスポートするための非常に明白なメカニズムがあります。たとえば、Golang では大文字で始まるメンバーのみです。がエクスポートされます。ただし、Python では、すべてのメンバーがエクスポートされます (「__all__」を使用しない限り):

def foo():
pass
def bar():
pass
__all__ = ["bar"]

上記のコードでは、「bar」関数のみがエクスポートされることがわかります。同様に、何もエクスポートされないように「__all__」を空のままにすることもできます。その場合、このモジュールからインポートするときに「AttributeError」が発生します。

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

为一个类实现所有的比较运算符(如 __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 的标准库,如果你不能找到想要的功能,可能只是因为你还没有尽力查找(如果真的没有,那它肯定也存在于一些第三方库)。

以上が高度な Python プログラミング、よく使われる 8 つのスキル!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。