どうしてこうなったPython!コードから学ぶPythonの面白いところ

2017.09.4

こんにちは、@ma3tk です。
世の中はまさに Python が書けるエンジニアを欲していますね。

先程、GitHub のトレンドを見ていたら、「なんてことだ Python (原題: What the f*ck Python?)」というリポジトリを発見しました。

これは、Python の面白い事象を集めたリポジトリになっていて、サンプルコードと共にこういう言語仕様なんだよという解説も加えられている読み物になっています。ちなみに、 npm を使ってコマンドラインから読むことができるようです。

$ npm install -g wtfpython

いきなり英語を読むのも苦痛かと思うので、いくつか個人的に面白かった内容を簡単に2つほど紹介してみたいと思います。

書いてあるコードが実行されない?

https://github.com/satwikkansal/wtfpython#well-something-is-fishy
※上記サイトから引用

上記のコードは一見普通に動きそうですが、Python2系で実行してみると結果は x の値が出てきてしまいます。
解説にも書いてありますが、この return 文のインデントはタブインデントになっており、Python ではタブインデントは 8スペース分に置き換えられるようです。そのため、return 文の前の行と同じインデントになり、forループの1回目で return されるため (0 + x) の状態が結果として出力されることになります。たしかにタブインデントが 8スペース分に置き換わるということを知らないとどこでバグってるのかわからない状態になってしまいますね。
しかしながら、Python3系ではタブとスペースの混在はエラーになるようですね。

同じ「+」でも違う意味になる

https://github.com/satwikkansal/wtfpython#same-operands-different-story

※上記サイトから引用

a = [1, 2, 3, 4]
b = a
a = a + [5, 6, 7, 8]

a = [1, 2, 3, 4]
b = a
a += [5, 6, 7, 8]

で実行すると、それぞれの b は、

b = [1, 2, 3, 4]

b = [1, 2, 3, 4, 5, 6, 7, 8]

となります。

オペランドが同じで同じような意味になりそうでも、Pythonの場合、同じように動作するわけじゃないというのがこのコードですね。
上記の方は、新しい a としてオブジェクトを作り、b は変更しないため b に影響がないのですが、下記の式の方は、同じオブジェクトを指し示していて、extend 関数によってマッピングが起こるために a にも b にも影響が出る仕様になっているみたいですね。自分も Findy の解析用コードを書いてる時にこれが起こって一度調べた記憶があります。つらい。

まとめ

本日は、What the f*ck Python? というリポジトリについて紹介させていただきました。約35サンプル程がリポジトリに掲載されているので、Pythonを触ったことがある人でもない人でも「あるあるww」とか「へーそうなんだー」と勉強になる内容になっているので覗いてみてはいかがでしょうか。

ちなみに「ハイスキルなエンジニアのプレミアム転職サービスFindy」 でも Python が書ける求人や機械学習のエンジニアを探している企業様がいらっしゃいますので、もし興味があればログインしてみてプロフィール項目を埋めてみてください!^^
プロフィールが埋まってると仕様上いいねが来やすくなります!

読んで頂きありがとうございました! 宜しければ、エンジニアの皆様はFindyでご自身のスキル偏差値を測定してみてください。

[正社員の方]
ハイスキルなエンジニアのプレミアム転職サービス Findy

[フリーランスの方]
フリーランス・副業エンジニア向けの単価保証型の案件紹介サービス Findy Freelance

また、Findyでは年齢や勤務形態を問わず、様々な働き方で採用をしています。興味のある方は、こちらからご応募どうぞ!

Findy Engineer Labを購読してみませんか?
エンジニアの働き方やFindyの技術的な話などをお送りします!
フリーランス・副業エンジニア向け
単価保証型案件紹介サービス

エンジニアにとって魅力的な、リモートOKで週2〜3可の案件をあなたの希望単価でご紹介サポートします。

担当より:
4月中盤から高単価の案件増加中!
CTO の佐藤も「リモートかつスキルアップできそう!」と気になるくらい案件がありますので案件の詳細を是非見てくださいませ!

https://freelance.findy-code.io/
  • Category

  • About

  • Service

    フリーランス・副業向け
    単価保証型案件紹介サービス

    ハイスキルなフリーランス・副業エンジニア向けに案件紹介

    https://freelance.findy-code.io/
    ハイスキルなエンジニアの
    プレミアム転職サービス

    スキル偏差値が高いエンジニアに、人気のテック企業からオファーが届く

    https://findy-code.io/
    リアルタイムAI求人票採点サービス

    AIを使ってリアルタイムに求人票を採点

    https://findy.us/