どちらも機能的には同じように見えます。それぞれを使用することの違いと利点はありますか?
>>> from datetime import datetime, timedelta
>>> from datetime import (datetime, timedelta)
インポートを括弧で囲む場合、インポートステートメントに改行を入れると、行の継続にバックスラッシュを使用する必要はありません。これは、推奨されるスタイルです。機能的には、それらは同一であり、1つの行にある場合、parensを除外する方がクリーンです。
それらは両方とも同じです:
In [17]: import dis
In [18]: def func1():
....: from datetime import datetime, timedelta
....:
In [19]: def func2():
....: from datetime import (datetime, timedelta)
....:
In [20]: dis.dis(func1)
2 0 LOAD_CONST 1 (-1)
3 LOAD_CONST 2 (('datetime', 'timedelta'))
6 IMPORT_NAME 0 (datetime)
9 IMPORT_FROM 0 (datetime)
12 STORE_FAST 0 (datetime)
15 IMPORT_FROM 1 (timedelta)
18 STORE_FAST 1 (timedelta)
21 POP_TOP
22 LOAD_CONST 0 (None)
25 RETURN_VALUE
In [21]: dis.dis(func2)
2 0 LOAD_CONST 1 (-1)
3 LOAD_CONST 2 (('datetime', 'timedelta'))
6 IMPORT_NAME 0 (datetime)
9 IMPORT_FROM 0 (datetime)
12 STORE_FAST 0 (datetime)
15 IMPORT_FROM 1 (timedelta)
18 STORE_FAST 1 (timedelta)
21 POP_TOP
22 LOAD_CONST 0 (None)
25 RETURN_VALUE
@ sr2222の回答への追加。通常、これらの括弧は、次の行に続けて書きたい場合にのみ必要です。たとえば、次の 2 つの方法のいずれかで、2 行で文字列を宣言するために括弧を使用できます。
In [1]: s1 = 'abc' \
...: 'def'
In [2]: s1
Out[2]: 'abcdef'
In [3]: s2 = ('abc'
...: 'def')
In [4]: s2
Out[4]: 'abcdef'
たとえば、if ステートメントについても同じことが言えます。括弧を使用して、式を複数の行に分割します。
In [6]: if 1 in \
...: [1,2,3]:
...: pass
In [7]: if (1 in
...: [1,2,3]):
...: pass
両方のバージョンの機能は同じです。ただし、バックスラッシュの代わりに括弧を使用する方が優れたスタイルです。import ステートメントと同じです。式全体が 1 行に収まる場合は、括弧はまったく必要ありません。
いいえ、違いはありません。コンマと角かっこは、タプルリテラルの一般的なPython構文です。あなたはどこでもそれらを見るかもしれません。お気づきのとおり、角かっこはオプションであるため、構文には2つのバリエーションがあります。どちらの選択肢も同じ値を返します。
>>> 4,5
(4, 5)
>>> (4,5)
(4, 5)
ただし、より複雑なコンテキストでは、パーサーはコンマの理解が異なるため、本当にタプルが必要な場合は角かっこを使用する必要があります。たとえば、f(3,4)
と同等ではありませんf((3,4))
。
http://docs.python.org/2/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrangeおよびhttp://docs.python.org/のドキュメントを参照してください。2 / reference / grammar.html(ハードコア)