StackOverflow コミュニティが何を Python の重要な言語機能 (イディオム) と考えているか知りたいです。プログラマーを Pythonic として定義する機能。
Python (pythonic) イディオム - Python 言語に自然または特徴的な「コード表現」。
さらに、すべての Python プログラマーが早い段階で学ぶべきイディオムはどれですか?
前もって感謝します
関連している:
StackOverflow コミュニティが何を Python の重要な言語機能 (イディオム) と考えているか知りたいです。プログラマーを Pythonic として定義する機能。
Python (pythonic) イディオム - Python 言語に自然または特徴的な「コード表現」。
さらに、すべての Python プログラマーが早い段階で学ぶべきイディオムはどれですか?
前もって感謝します
関連している:
Python は、次のように記述できる言語です。
「フックの巨大なバッグで手のひらに収まるルール」.
Python のほぼすべてが、同じ単純な基準に従っています。すべてがアクセス可能で、変更可能で、微調整可能です。言語レベルの要素はほとんどありません。
たとえば、len(data) 組み込み関数を考えてみましょう。 len(data)
メソッドをチェックするだけで機能しdata.__len__()
、それを呼び出して値を返します。そうすれば、メソッドlen()
を実装する任意のオブジェクトで動作できます__len__()
。
型と基本的な構文について学ぶことから始めます。
次に、Python の仕組みについて学びます。
dir()
関数___builtins__
ピースを組み合わせる方法を理解したら、戻ってより高度な言語機能のいくつかをカバーします。
__len__
(これらはたくさんあります)そして、これらのアイテムを快適に使用できるようになったら (それらが Pythonic になる理由に焦点を当てて)、より具体的なアイテムを見てみましょう。
The Zen of Python (Tim Peters 著)を決して忘れないでください。
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
このページでは、すべての主要なPythonイディオムについて説明します:http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html
Python の重要なイディオムは docstring です。
すべてのオブジェクトには、そのオブジェクトのヘルプを取得するために使用できる __doc__ 属性があります。次のように、モジュール、クラス、メソッド、および関数に __doc__ 属性を設定できます。
# this is m.py
""" module docstring """
class c:
"""class docstring"""
def m(self):
"""method docstring"""
pass
def f(a):
"""function f docstring"""
return
などと入力するとhelp(m)
、help(m.f)
docstring がヘルプ メッセージとして出力されます。
これは通常のオブジェクト イントロスペクションの一部にすぎないため、epydoc などのドキュメント生成システムで使用したり、ユニットテストでテスト目的で使用したりできます。
また、 Dparserの文法など、型にはまらない (つまり慣用的ではない) 用途にも使用できます。
私にとってさらに興味深いのは、 docはほとんどのオブジェクトで読み取り専用の属性ですが、次のようにどこでも使用できることです。
x = 5
""" pseudo docstring for x """
また、 epydocなどのドキュメンテーション ツールは、それらを取得して適切にフォーマットすることができます (通常のコメントはコードのフォーマット内に留まるのとは対照的です。
デコレーターは私の投票を得ます。他にどこに次のようなものを書くことができますか:
def trace(num_args=0):
def wrapper(func):
def new_f(*a,**k):
print_args = ''
if num_args > 0:
print_args = str.join(',', [str(x) for x in a[0:num_args]])
print('entering %s(%s)' %(f.__name__,print_args))
rc = f(*a,**k)
if rc is not None:
print('exiting %s(%s)=%s' %(f.__name__,str(rc)))
else:
print('exiting %s(%s)' %(f.__name__))
return rc
return new_f
return wrapper
@trace(1)
def factorial(n):
if n < 2:
return 1
return n * factorial(n-1)
factorial(5)
次のような出力を取得します。
entering factorial(5)
entering factorial(4)
entering factorial(3)
entering factorial(2)
entering factorial(1)
entering factorial(0)
exiting factorial(0)=1
exiting factorial(1)=1
exiting factorial(2)=2
exiting factorial(3)=6
exiting factorial(4)=24
exiting factorial(5)=120
リストの使用法に関連するすべて。
理解、ジェネレータなど。
個人的には、「BEGIN」と「END」という言葉 (Microsoft の Basic と Visual Basic のように - 私はこれらが好きではありません) や left- と right- を使用するのではなく、indentationを使用してコード ブロックを定義する Python 構文が本当に好きです。中括弧 (C、C++、Java、Perl のように - 私はこれらが好きです)。
インデントは常に私にとって非常に重要でしたが、私はそれについてあまり「騒ぎ立てる」ことはありませんでした. "コード。さらに、別のプログラマーがインデントを言語の一部にすることを提案しているのも聞いたことがありません。パイソンまで!この考えを最初に実現したかっただけです。
私にとっては、Python の構文によって、適切で読みやすいコードを書かなければならないように思えます。
よし、ソープボックスから降りよう。;-)
より高度な観点から、辞書が Python の内部でどのように使用されているかを理解します。クラス、関数、モジュール、参照はすべて辞書の単なるプロパティです。これを理解すれば、モンキー パッチを適用し、強力な __gettattr__、__setattr__、および __call__ メソッドを使用する方法を簡単に理解できます。
ここに役立つものがあります。次の違いは何ですか:
[ foo(x) for x in range(0, 5) ][0]
と
( foo(x) for x in range(0, 5) ).next()
答え: 2 番目の例では、foo は 1 回だけ呼び出されます。これは、foo に副作用がある場合、またはリストの構築に使用されている iterable が大きい場合に重要になることがあります。
文字列置換の使用:
name = "Joe"
age = 12
print "My name is %s, I am %s" % (name, age)
私がPythonでプログラミングしていないときは、その単純な使用法が私が最も見逃していることです。
私が特に Pythonic だと思ったのは、動的型付けと、Python で使用されるさまざまな種類のリスト (特にタプル) の 2 つです。
Python のリストへのこだわりは LISP 的とも言えますが、それには独自の特徴があります。次のような行:
return HandEvaluator.StraightFlush, (PokerCard.longFaces[index + 4],
PokerCard.longSuits[flushSuit]), []
あるいは
return False, False, False
Python のように見えるだけで、他には何もありません。(技術的には、後者は Lua でも見られますが、Lua は一般的にかなり Pythonic です。)
オンラインのチュートリアルや本は、最善の方法ではなく、物事を行うことについてのみ話していると思います. Python 構文に加えて、場合によっては速度が重要だと思います。
Python は、実際には 2 つの機能をベンチマークする方法を提供します!!
1 つの方法はprofile
、次のようにモジュールを使用することです。
import profile
def foo(x, y, z):
return x**y % z # Just an example.
profile.run('foo(5, 6, 3)')
これを行う別の方法はtimeit
、次のようにモジュールを使用することです。
import timeit
def foo(x, y, z):
return x**y % z # Can also be 'pow(x, y, z)' which is way faster.
timeit.timeit('foo(5, 6, 3)', 'from __main__ import *', number = 100)
# timeit.timeit(testcode, setupcode, number = number_of_iterations)
十分に早く開始できないもう 1 つのことは、おそらくテストです。ここで特に doctest は、同時に説明することによってコードをテストする優れた方法です。
doctests は、対話型インタープリター セッションと次のようなテキストを含む単純なテキスト ファイルです。
Let's instantiate our class::
>>> a=Something(text="yes")
>>> a.text
yes
Now call this method and check the results::
>>> a.canify()
>>> a.text
yes, I can
egatext が何か違うものを返す場合、テストは失敗します。
doctests は、docstrings またはスタンドアロンのテキストファイル内に置くことができ、doctestsモジュールを使用して実行されます。もちろん、よく知られている単体テストも利用できます。