今まで、私たちは、あなたは、Pythonの側面のほとんどを使用します導入をカバーしています。この章では、私たちは私たちのPythonのより包括的に理解するために、いくつかの他の側面を紹介します。
1.転送タプル
あなたは、関数から2つの異なる値を返すようにしたいでしたか?あなたはそれを行うことができます。あなただけがタプルを使用する必要があります。
>>> def get_error_details():
... return (2, 'details')
...
>>> errnum, errstr = get_error_details()
>>> errnum
2
>>> errstr
'details'
留意することはa, b = <some expression>
表現の使用の結果それは、2つの値を持つタプルとして解釈されるであろう。
また、これはPythonでスワップ二つの変数への最速の方法があることを意味します。
>>> a = 5; b = 8
>>> a, b
(5, 8)
>>> a, b = b, a
>>> a, b
(8, 5)
2.特別な方法
など__init__
と__del__
クラスがあるために特別な意味を持っている方法のいくつか。
特定の特別の動作をシミュレートするために使用される方法は、ビルトインタイプ。あなたのクラスのために使用したい場合たとえば、x[key]
(リストやタプルでの使用と同じように)インデックスの操作、あなたは何をする必要があるだけで実現され__getitem__()
、その後、あなたの作業が行われている方法を、。あなたはそれを理解しようとした場合、それはPythonの考えることですlist
そうするクラス!
次の表は、いくつかの有用な特別なメソッド。あなたはすべての特別なメソッドをお知りになりたい場合は、してくださいマニュアルを参照してください。
__init__(self, ...)
- 新しく作成されたオブジェクトを使用する準備ができて返されたときにこのメソッドが呼び出されます。
__del__(self)
- オブジェクトが削除される前にこのメソッドが呼び出される(その使用のタイミング予測できないので、それを使用しないように)
__str__(self)
- 我々は、使用する場合
print
の機能を、またはstr()
使用される時に呼び出されます。
- 我々は、使用する場合
__lt__(self, other)
- 場合未満オペレータが(<)と呼ばれて使用される場合。同様に、他のすべての演算子(+、>、など)は、特定のメソッドが呼び出されています。
__getitem__(self, key)
- 使用して、
x[key]
時にインデックス操作と呼ばれます。
- 使用して、
__len__(self)
- シーケンスのための組み込みオブジェクト使用する場合は
len()
関数が呼び出されます。
- シーケンスのための組み込みオブジェクト使用する場合は
3.シングル文ブロック
私たちは、区別の残りの部分と独自のインデントレベルによって文の各ブロックを見てきました。これは本当ですが、小さな警告があります。あなたの文のブロックは、単一の文が含まれている場合、あなたは、例えば、同じ行に条件文とループ文を、それを指定することができます。次の例では、より明確に説明することができるはずです。
>>> flag = True
>>> if flag: print('Yes')
...
Yes
単一のステートメントが代わりに使用されていることを注意はすぐに、それは単一のブロックと見なされることはありません。あなたがプログラムを作ることができ、が、この方法では、より多くのあるコンパクトな、それはエラーをチェックする場合を除き、私は非常にこのショートカットメソッドを使用しないことをお勧めします、主に誤って「ちょうどいい」シュリンクを使用している場合ので、ジン、追加のステートメントを追加することは非常に簡単です。
4.ラムダテーブル
lambda
声明では、新しい関数オブジェクトを作成します。本質的には、lambda
身体の関数として表現が続く引数を必要とし、この式の値は、新しい関数の戻り値として実行されます。
ケース(として保存more_lambda.py
):
points = [{'x': 2, 'y': 3},
{'x': 4, 'y': 1}]
points.sort(key=lambda i: i['y'])
print(points)
出力:
$ python more_lambda.py
[{'y': 1, 'x': 4}, {'y': 3, 'x': 2}]
通知にlist
のsort
取得する方法key
リストの順序を決定するためのパラメータを(通常我々は唯一の昇順と降順を知っています)。私たちのケースでは、我々はそのために、我々は関数を記述する必要があり、並べ替えカスタムを行いたいが、それは別の関数として書かれていませんdef
我々は新しいを作成するために、ラムダ式を使用するので、これだけの場所では、ブロック機能。
5.導出リスト
既存のリストから新しいリストを取得するには、リストの内包表記(リスト理解)。想像してみて、今、あなたは番号のリストを持っている、あなたは、2つ以上の場合の数字は2倍され、対応するリストを取得したいです。リストの内包は、このような状況に最適です。
ケース(として保存more_list_comprehension.py
):
listone = [2, 3, 4]
listtwo = [2*i for i in listone if i > 2]
print(listtwo)
出力:
$ python more_list_comprehension.py
[6, 8]
一定の条件が満たされたときに、この場合には、( if i > 2
)、我々は、操作を(指定された2*i
新しいリストを取得するために、)。元のリストが変わらないことに注意すること。
我々はリスト内の各要素を処理するためにループを使用して、随時新しいリストを格納する際に誘導されることのリストを使用することの利点は、それがテンプレート(定型)コードの数を減少させます。
6.タプル辞書機能を受け取ります
使用された一つの特定の方法*
や**
パラメータを受信したとして、それらの機能を作るために、接頭辞タプルや辞書。関数は引数の可変数を、必要とする場合、非常に参考になります。
>>> def powersum(power, *args):
... '''Return the sum of each argument raised to the specified power.'''
... total = 0
... for i in args:
... total += pow(i, power)
... return total
...
>>> powersum(2, 3, 4)
25
>>> powersum(2, 10)
100
私たちがいるのでargs
前に変数を追加した*
接頭辞、他のすべての追加のパラメータは、関数に渡されargs
て、タプルとして保存します。場合**
と値のペア-接頭辞、追加のパラメータは、辞書のキーとして扱われます。
7. assert
ステートメント
assert
何かが真実であることを主張(アサート)に声明。たとえば、あなたは非常にあなたが少なくとも1つの元素を含むリストを使用して、それが真実ではない場合、それはエラーをスローし、ことを確認するにはされていると言う、assert
声明は、この場合に理想的です。文がアサーションが失敗した場合は、それがスローされますAssertionError
。
>>> mylist = ['item']
>>> assert len(mylist) >= 1
>>> mylist.pop()
'item'
>>> assert len(mylist) >= 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
あなたは賢明な選択する必要がありassert
声明を。ほとんどの場合、より良いポジショニングの問題よりも、例外をキャッチしたり、ユーザーとし、終了するエラーメッセージを表示することをお勧めします。
8.デコレータ
デコレータ(デコレータ)は、アプリケーションラッパー関数へのショートカットです。これは、「パッケージ化。」、何度も何度もいくつかのコードで特定の機能に役立ちます 例えば、私は自分自身のために作成されたretry
ので、私はあなたが単一の実行ですべてのエラーを投げる場合は、内の任意の関数に適用することができること、それは5倍の最大数まで再実行しようとします、デコレータをし、各実行中にいくつかの遅れがあるでしょう。あなたは、リモートコンピュータのネットワーク呼び出し上にあるとき、これは非常に便利です。
from time import sleep
from functools import wraps
import logging
logging.basicConfig()
log = logging.getLogger("retry")
def retry(f):
@wraps(f)
def wrapped_f(*args, **kwargs):
MAX_ATTEMPTS = 5
for attempt in range(1, MAX_ATTEMPTS + 1):
try:
return f(*args, **kwargs)
except:
log.exception("Attempt %s/%s failed : %s",
attempt,
MAX_ATTEMPTS,
(args, kwargs))
sleep(10 * attempt)
log.critical("All %s attempts failed : %s",
MAX_ATTEMPTS,
(args, kwargs))
return wrapped_f
counter = 0
@retry
def save_to_database(arg):
print("Write to a database or make a network call or etc.")
print("This will be automatically retried if exception is thrown.")
global counter
counter += 1
# 这将在第一次调用时抛出异常
# 在第二次运行时将正常工作(也就是重试)
if counter < 2:
raise ValueError(arg)
if __name__ == '__main__':
save_to_database("Some bad value")
出力:
$ python more_decorator.py
Write to a database or make a network call or etc.
This will be automatically retried if exception is thrown.
ERROR:retry:Attempt 1/5 failed : (('Some bad value',), {})
Traceback (most recent call last):
File "more_decorator.py", line 14, in wrapped_f
return f(*args, **kwargs)
File "more_decorator.py", line 39, in save_to_database
raise ValueError(arg)
ValueError: Some bad value
Write to a database or make a network call or etc.
This will be automatically retried if exception is thrown.
概要
私たちは、この章ではPythonについてのより多くの機能を導入しましたが、私たちは、Pythonのすべての機能をカバーしていません。しかし、この段階では、我々はあなたが実際に遭遇するもののほとんどをカバーしています。これは、あなたの希望のプログラムのいずれかを書き始めた取得するのに十分です。
次に、我々はさらにパイソンを探索する方法について説明します。
リソース
[1] パイソンの詳細A・バイト