Pythonicコードの書き方

言語が単純なため、Pythonを使用すると、人間の考え方でコードを記述できます。初心者は習得しやすく、ベテランはそれをさらに気に入っています。

Pythonic(エレガント、本格的、整頓された)コードを書くには、大きな牛のコードも観察する必要があります。ここで、Ming Geは、優れたコードを書く習慣を身に付けるのに役立つ一般的なPythonicの書き方をいくつか集めました。

01. 変数交換

2つの変数の値を交換する場合、通常は中間の一時変数を使用して遷移します。

tmp = a
a = b
b = tmp

1行のコードで解決でき(読みやすさに影響しません)、3行のコードは必要ありません。

a,b = b,a

02. リストの理解

以下は非常に単純なforループです。

my_list =[]for i inrange(10):
 my_list.append(i*2)

forループでは、ロジックが比較的単純な場合は、リストのリスト内包表記を試してみることをお勧めします。コードは1行しかありませんが、ロジックは明確です。

my_list =[i*2for i inrange(10)]

03. 単一行式

上記の2つのケースでは、複数行のコードが別の方法で1行のコードに書き込まれました。

これは、コード行が少ないほどPythonicが多いという意味ではありません。

たとえば、このように書くことはお勧めしません。

print('hello');print('world')if x ==1:print('hello,world')if<complex comparison> and <other complex comparison>:
 # do something

提案は、次の文言に従うことです

print('hello')
print('world')

if x ==1:print('hello,world')

cond1 =<complex comparison>
cond2 =<other complex comparison>if cond1 and cond2:
 # do something

04. インデックス付きトラバーサル

forループを使用する場合、対応するインデックスを取得する方法、初心者はrange + len関数の使用に慣れています

for i inrange(len(my_list)):print(i,"-->", my_list[i])

より良いアプローチは、組み込み関数enumerateを使用することです

for i,item inenumerate(my_list):print(i,"-->",item)

05. シーケンスアンパック

*を使用してリストを解凍します

a,*rest =[1,2,3]
# a =1, rest =[2,3]

a,*middle, c =[1,2,3,4]
# a =1, middle =[2,3], c =4

06. ストリングスプライシング

リスト(または反復可能なオブジェクト)内のすべての要素が文字列オブジェクトであり、それらを接続する場合、通常のアプローチは次のとおりです。

letters =['s','p','a','m']
s=""forletin letters:
 s +=let

より推奨されるアプローチは、結合機能を使用することです。

letters =['s','p','a','m']
word =''.join(letters)

07. 正誤判断

変数が真(偽)であるかどうかを判断するために、初心者は直接 ==を使用して、真、偽、なしと比較します。

if attr == True:print('True!')if attr == None:print('attr is None!')

実際、 &quot; &quot;[]{}などの要素がないコンテナはすべて偽の値です。「xxでない場合」を直接使用して判断できます。

if attr:print('attr is truthy!')if not attr:print('attr is falsey!')

08. 辞書要素にアクセス

[]を直接使用して辞書の要素にアクセスする場合、キーが存在しないと例外がスローされるため、新しいクラブは最初にこのキーがあるかどうかを判断してから、それを取得します。

d ={'hello':'world'}if d.has_key('hello'):print(d['hello'])    # prints 'world'else:print('default_value')

より推奨される方法は、 getを使用して取得することです。そのようなキーがない場合、デフォルトでNoneが返されます(もちろん、デフォルトの戻り値を設定することもできます)。

d ={'hello':'world'}print(d.get('hello','default_value')) # prints 'world'print(d.get('thingy','default_value')) # prints 'default_value'

09. 操作リスト

次のコードは、条件に従ってリスト内の要素をフィルタリングします

a =[3,4,5]
b =[]for i in a:if i >4:
  b.append(i)

実際、リスト内包表記または高次関数フィルターを使用して、

a =[3,4,5]
b =[i for i in a if i >4]
# Or:
b =filter(lambda x: x >4, a)

フィルタに加えて、mapとreduceの2つの機能も非常に便利です

a =[3,4,5]
b =map(lambda i: i +3, a)
# b:[6,7,8]

10. ファイルの読み取り

ファイルの読み取りは非常に一般的な操作です。ハンドルを使用した後、手動でclose関数を呼び出してハンドルを閉じる必要があります。

fp =open('file.txt')print(fp.read())
fp.close()

コードが長すぎると、ハンドルを手動で閉じる必要があることがわかっていても、見逃してしまうことがよくあります。したがって、ファイルの読み取りと書き込みに「with open」を使用する習慣を身に付けることをお勧めします。コンテキストマネージャは、ハンドルを閉じる操作を自動的に実行します。

withopen('file.txt')as fp:for line in fp.readlines():print(line)

11. コードの継続

長い文字列を1行に入れると、コードの読みやすさに大きく影響します(以下のコードは左にスライドできます)

long_string ='For a long time I used to go to bed early. Sometimes, when I had put out my candle, my eyes would close so quickly that I had not even time to say “I’m going to sleep.”'

コードの読みやすさに注意を払う人は、書き続けるために3つの引用符 \を使用します

long_string ='For a long time I used to go to bed early. ' \
    ' Sometimes, when I had put out my candle, ' \
    ' my eyes would close so quickly that I had not even time to say “I’m going to sleep.”'

しかし、私にとっては、括弧を使用して ()をラップすることを好みます

long_string =("For a long time I used to go to bed early. Sometimes, ""when I had put out my candle, my eyes would close so quickly ""that I had not even time to say “I’m going to sleep.”")

パッケージをガイドするときも同じことが言えます

from some.deep.module.inside.a.module import(
 a_nice_function, another_nice_function, yet_another_nice_function)

12. 明示的なコード

必要に応じて、特別な魔法を使用して、コードをより不確実なシーンに適合させることがあります。

def make_complex(*args):
 x, y = args
 returndict(**locals())

ただし、必要がなければ、そうしないでください。コードの不確実性を不当に増やすと、元の動的言語がより動的なコードを記述します。

def make_complex(x, y):return{'x': x,'y': y}

13. プレースホルダーを使用する

不要であるが受け取る必要のある変数については、プレースホルダーを使用してください

filename ='foobar.txt'
basename, _, ext = filename.rpartition('.')

14. 連鎖比較

次の執筆のために

score =85if score >80 and score <90:print("良い")

実際に書くためのより良い方法があります

score =85if80< score <90:print("良い")

上記のチェーン比較操作を理解している場合は、次のコード行の出力がFalseである理由を理解する必要があります。

>>> False == False == True 
False

15. 三眼手術

簡単な判断と割り当てのために

age =20if age >18:
 type ="adult"else:
 type ="teenager"

実際、三眼計算を使用して1行で実行できます。

age =20  
b ="adult"if age >18else"teenager"

Recommended Posts

Pythonicコードの書き方
pythonコードにコメントする方法
pythonウェブページコードの表示方法
python設定ファイルの書き方
pythonコードでラップする方法
pythonでクラスを書く方法
pythonでreturnを書く方法
pythonでwinプログラムを書く方法
pythonでtryステートメントを書く方法
Ubuntu20.04にVisualStudioコードをインストールする方法
CentOS8にVisualStudioコードをインストールする方法
centos7ソースコードからopensshをインストールする方法
pythonでアシスタントを実行するコードを使用する方法
pythonでコード自動プロンプトを設定する方法
pythonでゲームを書く方法を教えてください
告白プログラムをpythonで書く方法
Pythonコードをまとめて正しく移動する方法
Pythonでファイルを読み書きする方法
Ubuntu20.04にVisualStudioコードをインストールする方法
Ubuntu20.04にアップグレードする方法
Ubuntu20.04にアップグレードする方法
バグを見つけるためのPythonコード(2)
バグを見つけるためのPythonコード(7)
バグを見つけるためのPythonコード(4)
バグを見つけるためのPythonコード(3)
バグを見つけるためのPythonコード(9)
pythonをすばやく学ぶ方法
pythonプラグインをアンインストールする方法
バグを見つけるためのPythonコード(6)
バグを見つけるためのPythonコード(1)
バグを見つけるためのPythonコード(8)
pythonオブジェクトを理解する方法
バグを見つけるためのPythonコード(5)
パイソンタプルの使い方
Ubuntu 16.04LTSにアップグレードする方法
UbuntuにHelmをインストールする方法
centOS7にjdk1.8をインストールする方法
CentOS8にMySQLをインストールする方法
Ubuntu20.04にRubyをインストールする方法
Ubuntu20.04にMemcachedをインストールする方法
https証明書のインストール方法(ubuntu + apache2)
CentOS7をCentOS8にアップグレードする方法(詳細な手順)
Pythonのフィルター機能の使い方
pythonのヘルプ機能の使い方
Ubuntu20.04にJavaをインストールする方法
Ubuntu20.04にMySQLをインストールする方法
ubuntuでhanlpを使用する方法
CentOS8にMemcachedをインストールする方法
CentOS8にRをインストールする方法
Ubuntu20.04にElasticsearchをインストールする方法
CentOS8にFFmpegをインストールする方法
CentOS8にVirtualboxをインストールする方法
UbuntuにProtobuf3をインストールするための詳細なチュートリアル
Ubuntu20.04にNginxをインストールする方法
CentOS8にTensorFlowをインストールする方法
C ++を使用してPython3拡張機能を作成する
Ubuntu16.04にNode.jsをインストールする方法
Centos7でgcc4.9.xに更新する方法
Ubuntu20.04にMySQLをインストールする方法
CentOS8にTeamViewerをインストールする方法
CentOSにPerl5をインストールする方法