言語が単純なため、Pythonを使用すると、人間の考え方でコードを記述できます。初心者は習得しやすく、ベテランはそれをさらに気に入っています。
Pythonic(エレガント、本格的、整頓された)コードを書くには、大きな牛のコードも観察する必要があります。ここで、Ming Geは、優れたコードを書く習慣を身に付けるのに役立つ一般的なPythonicの書き方をいくつか集めました。
2つの変数の値を交換する場合、通常は中間の一時変数を使用して遷移します。
tmp = a
a = b
b = tmp
1行のコードで解決でき(読みやすさに影響しません)、3行のコードは必要ありません。
a,b = b,a
以下は非常に単純なforループです。
my_list =[]for i inrange(10):
my_list.append(i*2)
forループでは、ロジックが比較的単純な場合は、リストのリスト内包表記を試してみることをお勧めします。コードは1行しかありませんが、ロジックは明確です。
my_list =[i*2for i inrange(10)]
上記の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
forループを使用する場合、対応するインデックスを取得する方法、初心者はrange + len関数の使用に慣れています
for i inrange(len(my_list)):print(i,"-->", my_list[i])
より良いアプローチは、組み込み関数enumerateを使用することです
for i,item inenumerate(my_list):print(i,"-->",item)
*
を使用してリストを解凍します
a,*rest =[1,2,3]
# a =1, rest =[2,3]
a,*middle, c =[1,2,3,4]
# a =1, middle =[2,3], c =4
リスト(または反復可能なオブジェクト)内のすべての要素が文字列オブジェクトであり、それらを接続する場合、通常のアプローチは次のとおりです。
letters =['s','p','a','m']
s=""forletin letters:
s +=let
より推奨されるアプローチは、結合機能を使用することです。
letters =['s','p','a','m']
word =''.join(letters)
変数が真(偽)であるかどうかを判断するために、初心者は直接 ==
を使用して、真、偽、なしと比較します。
if attr == True:print('True!')if attr == None:print('attr is None!')
実際、 " "
、 []
、 {}
などの要素がないコンテナはすべて偽の値です。「xxでない場合」を直接使用して判断できます。
if attr:print('attr is truthy!')if not attr:print('attr is falsey!')
[]
を直接使用して辞書の要素にアクセスする場合、キーが存在しないと例外がスローされるため、新しいクラブは最初にこのキーがあるかどうかを判断してから、それを取得します。
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'
次のコードは、条件に従ってリスト内の要素をフィルタリングします
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]
ファイルの読み取りは非常に一般的な操作です。ハンドルを使用した後、手動でclose関数を呼び出してハンドルを閉じる必要があります。
fp =open('file.txt')print(fp.read())
fp.close()
コードが長すぎると、ハンドルを手動で閉じる必要があることがわかっていても、見逃してしまうことがよくあります。したがって、ファイルの読み取りと書き込みに「with open」を使用する習慣を身に付けることをお勧めします。コンテキストマネージャは、ハンドルを閉じる操作を自動的に実行します。
withopen('file.txt')as fp:for line in fp.readlines():print(line)
長い文字列を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)
必要に応じて、特別な魔法を使用して、コードをより不確実なシーンに適合させることがあります。
def make_complex(*args):
x, y = args
returndict(**locals())
ただし、必要がなければ、そうしないでください。コードの不確実性を不当に増やすと、元の動的言語がより動的なコードを記述します。
def make_complex(x, y):return{'x': x,'y': y}
不要であるが受け取る必要のある変数については、プレースホルダーを使用してください
filename ='foobar.txt'
basename, _, ext = filename.rpartition('.')
次の執筆のために
score =85if score >80 and score <90:print("良い")
実際に書くためのより良い方法があります
score =85if80< score <90:print("良い")
上記のチェーン比較操作を理解している場合は、次のコード行の出力がFalseである理由を理解する必要があります。
>>> False == False == True
False
簡単な判断と割り当てのために
age =20if age >18:
type ="adult"else:
type ="teenager"
実際、三眼計算を使用して1行で実行できます。
age =20
b ="adult"if age >18else"teenager"
Recommended Posts