Python開発時の注意点

高洛峰
リリース: 2017-02-27 16:46:32
オリジナル
1089 人が閲覧しました

注意してください: この記事は、私たちが皆 Python 3 を使用していることを前提としています

1. リストの内包表記

リストがあります: Bag = [1, 2, 3, 4, 5]

ここで、すべての要素を 2 倍にします。次のようになります: [2, 4, 6, 8, 10]

ほとんどの初心者は、これまでの言語経験に基づいて、おそらく次のようにするでしょう

bag = [1, 2, 3, 4, 5] 
for i in range(len(bag)): 
 bag[i] = bag[i] * 2
ログイン後にコピー

しかし、もっと良い方法があります:

bag = [elem * 2 for elem in bag]
ログイン後にコピー

とてもシンプルですよね?これは Python リスト内包表記と呼ばれます。

2. リストを調べます

上記のリストを続けます。

可能であれば、これは避けてください:

bag = [1, 2, 3, 4, 5] 
for i in range(len(bag)): 
 print(bag[i])
ログイン後にコピー

代わりに、次のようにする必要があります:

bag = [1, 2, 3, 4, 5] 
for i in bag: 
 print(i)
ログイン後にコピー

x がリストの場合、その要素を反復処理できます。ほとんどの場合、各要素のインデックスは必要ありませんが、必要な場合は enumerate 関数を使用します。次のようになります:

bag = [1, 2, 3, 4, 5] 
for index, element in enumerate(bag): 
 print(index, element)
ログイン後にコピー

非常に直感的で明確です。

3. 要素の交換

Java または C から Python に切り替える場合は、次のことに慣れているかもしれません:

a = 5 
b = 10

# 交换 a 和 b
tmp = a 
a = b 
b = tmp
ログイン後にコピー

しかし、Python はより自然で優れた方法を提供します。

a = 5 
b = 10 
# 交换a 和 b
a, b = b, a
ログイン後にコピー

十分綺麗ですよね?

4. 初期化リスト

10 個の整数 0 のリストが必要な場合は、まず次のことを考えるかもしれません:

bag = [] 
for _ in range(10): 
 bag.append(0)
ログイン後にコピー

それを変更しましょう:

bag = [0] * 10
ログイン後にコピー

見て、なんてエレガントでしょう。

注: リストにリストが含まれている場合、これを実行すると浅いコピーが生成されます。

例:

bag_of_bags = [[0]] * 5 # [[0], [0], [0], [0], [0]] 
bag_of_bags[0][0] = 1 # [[1], [1], [1], [1], [1]]
ログイン後にコピー

おっと!すべてのリストが変更されますが、最初のリストのみを変更したいと考えています。

変更してください:

bag_of_bags = [[0] for _ in range(5)] 
# [[0], [0], [0], [0], [0]]

bag_of_bags[0][0] = 1 
# [[1], [0], [0], [0], [0]]
ログイン後にコピー

また覚えておいてください:

「時期尚早の最適化は諸悪の根源である」
リストを初期化する必要があるかどうか、自問してください。

5. 文字列の構築

多くの場合、文字列を出力する必要があります。変数がたくさんある場合は、これを避けてください:

name = "Raymond" 
age = 22 
born_in = "Oakland, CA" 
string = "Hello my name is " + name + "and I'm " + str(age) + " years old. I was born in " + born_in + "." 
print(string)
ログイン後にコピー

うーん、これはどれほど乱雑に見えますか?代わりに、優れた簡潔なメソッド .format を使用できます。

これを実行してください:

name = "Raymond" 
age = 22 
born_in = "Oakland, CA" 
string = "Hello my name is {0} and I'm {1} years old. I was born in {2}.".format(name, age, born_in) 
print(string)
ログイン後にコピー

ずっと良くなりました!

6. タプルを返す

Python では関数内で複数の要素を返すことができるため、作業が簡単になります。ただし、タプルを解凍するときに次のようなよくある間違いがあります:

def binary(): 
 return 0, 1

result = binary() 
zero = result[0] 
one = result[1]
ログイン後にコピー

これは必要ありません。次のように変更できます:

def binary(): 
 return 0, 1

zero, one = binary()
ログイン後にコピー

すべての要素を返す必要がある場合は、アンダースコア_を使用してください。

zero, _ = binary()
ログイン後にコピー

はとても効率的です!

7. 辞書 (辞書) にアクセスする

キーとペア (キー、値) を辞書に書き込むこともよくあります。

dict に存在しないキーにアクセスしようとすると、KeyError エラーを回避するために次のようにする誘惑に駆られるかもしれません:

countr = {} 
bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
for i in bag: 
 if i in countr:
  countr[i] += 1
 else:
  countr[i] = 1

for i in range(10): 
 if i in countr:
  print("Count of {}: {}".format(i, countr[i]))
 else:
  print("Count of {}: {}".format(i, 0))
ログイン後にコピー

ただし、get() を使用する方が良い方法です。

countr = {} 
bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
for i in bag: 
 countr[i] = countr.get(i, 0) + 1

for i in range(10): 
 print("Count of {}: {}".format(i, countr.get(i, 0)))
ログイン後にコピー

もちろん、代わりに setdefault を使用することもできます。

これは、より単純ですがより高価な方法も使用します:

bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
countr = dict([(num, bag.count(num)) for num in bag])

for i in range(10): 
 print("Count of {}: {}".format(i, countr.get(i, 0)))
ログイン後にコピー

dict 導出を使用することもできます。

countr = {num: bag.count(num) for num in bag}
ログイン後にコピー

これら 2 つのメソッドは、count が呼び出されるたびにリストを走査するため、負荷が高くなります。

8 ライブラリの使用

既存のライブラリをインポートするだけで、本当にやりたいことが実行できます。

引き続き前の例について話しますが、リスト内に数値が出現する回数をカウントする関数を構築します。まあ、そのようなことができるライブラリはすでにあります。

from collections import Counter 
bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
countr = Counter(bag)

for i in range(10): 
 print("Count of {}: {}".format(i, countr[i]))
ログイン後にコピー

ライブラリを使用する理由:

1. コードは正しく、テストされています。

2. アルゴリズムが最適化されているため、より高速に実行できる可能性があります。

3. 抽象化: それらは明確に指摘され文書化されているため、まだ実装されていないものに焦点を当てることができます。

4. 結局のところ、すべてはすでにそこにあるので、車輪を再発明する必要はありません。

9. リストのスライス/ステップ

この list[start:stop:step] のように、開始点と終了点を指定できます。

リストの最初の 5 つの要素を取り出します:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for elem in bag[:5]: 
 print(elem)
ログイン後にコピー

これはスライスであり、停止点を 5 に指定し、停止する前にリストから 5 つの要素が取り出されます。

最後の 5 つの要素をどうするか?

りー

分からないの? -5 は、リストの末尾から 5 つの要素を取得することを意味します。

リスト内の要素の間隔を空けたい場合は、次のようにすることもできます:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for elem in bag[-5:]: 
 print(elem)
ログイン後にコピー

ただし、次のようにする必要があります:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for index, elem in enumerate(bag): 
 if index % 2 == 0:
  print(elem)
ログイン後にコピー

これはリストのステップです。 list[::2] は、リストを走査し、2 つのステップで要素を取り出すことを意味します。

list[::-1] を使用すると、リストをクールに反転できます。

10. Tab キーまたはスペース キー

長期的には、タブとスペースを混在させると問題が発生し、IndentationError: 予期しないインデントが表示されます。 Tab キーを選択するかスペース バーを選択するかに関係なく、ファイルとプロジェクト全体でそれを使用し続ける必要があります。

タブの代わりにスペースを使用する理由の 1 つは、タブがすべてのエディターで同じではないことです。使用するエディタによっては、タブが 2 ~ 8 個のスペースとして扱われる場合があります。

コードを記述するときにスペースを使用してタブを定義することもできます。このようにして、タブとして使用するスペースの数を選択できます。ほとんどの Python ユーザーは 4 つのスペースを使用します。

概要

上記は、Python 開発で注意すべきヒントです。ご質問があれば、メッセージを残してください。

Python 開発で注目すべき関連記事をさらに詳しく知りたい場合は、PHP 中国語 Web サイトに注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート