静かなる名辞

pythonとプログラミングのこと


Python対話的インタプリタでアンダースコアが便利(誰も知らない機能)

概要

 対話モードだとアンダースコアの変数が自動的にできています。最後に評価した結果が入るようです。

>>> 1 + 2
3
>>> _
3

 これはチュートリアルに書いてあったのですが、他の入門記事で触れられているのを見た記憶はまったくありません。私自身も、チュートリアルの「Pythonを電卓として使う」はなんとなく読み流していたので気づいていませんでした。

対話モードでは、最後に表示された結果は変数 _ に代入されます。このことを利用すると、Python を電卓として使うときに、計算を連続して行う作業が多少楽になります。
3. 形式ばらない Python の紹介 — Python 3.8.0 ドキュメント

 面白いですね。

性質を調べる

 あくまでも「最後に評価された式の値」を保持するものなので、標準出力に吐いた結果は反映されません。また、関数呼び出しでも結果は反映されますが、返り値のない関数を呼び出してもNoneになることはないようです。

>>> 4 + 5
9
>>> _
9
>>> pow(4, 2)
16
>>> _
16
>>> print("hoge", "fuga")
hoge fuga
>>> _
16

ドキュメントを調べる

 こんな簡単なものなのですが、ちゃんとしたドキュメントの記述を探そうとすると検索性が悪くて一苦労です。けっきょく正攻法で探すのは諦め、たぶん英語版スタックオーバーフローあたりの質問が出てくるだろうと思って「python interactive shell underscore」でgoogle検索したら、案の定出てきました。

stackoverflow.com

 sys.displayhookというのがそれに該当する関数だそうです。

sys --- システムパラメータと関数 — Python 3.8.0 ドキュメント

 性質はなかなか面白そうですが、まるごと引用するには少し長かったのでドキュメントをじっくり読んでください。

Jupyterでもできる

 あいつも対話環境の端くれならできるかもしれないと思って試したら、できました。

やってみた(ブラウザの幅をとてもせまくしています)
やってみた(ブラウザの幅をとてもせまくしています)

 正確な挙動は確認していませんが、試した範囲ではセルの評価が終わった瞬間の結果が代入されているようです。一つのセルで、

10 + 20
_

 とやっても望む結果は得られないということです。

まとめ

 割と便利。たのしい。