ウェブサイト検索

プログラミングを学ぶのがもっと楽しくなる5つのPythonイースターエッグ


Pythonにはいくつかの隠れたイースターエッグがあることをご存知ですか?実際、あなたのお気に入りのプログラミング言語はアプリケーション作成に役立つだけでなく、質の高いユーモアも生み出しています。では、その中でも最高のものを見つけてみましょう。

こんにちは世界

もしあなたが何らかの言語でコードを書いたことがあるなら、あなたの最初のプログラムはコンソールに「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でコードを書くための原則のセットを書きました。これは一般的に「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モジュールをインポートすると、その暗号化されたテキストは元の形式に復号され、画面に表示されます。

3. ブレースまたはブレースなし

もしあなたがPythonをほんの少しでも使ったことがあるなら、Pythonが多くの人気のある言語で一般的な構文である波かっこをほとんど使用しないことを知っているでしょう。波かっこは通常、条件分岐やループなどのコードブロックの範囲を定義するために使用されます。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()関数もあります。この関数はMunroeアルゴリズムを使用してジオハッシングを行うために使用されます。

さて、これはまったく場違いに見えるかもしれません。しかし、この機能はあなたが無重力モジュールで見た前のイースターエッグと密接に関連しています。とても素敵なものです。


プログラミング言語に関する裏話を見つけるのはいつも興味深いことです、特にそれがあなたの顔に笑顔をもたらす場合は。もしこれに興味があるなら、Pythonを学び、それを使ってもっと楽しいことをすることを考えてみてください。

関連記事: