目次
文字列入力の整理
イテレータをスライスすると、ジェネレータ オブジェクトに添字がないことを示す「TypeError」が返されますが、この問題を解決するには簡単な解決策を使用できます。
不要な行 (コメントなど) で始まるファイルを処理する必要がある場合があります。 「itertools」は、ここでも簡単な解決策を提供します。
次の関数を使用する場合、より明確な関数定義を提供するために、入力としてキーワード引数のみを必要とする関数を作成すると便利です。 :
たとえば、「with」ステートメントを使用してファイルを開いたり、ロックを取得したりする方法は誰もが知っていますが、次のようなオブジェクトを実装できるでしょうか。独自のコンテキスト表現?はい、「__enter__」と「__exit__」を使用してコンテキスト管理プロトコルを実装できます:
特定のクラスのインスタンスを大量に作成するプログラムを作成したことがある場合は、プログラムで突然大量のメモリが必要になることに気づいたかもしれません。記憶の。これは、Python が辞書を使用してクラス インスタンスの属性を表すため、高速ではありますが、メモリ効率があまり高くないためです。通常、これは深刻な問題ではありません。ただし、プログラムがこれによって深刻な影響を受ける場合は、「__slots__」を試してみるとよいでしょう:
プログラムのメモリや CPU の使用量を最適化したくないが、特定の数値に直接制限したい場合、Python には次の機能もあります。対応するライブラリはこれを行うことができます:
一部の言語には、メンバー (変数、メソッド、インターフェイス) をエクスポートするための非常に明白なメカニズムがあります。たとえば、Golang では大文字で始まるメンバーのみです。がエクスポートされます。ただし、Python では、すべてのメンバーがエクスポートされます (「__all__」を使用しない限り):
实现比较运算符的简单方法
结语
ホームページ バックエンド開発 Python チュートリアル 高度な Python プログラミング、よく使われる 8 つのスキル!

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

Apr 18, 2023 am 09:34 AM
python プログラミング スキル

高度な 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

XMLのコメントコンテンツを変更する方法 XMLのコメントコンテンツを変更する方法 Apr 02, 2025 pm 06:15 PM

小さなXMLファイルの場合、注釈コンテンツをテキストエディターに直接置き換えることができます。大きなファイルの場合、XMLパーサーを使用してそれを変更して、効率と精度を確保することをお勧めします。 XMLコメントを削除するときは注意してください。コメントを維持すると、通常、コードの理解とメンテナンスが役立ちます。高度なヒントは、XMLパーサーを使用してコメントを変更するためのPythonサンプルコードを提供しますが、特定の実装を使用するXMLライブラリに従って調整する必要があります。 XMLファイルを変更する際のエンコード問題に注意してください。 UTF-8エンコードを使用して、エンコード形式を指定することをお勧めします。

携帯電話でXMLをPDFに変換するとき、変換速度は高速ですか? 携帯電話でXMLをPDFに変換するとき、変換速度は高速ですか? Apr 02, 2025 pm 10:09 PM

Mobile XMLからPDFへの速度は、次の要因に依存します。XML構造の複雑さです。モバイルハードウェア構成変換方法(ライブラリ、アルゴリズム)コードの品質最適化方法(効率的なライブラリ、アルゴリズムの最適化、キャッシュデータ、およびマルチスレッドの利用)。全体として、絶対的な答えはなく、特定の状況に従って最適化する必要があります。

XMLの変更にはプログラミングが必要ですか? XMLの変更にはプログラミングが必要ですか? Apr 02, 2025 pm 06:51 PM

XMLコンテンツを変更するには、ターゲットノードの正確な検出が必要であるため、プログラミングが必要です。プログラミング言語には、XMLを処理するための対応するライブラリがあり、APIを提供して、データベースの運用などの安全で効率的で制御可能な操作を実行します。

XMLをPDFに変換できるモバイルアプリはありますか? XMLをPDFに変換できるモバイルアプリはありますか? Apr 02, 2025 pm 08:54 PM

XMLをPDFに直接変換するアプリケーションは、2つの根本的に異なる形式であるため、見つかりません。 XMLはデータの保存に使用され、PDFはドキュメントを表示するために使用されます。変換を完了するには、PythonやReportLabなどのプログラミング言語とライブラリを使用して、XMLデータを解析してPDFドキュメントを生成できます。

Protobufおよび関連文字列定数の列挙タイプを定義する方法は? Protobufおよび関連文字列定数の列挙タイプを定義する方法は? Apr 02, 2025 pm 03:36 PM

Protobufの文字列定数列挙を定義する問題Protobufを使用する場合、列挙タイプを文字列定数に関連付ける必要がある状況に遭遇することがよくあります...

XMLを画像に変換するプロセスは何ですか? XMLを画像に変換するプロセスは何ですか? Apr 02, 2025 pm 08:24 PM

XML画像を変換するには、最初にXMLデータ構造を決定し、次に適切なグラフィカルライブラリ(PythonのMatplotlibなど)とメソッドを選択し、データ構造に基づいて視覚化戦略を選択し、データのボリュームと画像形式を検討し、バッチ処理を実行するか、効率的なライブラリを使用して、最終的にPNG、JPEG、またはSVGに応じて保存します。

XML形式を開く方法 XML形式を開く方法 Apr 02, 2025 pm 09:00 PM

ほとんどのテキストエディターを使用して、XMLファイルを開きます。より直感的なツリーディスプレイが必要な場合は、酸素XMLエディターやXMLSPYなどのXMLエディターを使用できます。プログラムでXMLデータを処理する場合、プログラミング言語(Pythonなど)やXMLライブラリ(XML.ETREE.ELEMENTTREEなど)を使用して解析する必要があります。

携帯電話でXMLを高品質でPDFに変換するにはどうすればよいですか? 携帯電話でXMLを高品質でPDFに変換するにはどうすればよいですか? Apr 02, 2025 pm 09:48 PM

携帯電話の高品質でXMLをPDFに変換する必要があります。クラウドでXMLを解析し、サーバーレスコンピューティングプラットフォームを使用してPDFを生成します。効率的なXMLパーサーとPDF生成ライブラリを選択します。エラーを正しく処理します。携帯電話の重いタスクを避けるために、クラウドコンピューティングの能力を最大限に活用してください。複雑なXML構造の処理、マルチページPDFの生成、画像の追加など、要件に応じて複雑さを調整します。デバッグを支援するログ情報を印刷します。パフォーマンスを最適化し、効率的なパーサーとPDFライブラリを選択し、非同期プログラミングまたは前処理XMLデータを使用する場合があります。優れたコードの品質と保守性を確保します。

See all articles