5つの隠されたPython機能

 

この記事では、Pythonで見つけることができる珍しい機能のトップ5を紹介します。経験豊富なPython開発者はそれらのいくつかを認識するかもしれません。ただし、他の人はまだ不明です。とにかく、私はそれらのすべてがとてもクールだと思います。

はい、あなたはそれを正しく読んでいます、Pythonで有効な構造です。と呼ばれるシングルトンオブジェクトEllipsisです。Pythonインタープリターに入力すると、実際に表示されます。

>>>

Ellipsis

公式ドキュメントによるとEllipsisは「ユーザー定義のコンテナデータ型の拡張スライス構文と主に組み合わせて使用される特別な値」です。それには2つの主要なユースケースがあります。1つは、空関数のプレースホルダー本体として機能することです。もう1つはNumpy、ドキュメントで説明されているように、スライスアイテムとしてオンになっています。

関数プレースホルダー

def my_awesome_function():

これは次と同等です。

def my_awesome_function():

Ellipsis

この:

def my_awesome_function():

pass

注意してください、私はpass==と言っているのではなく、関数本体として、結果は同じであると言っているだけです。実際、プレースホルダーとして何でも使用できます。

def my_awesome_function():

"An empty, but also awesome function"

ナンピー

以下のコードは、基本的に行列の配列を作成することを意味します。各行列は3×3です。次に、すべての最も内側の行列の2番目の列(numpy配列は0ベース)を取得します。

>>> import numpy as np

>>> array = np.arange(27).reshape(3, 3, 3)

>>> array

array([[[ 0, 1, 2],

[ 3, 4, 5],

[ 6, 7, 8]],

[[ 9, 10, 11],

[12, 13, 14],

[15, 16, 17]],

[[18, 19, 20],

[21, 22, 23],

[24, 25, 26]]])

>>> array[…, 1]

array([[ 1, 4, 7],

[10, 13, 16],

[19, 22, 25]])

>>> # This is equivalent to>>> array[:, :, 1]

array([[ 1, 4, 7],

[10, 13, 16],

[19, 22, 25]])

注意:Pythonのリストはでは機能しません

エレガントな開梱

反復可能な開梱は非常に便利な機能であり、しばらくの間そこにありました。ほとんどの人は、複数のアイテムを含む反復可能ファイルを解凍するためにそれを使用します。例として、次のユースケースを考えてみましょう。

>>> a, *b, c = range(1, 11)

>>> a

1>>> c

10>>> b

[2, 3, 4, 5, 6, 7, 8, 9]

あるいは単に:

>>> a, b, c = range(3)

>>> a

0>>> b

1>>> c

2

しかし、多くの人が利用しない1つの優れたユースケースは、単一の反復可能オブジェクトを解凍することです。なぜこれが役立つのですか?それはコードをもう少しエレガントにします、私見。

これを行う代わりに:

>>> lst = [1]

>>> a = lst[0]

>>> a

1>>> (a, ) = lst

>>> a

1

あなたはこれを行うことができます:

>>> lst = [1]

>>> [a] = lst

>>> a

1

ばかげているように見えるかもしれませんが、少なくとも私には、よりエレガントに見えます。

このリストをフラット化できますか?

リストのフラット化は、いくつかの方法で実行できます。最も単純な方法は、リスト内包表記を使用することです。

>>> l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

>>> flattened = [elem for sublist in l for elem in sublist]

>>> flattened

[1, 2, 3, 4, 5, 6, 7, 8, 9]

関数型プログラミングに興味がある場合は、レデューサーを使用できます。

>>> from functools import reduce

>>> reduce(lambda x,y: x+y,l)

[1, 2, 3, 4, 5, 6, 7, 8, 9]

ただし、さらに別の方法があります。sum機能が使えます!

>>> sum(l, [])

[1, 2, 3, 4, 5, 6, 7, 8, 9]

これがsum機能するのは、関数がリスト内の各要素を反復処理し、2番目の引数として渡したデフォルト値とそれらを連結するためです。Pythonのリストは+演算子と連結できるため、次のようになります。

>>> sum(l, []) ==> [] + [1, 2, 3] + [4, 5, 6] + [7, 8, 9]

[1, 2, 3, 4, 5, 6, 7, 8, 9]

このトリックは素晴らしいものですが、決して読みやすいものではありません。また、それはひどいパフォーマンスを持っています。

文字列でこれを行うことはできますか?

いいえ、Pythonでは、文字列を+演算子で連結できますが、文字列で同じことを行うことは禁止されています

>>> s = ["abc", "def", "ghf"]

>>> sum(s, "")

<span style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgba(204, 214, 221, 0.5); font-weight: bold; –text-opacity: 1; border-radius: 0px; background: transparent;"–<————————————————————————-

TypeError Traceback (most recent call last)

<ipython-input-3-f60d89b81305> in <module>

<span style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgba(204, 214, 221, 0.5); font-weight: bold; –text-opacity: 1; border-radius: 0px; background: transparent;"–<–> 1 sum(s, "")

TypeError: sum() can't sum strings [use ''.join(seq) instead]

イントロCPythonソースコードを掘り下げると、これがどこで発生するかを見つけることができます。

static PyObject *

builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start)/*[clinic end generated code: output=df758cec7d1d302f input=162b50765250d222]*/{

PyObject *result = start;

PyObject *temp, *item, *iter;

iter = PyObject_GetIter(iterable);

if (iter == NULL)

return NULL;

if (result == NULL) {

result = PyLong_FromLong(0);

if (result == NULL) {

Py_DECREF(iter);

return NULL;

}

} else {

/* reject string values for 'start' parameter */

if (PyUnicode_Check(result)) {

PyErr_SetString(PyExc_TypeError,

"sum() can't sum strings [use ''.join(seq) instead]");

Py_DECREF(iter);

return NULL;

}

if (PyBytes_Check(result)) {

PyErr_SetString(PyExc_TypeError,

"sum() can't sum bytes [use b''.join(seq) instead]");

Py_DECREF(iter);

return NULL;

}

if (PyByteArray_Check(result)) {

PyErr_SetString(PyExc_TypeError,

"sum() can't sum bytearray [use b''.join(seq) instead]");

Py_DECREF(iter);

return NULL;

}

Py_INCREF(result);

}

github.com/python/cpython/blob/c96d00e88ead.。

ザ・ _

これは本当に興味深く、REPLで作業するときに非常に便利です。デフォルトのPythonインタープリターだけでなく、IPythonでも機能します。

REPLで式を実行するたびに、Pythonは出力を_変数にバインドします。

>>> nums = [1, 3, 7]

>>> sum(nums)

11>>> _

11

>>>

_は他の変数と同じように変数なので、再バインドするか、他のことを行うことができます。

>>> 9 + _

20>>> a = _

>>> a

20

なにelse

elseステートメントは、いくつかの目的に役立ちます。知っている人はほとんどいませんが、古典的な 'ifelse`ブロックの外で使用できます。Pythonでは、ループや例外ブロックで使用できます。

ループ

Pythonには2つの異なるループがforありwhileます。それらの両方が「壊れている」可能性があります。つまり、特定の条件が満たされると、ループから抜け出すことができます。例えば:

In [7]: while a < 10:

…: if a == 3:

…: print("a == 3. exiting loop.")

…: break

…: a += 1

…:

a == 3. exiting loop.

ここで、特定の条件を探しているとしましょう。その条件が満たされた場合、結果をfoundというフラグに保存します。次に、それが見つからない場合は、メッセージを印刷します。

found = False

a = 0

while a < 10:

if a == 12:

found = True

a += 1if not found:

print("a was never found")

a12になることはないので、プログラムはを出力しますa was never found

わかりましたがelse、このコンテキストでどのように使用できますか?

elseフラグを置き換えるために使用することができます。基本的に、実際に必要なのは、ループを実行し、見つからない場合はメッセージを出力することです。これは次のようになりelseます:

a = 0

while a < 10:

if a == 12:

break

a += 1else:

print("a was never found")

また、どのループでも機能するため、のfor代わりにを使用できますwhile

for a in range(10):

if a == 12:

break

a += 1else:

print("a was never found")

例外

elsePythonではとても万能あなたもそれを使用できるということであるtry … exceptブロック。ここでの考え方は、発生しない例外をキャプチャすることです。

In [13]: try:

…: {}['lala']

…: except KeyError:

…: print("Key is missing")

…: else:

…: print("Else here")

…:

Key is missing

この例では、空の辞書で「lala」という名前のキーを検索してみます。「lala」がないため、コードでKeyError例外が発生します。このスニペットをで実行するとIPython、期待どおりの結果が得られました。

プログラムが例外を発生させない場合はどうですか?

In [14]: try:

…: {'lala': 'bla'}['lala']

…: except KeyError:

…: print("Key is missing")

…: else:

…: print("Else here")

…:

Else here

これで、実際の動作を確認できます。{’lala’: ‘bla’}[‘lala’]ブロックは発生しませんKeyErrorので、else場に出ました。

これを知っている人はほとんどいないので、同じコードベースで作業している他の開発者を混乱させないために、この機能の使用は個人的に避けています。でも、友達に感動を与えるのはいいことです!

上司のようなものを比較する

これは私のお気に入りの1つであり、正直言ってそれほど隠されていません。多くのプログラミング言語とは異なり、のようなJavaCまたはC++、Pythonはチェーン比較演算子にことができます。xの値を保持する変数があると想像してみましょう10ここで、x5..20などの範囲内にあると主張したいとしますあなたはこのようなことをすることができます:

In [16]: x = 10

In [17]: if x >= 5 and x <= 20:

…: print("x is within range")

…: else:

…: print("x is outside range")

…:

is within range

結局のところ、これは演算子をチェーンすることで簡略化できます。したがって、コードを次のようにリファクタリングできます。

In [18]: if 5 <= x <= 20:

…: print("is within range")

…: else:

…: print("x is outside range")

…:

is within range

このコードはまったく同じ結果を達成しますが、はるかにエレガントです。あらゆる種類の比較演算子を使用してチェーンできます。

>>> x = 10>>> 20 == x > 1False>>> 25 > x <= 15True>>> x < 20 < x*10 < 1000True

とてもかっこいい!

結論

これでこの投稿は終わりです。Pythonは非常に使いやすい言語であり、いくつかの優れた機能がありますが、あまり知られていません。

https://miguendes.me/5-hidden-python-features-you-probably-never-heard-of

コメントを残す

メールアドレスが公開されることはありません。

Next Post

PyQtレイアウト:プロフェッショナルな外観のGUIアプリケーションの作成–実際のPython

金 11月 27 , 2020