ユーザー入力の整理に関する問題は、プログラミング プロセスにおいて非常に一般的です。多くの場合、文字を小文字または大文字に変換するだけで十分ですが、正規表現モジュール「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()」を使用して生成とマッピングを行うことができます。 (スライス)
import itertools s = itertools.islice(range(50), 10, 20)# <itertools.islice object at 0x7f70fab88138> for val in s: ...
「itertools.islice」を使用して、必要な項目を生成できるイテレータである「islice」オブジェクトを作成できます。ただし、この操作では、スライスの前のすべてのジェネレーター項目と、「islice」オブジェクト内のすべての項目が使用されることに注意してください。
反復可能なオブジェクトの先頭をスキップする
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」ステートメントをサポートするオブジェクトを作成する
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__」を使用してメモリを節約する
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」とメモリの使用量を制限する
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」を使用して設定します。
インポートできるものとできないものを制御する
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 サイトの他の関連記事を参照してください。