ホームページ > バックエンド開発 > Python チュートリアル > Python コードをより Python らしくするにはどうすればよいでしょうか?

Python コードをより Python らしくするにはどうすればよいでしょうか?

高洛峰
リリース: 2016-10-17 17:22:33
オリジナル
1632 人が閲覧しました

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 = &#39;Tim&#39;
langs = [&#39;AS3&#39;, &#39;Lua&#39;, &#39;C&#39;]
info = {&#39;name&#39;: &#39;Tim&#39;, &#39;sex&#39;: &#39;Male&#39;, &#39;age&#39;:23 }    
  
if name and langs and info:
    print(&#39;All True!&#39;)  #All True!
ログイン後にコピー

NP:

if name != &#39;&#39; and len(langs) > 0 and info != {}:
    print(&#39;All True!&#39;) #All True!
ログイン後にコピー

つまり、Pの書き方は、判定条件を書かずに、あらゆる対象の真偽を直接判定するというものです。これにより、正確性が保証されるだけでなく、コードの量も削減されます。


真偽値テーブル (false を覚えておくと多くのコードを節約できます!)

真偽

真偽

空でない任意の文字列空の文字列''

0 以外の任意の数値数値1

P の書き方はシンプルで、テスト後の方が効率的です。


回文の検出に使用すると、input == input[::-1] という文になりますが、なんとも優雅ですね。

文字列リストの接続

P:

def reverse_str( s ):
    return s[::-1]
ログイン後にコピー

NP:

def reverse_str( s ):
    t = &#39;&#39;
    for x in xrange(len(s)-1,-1,-1):
        t += s[x]
    return t
ログイン後にコピー

string.join()は、NP、Pと比較して、リスト内の文字列を結合するためによく使用されます。この方法は非常に効率的でエラーがありません。


リストの合計、最大値、最小値、積

P:

strList = ["Python", "is", "good"]  
  
res =  &#39; &#39;.join(strList) #Python is good
ログイン後にコピー

NP:

res = &#39;&#39;
for s in strList:
    res += s + &#39; &#39;
#Python is good
#最后还有个多余空格
ログイン後にコピー


リストの長さが10000000 、私のマシンのリストを合計すると、P は 0.6 秒、NP は 1.3 秒かかり、その差はほぼ 2 倍です。したがって、自分自身の車輪を再発明しないでください。

リスト内包表記

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以防空列表报错
ログイン後にコピー


NP:

sum = 0
maxNum = -float(&#39;inf&#39;)
minNum = float(&#39;inf&#39;)
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 のリスト内包表記を使用すると、新しいリストの作成が非常に簡単かつ直感的になります。


辞書のデフォルト値

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... が嫌いな人にとっては本当に最初の選択肢です。

for...else... ステートメント

P:

dic = {&#39;name&#39;:&#39;Tim&#39;, &#39;age&#39;:23}  
  
dic[&#39;workage&#39;] = dic.get(&#39;workage&#39;,0) + 1
#dic = {&#39;age&#39;: 23, &#39;workage&#39;: 1, &#39;name&#39;: &#39;Tim&#39;}
ログイン後にコピー

NP:

if &#39;workage&#39; in dic:
    dic[&#39;workage&#39;] += 1
else:
    dic[&#39;workage&#39;] = 1
#dic = {&#39;age&#39;: 23, &#39;workage&#39;: 1, &#39;name&#39;: &#39;Tim&#39;}
ログイン後にコピー

for...else... の else 部分は、処理に使用されます。 for ループ条件から中断されない項目。これを使用すると、for ループが発生するかどうかを確認するために状態変数を設定する必要がなく、シンプルで便利です。


三項記号の置換

P:

for x in xrange(1,5):
    if x == 5:
        print &#39;find 5&#39;
        break
else:
    print &#39;can not find 5!&#39;
#can not find 5!
ログイン後にコピー

NP:

find = False
for x in xrange(1,5):
    if x == 5:
        find = True
        print &#39;find 5&#39;
        break
if not find:
    print &#39;can not find 5!&#39;
#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 です。

zip を使用してキーと値のペアを作成します

P:

a = 3  
  
b = 2 if a > 2 else 1
#b = 2
ログイン後にコピー

NP:

if a > 2:
    b = 2
else:
    b = 1
#b = 2
ログイン後にコピー
zip メソッドはタプルを返し、それを使用してキーと値のペアを作成します。シンプルかつ明確です。

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