ホームページ >バックエンド開発 >Python チュートリアル >Python コードをより Python らしくするにはどうすればよいでしょうか?
Pythonic を中国語に翻訳すると、非常にPython的です。中国では、「とても女の子らしい」、「とても代表的なサッカーチーム」、「とてもCCTV」など、「とても+」という名詞構造が多く使われています。 ·
以下では簡単にするために、Python 的な記述方法を表すために P を使用し、非 Python 的な記述方法を表すために NP を使用します。 もちろん、この P-NP はその P-NP ではありません。
なぜ Python を追求するのですか?
NP と比較して、P の記述方法は簡潔、明確、エレガントです。ほとんどの場合、実行効率が高く、コードが少ないほどエラーが発生しにくくなります。優れたプログラマーはコードを書くときにコードの正確さ、簡潔さ、読みやすさを追求するべきだと思います。これはまさに Python の精神です。
他のプログラミング言語の経験があり、Python を初めて使用するプログラマー (私のような) にとって、Python の記述方法を認識すると、Python コードを記述する際の利便性と効率が向上します。また、この記事の主な読者もまた、このプログラマーのグループになります。
読者の参考のために、P と NP の N 例を以下に示します。
PとNPの例
連鎖比較
P:
a = 3 b = 1 1 <= b <= a < 10 #True
NP:
a = 3 b = 1 b >= 1 and b <= a and a < 10 #True
Pは小学生でも理解できるシンプルでわかりやすい文法州コード~
Truth Test
P:
name = 'Tim' langs = ['AS3', 'Lua', 'C'] info = {'name': 'Tim', 'sex': 'Male', 'age':23 } if name and langs and info: print('All True!') #All True!
NP:
if name != '' and len(langs) > 0 and info != {}: print('All True!') #All True!
つまり、Pの書き方は、判定条件を書かずに、あらゆる対象の真偽を直接判定するというものです。これにより、正確性が保証されるだけでなく、コードの量も削減されます。
真偽値テーブル (false を覚えておくと多くのコードを節約できます!)
真偽
真偽
空でない任意の文字列空の文字列''
0 以外の任意の数値数値1
P の書き方はシンプルで、テスト後の方が効率的です。
回文の検出に使用すると、input == input[::-1] という文になりますが、なんとも優雅ですね。
def reverse_str( s ): return s[::-1]NP:
def reverse_str( s ): t = '' for x in xrange(len(s)-1,-1,-1): t += s[x] return tstring.join()は、NP、Pと比較して、リスト内の文字列を結合するためによく使用されます。この方法は非常に効率的でエラーがありません。
strList = ["Python", "is", "good"] res = ' '.join(strList) #Python is good
NP:
res = '' for s in strList: res += s + ' ' #Python is good #最后还有个多余空格
リスト内包表記
P:
numList = [1,2,3,4,5] sum = sum(numList) #sum = 15 maxNum = max(numList) #maxNum = 5 minNum = min(numList) #minNum = 1 from operator import mul prod = reduce(mul, numList, 1) #prod = 120 默认值传1以防空列表报错
sum = 0 maxNum = -float('inf') minNum = float('inf') prod = 1 for num in numList: if num > maxNum: maxNum = num if num < minNum: minNum = num sum += num prod *= num # sum = 15 maxNum = 5 minNum = 1 prod = 120ご存知のとおり、P のリスト内包表記を使用すると、新しいリストの作成が非常に簡単かつ直感的になります。
l = [x*x for x in range(10) if x % 3 == 0] #l = [0, 9, 36, 81]NP:
l = [] for x in range(10): if x % 3 == 0: l.append(x*x) #l = [0, 9, 36, 81]dictのget(key,default)メソッドは、keyの値を取得するために使用されます。辞書(存在しない場合) このキーの場合、キーにはデフォルト値defaultが割り当てられます。
NP に比べて、P は if...else... の記述が少なく、if...else... が嫌いな人にとっては本当に最初の選択肢です。
dic = {'name':'Tim', 'age':23} dic['workage'] = dic.get('workage',0) + 1 #dic = {'age': 23, 'workage': 1, 'name': 'Tim'}NP:
if 'workage' in dic: dic['workage'] += 1 else: dic['workage'] = 1 #dic = {'age': 23, 'workage': 1, 'name': 'Tim'}for...else... の else 部分は、処理に使用されます。 for ループ条件から中断されない項目。これを使用すると、for ループが発生するかどうかを確認するために状態変数を設定する必要がなく、シンプルで便利です。
for x in xrange(1,5): if x == 5: print 'find 5' break else: print 'can not find 5!' #can not find 5!NP:
find = False for x in xrange(1,5): if x == 5: find = True print 'find 5' break if not find: print 'can not find 5!' #can not find 5!C でのプログラミング経験がある場合は、 A ? B : C の代替案を探すでしょう。 A と B または C は問題ないように見えますが、b = a > 1 で、実際の意図は False を返す必要があるにもかかわらず、False または True は True を返します。
b = False if a > 1 else True を使用すると正しく False が返されるため、本物の 3 項記号の置換になります。 Enumerate インデックス添字の開始位置を調整します。デフォルトは 0 です。
a = 3 b = 2 if a > 2 else 1 #b = 2NP:
if a > 2: b = 2 else: b = 1 #b = 2zip メソッドはタプルを返し、それを使用してキーと値のペアを作成します。シンプルかつ明確です。