paint-brush
より良い Python コードを書くための 11 のヒントとコツ@pragativerma
2,267 測定値
2,267 測定値

より良い Python コードを書くための 11 のヒントとコツ

Pragati Verma8m2022/08/16
Read on Terminal Reader
Read this story w/o Javascript

長すぎる; 読むには

Python は通常、反復可能なオブジェクトを反復処理するために「for」ループを使用します。しかし、「for」ループの代わりに「enumerate()」を使用することにより、これを行うためのより簡単で Python らしい方法があります。生の for ループの代わりにリスト内包表記を使用すると、既存のリストに基づいてリストを作成できます。ソートされたリストまたはシーケンス (タプル、セット、固定セット) またはコレクション (固定セット) の要素をソートするために使用できます。

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - より良い Python コードを書くための 11 のヒントとコツ
Pragati Verma HackerNoon profile picture


より良い Python コードを書き、より良いプログラマーになるための 11 のヒントとコツを以下に示します。


1. 代わりに enumerate またはrange(len(x))で反復する

Python では、一般的にforループを使用して反復可能なオブジェクトを反復処理します。 Python のforループは、コレクション ベースの反復を使用します。つまり、Python は、反復ごとに、反復可能オブジェクトの次の項目をループ変数に割り当てます。 forループの通常のユースケースは次のとおりです。


 values = ["a", "b", "c"] for value in values: print(value) # a # b # c


ここで、値に加えてインデックスも出力したい場合は、次のように実行できます。


 index = 0 for value in values: print(index, value) index += 1 # 0 a # 1 b # 2 c


またはこれを行う別の一般的な方法は、 range(len(x))を使用することです:


 for index in range(len(values)): value = values[index] print(index, value) # 0 a # 1 b # 2 c


ただし、 enumerate()を使用して反復可能なオブジェクトを反復処理する、より簡単で Pythonic な方法があります。通常の方法とほぼ同じようforループで使用されますが、反復可能なオブジェクトをforループの直後in配置するか、 range(len(values))として使用する代わりに、内部に配置します以下に示すように、 enumerate()の括弧:


 for count, value in enumerate(values): print(count, value) # 0 a # 1 b # 2 c


以下に示すように、 enumerate()start引数を定義することもできます。


 for count, value in enumerate(values, start=1): print(count, value) # 1 a # 2 b # 3 c


enumerate()関数は 2 つの変数を返します。

  • 現在の反復回数
  • 現在の反復におけるアイテムの値


forループのループ変数と同様に、ループ変数には任意の名前を付けることができます。たとえば、 indexvalueを呼び出すことができ、それらは引き続き機能します。 enumerate()は、 forループよりも効率的です。ループ内の値にアクセスして正しく使用することを忘れずに、ループ変数の値を進めることを忘れないでください。すべて Python によって自動的に処理されます。 .


2. 生の for ループの代わりにリスト内包表記を使用する

リスト内包表記は、既存のリストに基づいて作成リストを定義する、より簡単で洗練された方法です。これらは、反復ごとに繰り返し実行される式を含む括弧で構成される 1 行のコードです。したがって、ループよりも時間とスペースの効率が高く、反復ステートメントを 1 行のコードで変換できます。


リスト内包表記の通常の構文は次のようになります。


 newList = [ expression(element) for element in oldList if condition ]


コードでのリスト内包表記の例を次に示します。


 # Using list comprehension to iterate through loop List = [character for character in 'HackerNoon'] # Displaying list print(List) # Output # ['H', 'a', 'c', 'k', 'e', 'r', 'N', 'o', 'o', 'n']


3. sorted()で複雑な iterable をソートする

Python のsorted()関数は、反復可能なオブジェクトの要素を特定の順序 (昇順または降順) で並べ替え、並べ替えられたリストとして返します。シーケンス (文字列、タプル、リスト) またはコレクション (セット、ディクショナリ、固定セット)、またはその他の反復子を並べ替えるために使用できます。


sorted()関数の構文は次のとおりです。


 sorted(iterable, key=None, reverse=False)


sorted()関数は最大 3 つのパラメータを取ります:

  • iterable: 任意のイテレータである可能性があります
  • key: ソート比較のキーとなるオプションの引数です。
  • reverse: 逆順のソート済みリストを出力として指定するために使用されるオプションの引数でもあります


4. セットで一意の値を保存する

Python Set は、重複する値の単一のコピーをそれに格納します。したがって、リスト内の一意の値をチェックするために使用できます。例えば:


 list_inp = [100, 75, 100, 20, 75, 12, 75, 25] set_res = set(list_inp) print("The unique elements of the input list using set():\n") list_res = (list(set_res)) for item in list_res: print(item)


したがって、上記のプログラムの出力は次のようになります。


 The unique elements of the input list using set(): 25 75 100 20 12


5.ジェネレーターでメモリを節約する

ジェネレーターの基本的な機能は、必要に応じて要素を評価することです。これは、角括弧の代わりに括弧を使用するリスト内包表記の構文と非常によく似ています。


リスト内のすべての偶数の二乗を出力したい例を考えてみましょう:


 myList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print("The given list is:", myList) mygen = (element ** 2 for element in myList if element % 2 == 0) print("Elements obtained from the generator are:") for ele in mygen: print(ele)


上記のコードの出力は次のようになります。


 The given list is: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Elements obtained from the generator are: 4 16 36 64 100


それらの構文はリスト内包表記と非常によく似ていると言いましたが、それがリスト内包表記や集合内包表記とどのように違うのか疑問に思っているに違いありません。リスト内包表記や集合内包表記とは異なり、ジェネレーター内包表記はオブジェクトを初期化しません。その結果、リストまたはセット内包表記の代わりにジェネレーター内包表記を使用して、プログラムのメモリ要件を下げることができます。


6. .get()および.setdefault() ) を使用して辞書でデフォルト値を定義する


.setdefault()メソッドを使用すると、キーがまだ dict にない場合にdict[key]=defaultを設定できます。


.setdefault()の構文は次のようになります。


 dict.setdefault(key, default=None)


.setdefault()の使用方法を理解するためのコード スニペットの例を次に示します。


 a_dictionary = {"a": 1, "b": 2, "d": 4} a_dictionary.setdefault("c", 3) print(a_dictionary)


上記のコードの出力は次のようになります。


 {'a': 1, 'b': 2, 'd': 4, 'c': 3}


以下に示すように、キーのデフォルト値を渡すことで.get()メソッドを使用しても、同じことが実現できます。


 a_dictionary = {"a": 1, "b": 2, "d": 4} print(a_dictionary.get("c", 3)) print(a_dictionary)


上記のコードの出力は次のようになります。


 3 {'a': 1, 'b': 2, 'd': 4}


7. collections.Counterでハッシュ可能なオブジェクトをカウントする

Collections モジュールは、(組み込み型の list、dict、および tuple に加えて) 高パフォーマンスのコンテナー データ型をサポートし、メモリに情報を格納するためのさまざまな有用なデータ構造を含んでいます。


カウンターは、等しい値が追加された回数を追跡するコンテナーです。

他の言語がバッグまたはマルチセットのデータ構造を使用して実装するのと同じアルゴリズムを実装するために使用できます。


コレクションをインポートすると、コレクション内のものを次のように利用できるようになります。

 import collections


カウンターのみを使用するため、次のように簡単に実行できます。


 from collections import Counter


次のように使用できます。


 import collections c = collections.Counter('abcdaab') for letter in 'abcde': print '%s : %d' % (letter, c[letter])


上記のコードの出力は次のようになります。


 a : 3 b : 2 c : 1 d : 1 e : 0


8. f-String で文字列をフォーマットする (Python 3.6+)

「フォーマットされた文字列リテラル」とも呼ばれる f-string は、Python 3.6 以降でサポートされている、文字列をフォーマットするための新しい、より Pythonic な方法です。これらは、Python で文字列をフォーマットする方法として、より高速で、読みやすく、簡潔で、エラーが発生しにくい方法です。


「f-string」という名前が示すように、これらは先頭に f があり、実行時に値に置き換えられてから__format__プロトコルを使用してフォーマットされる式を含む中括弧を持つ文字列リテラルです。


f-strings は次のように使用できます。


 name = "Eric" age = 74 print(f"Hello, {name}. You are {age}.") # 'Hello, Eric. You are 74.'


9. .join()で文字列を連結する

Python では、 .join()メソッドを使用して、文字列のリストを単一の文字列に連結できます。このメソッドの通常の構文は次のようになります。


 'String to insert'.join([List of strings])


複数の方法で使用できます。空の文字列““を使用すると [文字列のリスト] が単純に連結され、カンマを使用するとカンマ区切りの文字列が作成されます。改行文字\nを使用すると、各文字列の後に改行が追加されます。以下の例を参照してください。


 l = ['aaa', 'bbb', 'ccc'] s = ''.join(l) print(s) # aaabbbccc s = ','.join(l) print(s) # aaa,bbb,ccc s = '-'.join(l) print(s) # aaa-bbb-ccc s = '\n'.join(l) print(s) # aaa # bbb # ccc


10. {**d1, **d2}辞書をマージ (Python 3.5+)

辞書をマージする最も簡単な方法は、展開演算子 ( ** ) を使用することです。このメソッドの構文は次のようになります。


 {**dict1, **dict2, **dict3}


この方法をよりよく理解するための例を次に示します。


 d1 = {'k1': 1, 'k2': 2} d2 = {'k3': 3, 'k4': 4} print({**d1, **d2}) # {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}


11. if x in list使用して if ステートメントを単純化する

赤、緑、青の原色のリストがあるとします。コードのどこかに、色を持つ新しい変数があるので、c = 赤です。次に、これが原色の 1 つであるかどうかを確認します。もちろん、次のように、リストの各項目に対してこれを確認できます。


 colors = ["red", "green", "blue"] c = "red" # cumbersome and error-prone if c == "red" or c == "green" or c == "blue": print("is main color")


ただし、これにはかなりの時間がかかる可能性があり、ここで赤のタイプミスがある場合など、間違いを犯しやすくなります。 if x in list という式を使用する方が簡単で、はるかに好ましいです。


 colors = ["red", "green", "blue"] c = "red" # better: if c in colors: print("is main color")


結論

Python は広く使用されているプログラミング言語であり、上記のヒントとコツを使用することで、より優れた Python プログラマーになることができます。


この記事がお役に立てば幸いです。読み続けます!