プログラミング学習をより楽しくする5つのPythonイースターエッグ
Pythonにはいくつかの隠れたイースターエッグがあることをご存知ですか?あなたのお気に入りのプログラミング言語は、アプリケーションを構築するのに役立つだけでなく、質の高いユーモアも提供します。いくつかのベストなものを見つけてみましょう。
5. こんにちは世界
もしあなたがどんな言語でもコードを書いたことがあるなら、最初のプログラムはコンソールに「Hello World」と表示するものである可能性が非常に高いです。Pythonでは、1行のコードでそれを実行できます。
print("Hello World")
しかし、これを行うにはより洗練された方法があります。__hello__というモジュールをインポートして印刷することができます。
import __hello__
しかし、Python 3.11以降は、実際にテキストを印刷するにはそのメインメソッドを呼び出す必要があります。
import __hello__
__hello__.main()
__hello__モジュールと同様に、同じことを行う__phello__モジュールもあります。
import __phello__
__phello__.main()
__phello__モジュールには、2回印刷するために呼び出すことができるspam属性さえあります。これは3.11より古いバージョンで動作します。
import __phello__.spam
実際、これらのモジュールは、Cpythonのソースコードに記載されているように、フローズンモジュールが意図した通りに機能するかをテストするためにPythonに追加されました。
In order to test the support for frozen modules, by default we define some simple frozen modules: __hello__, __phello__ (a package), and __phello__.spam. Loading any will print some famous words...
次に「こんにちは、世界!」を印刷したいときは、このトリックを試して笑ったり、他の人を感心させたりしてみてください。
4. Pythonの禅
すべてのプログラミング言語には、いくつかのルールや規則、哲学、ベストプラクティスがあります。Pythonも例外ではありません。Pythonプログラミング言語の主要な貢献者であったティム・ピーターズは、Pythonでコードを書くための原則のセットを書きました。これは一般に「Zen of Python」として知られています。この文献は、この言語自体にも組み込まれています。それを読むには、次のように実行するだけです:
import this
画面にPythonの禅が表示されるのが見えるでしょう。
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!
ファイルの実際のコードを見ると、興味深いものが見つかります。印刷されたテキストは元々暗号化されています。
s = """Gur Mra bs Clguba, ol Gvz Crgref
Ornhgvshy vf orggre guna htyl.
Rkcyvpvg vf orggre guna vzcyvpvg.
Fvzcyr vf orggre guna pbzcyrk.
Pbzcyrk vf orggre guna pbzcyvpngrq.
Syng vf orggre guna arfgrq.
Fcnefr vf orggre guna qrafr.
Ernqnovyvgl pbhagf.
Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.
Nygubhtu cenpgvpnyvgl orngf chevgl.
Reebef fubhyq arire cnff fvyragyl.
Hayrff rkcyvpvgyl fvyraprq.
Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.
Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.
Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.
Abj vf orggre guna arire.
Nygubhtu arire vf bsgra orggre guna *evtug* abj.
Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.
Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.
Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"""
与えられたテキストを変換している別のコードがあります。
d = {}
for c in (65, 97):
for i in range(26):
d[chr(i+c)] = chr((i+13) % 26 + c)
print("".join([d.get(c, c) for c in s]))
つまり、何が起こっているかというと、元のテキストはROT13という置換アルゴリズムを使用して暗号化されています。これは可逆的なアルゴリズムです。this<&47;code>モジュールをインポートすると、その暗号化されたテキストが元の形に復号され、画面に表示されます。
3. ブレースまたはノーブレース
Pythonを少しでも使ったことがあるなら、Pythonが多くの人気言語で一般的な構文の1つである波括弧をほとんど使用しないことを知っているでしょう。波括弧は通常、条件文やループなどのコードブロックのスコープを定義するために使用されます。Pythonは波括弧の代わりにインデントを使用します。しかし、Pythonに波括弧が登場することはあるのでしょうか?おそらくないでしょう。なぜなら、開発者たちはすでに__future__モジュールで答えを出しているからです。
from __future__ import braces
>>> SyntaxError: not a chance
これは他のケースでは見られない特別な構文エラーであり、波括弧がPythonに来ることは決してないことを示唆しています。Pythonの__future__モジュールは、将来のバージョンに組み込まれる現在のPythonバージョンの機能を実装するために使用されます。これは、新しい機能に適応できるようにするために行われます。このイースターエッグをこのモジュールに組み込むのは巧妙な選択でした。
2. フルフ
__future__モジュールには、もう一つの興味深いイースターエッグがあります。プログラミングで論理演算子を使用したことがあるなら、ほとんどの言語では不等号の記号が!=(感嘆符の後に等号)であることを知っているでしょう。しかし、Pythonのコア開発者の一人であるバリー・ワルサワ(通称アンクル・バリー)は、不等号にはダイヤモンド演算子(<>)を使用することを好みました。こちらがそのコードの一部です。
from __future__ import barry_as_FLUFL
0 != 1
>>> SyntaxError: with Barry as BDFL, use '<>' instead of '!='
0 <> 1
>>> True
1 <> 1
>>> False
FLUFLは「生涯の友好的な言語の叔父」を意味し、どうやらバリー叔父の称号のようです。
1. 反重力
もう一つの楽しいモジュールです。ネタバレはしませんが、このコードを実行して自分で体験してみてください。
import antigravity
このモジュールにはgeohash()関数もあります。この関数は、ムンローアルゴリズムを使用してジオハッシングを行うために使用されます。
さて、これはまったく場違いに見えるかもしれません。しかし、この機能は、あなたが反重力モジュールで見た以前のイースターエッグに密接に関連しています。なかなか面白いものです。
プログラミング言語に関する裏話を見つけるのはいつも興味深いことで、特にそれがあなたの顔に笑顔をもたらすならなおさらです。もしこれに興味があるなら、Pythonを学んでそれを使ってもっと楽しいことをすることを考えてみてください。