Personal tools

print文に続き,if文やfor文,def文などが関数に - Python 3.1から

by ats posted at 2009-04-01 17:30 last modified 2009-04-01 18:25

Python 3.0に盛り込まれた後方互換性を崩す変更のうち一番目を引くのはprint文がprint関数になり,文から式に変更されたことだろう。当初は大きな反発が寄せられることが予想されたが,意外にもこの変更は比較的スムーズに受け入れられた。

この反応を受けて,PythonのBDFL(慈悲深き独裁者) GuidoはPython 3.1から,if文やfor文,def文などを関数にし,Pythonのすべての文を式に変更する計画を明らかにした。Pythonの文は改行を要求するため,言語の文法に大きな制限を課していた。この変更が実現すれば,より自由な形式でプログラムを表記できるようになる。ワンライナーの愛好家には歓迎される変更となることが予想される。

新しいfor(),if()などの仕様は旧来の仕様を踏襲している。2.xでのコードと比較をしながら使い方を見てみよう。

まずはifから。


2.xまで

if x > 100:

    print "Grater than 100"


3.1から

if(x > 100, print("Grater than 100"))


次はfor。


2.xまで

for i in range(10):

    print i


3.1から

for(i, range(10), print(i))


この例を見れば分かると思うが,コードブロックは一つの複合式として記述することになる。ワンライナー好きな開発者の腕の見せ所といえる。
次は所謂FizzBuzz問題を解くコードを比較してみよう。Python 3.1ではelse節で実行する式を第3引数に指定する。それに伴ってelif相当の文法が廃止されていることがわかる。


Python 2.x

for i in range(1,101):

    if i%15 == 0:

        print "FizzBuzz"

    elif i%5 == 0:

        print "Buzz"

    elif i%3 == 0:

        print "Fizz"

    else:

        print i


Python 3.1

for(i, range(1, 101), if(i%15 == 0, print("FizzBuzz"), if(i%5 == 0, print("Buzz"), if(i%3 == 0, print("Fizz"), print(i))))


Pythonのコードらしく,インデントを使って整形するとこうだ。


for(i, range(1, 101),

    if(i%15 == 0, print("FizzBuzz"),

        if(i%5 == 0, print("Buzz"),

            if(i%3 == 0, print("Fizz"),

                print(i)

              )

          )

      )

   )


def()関数は実行可能オブジェクトを返す関数となる。関数ブロックで実行するコードは,if()やfor()と同様,複合式として記述する(具体例は横に長くなりすぎるので書かない)。class()関数は,クラスオブジェクトを返す関数となる(同じく横に長くなりすぎるので省略)。その他,import()関数,代入式の変わりに使い,変数を定義し代入を行うlet()関数の導入などが提案されている。

この発表は一部では大きな反響を呼んでいる。「PythonこそLispの正当な継承者であることが証明された」「Pythonistaはあと10年は戦える」という肯定的な意見もある一方で,「インデントの意味が無くなっている,こんなのPythonじゃない」「let()なんてBASICみたいで嫌だ」「3.0から3.1の間では後方互換性を崩す変更がされないと言っていたじゃないか,大人は嘘つきだ」というような反発も散見される。

この発表に前後して,GuidoがBDFLからBDEVIL(Benevolent Dictator Emeritus Vacationing Indefinitely from the Language,言語を離れて無期限の休暇に出る慈悲深き名誉独裁者)になった事がアナウンスされている。長年の夢だったエベレスト制覇が理由だと公式にはうたわれているが,今回の決定にはこの暴挙を食い止めるねらいもあったようである。Guidoの後継で「Barryおじさん」として親しまれているBarry Warsawは,Python 3.0.2からprintを文に戻すとしているが,この決定は,Guidoの暴挙の反動なのではないかとさる筋は見ている。

The URL to Trackback this entry is:
http://coreblog.org/ats/statements-to-expressions-python-31/tbping

Re:print文に続き,if文やfor文,def文などが関数に - Python 3.1から

Posted by Anonymous User at 2009-04-01 17:51
この変更の意味はわからないなあ。なんで今更?って感じ。
これがPythonの人気の増加を殺してしまう
ささいな面倒にならないことを祈ります。

ちなみにDictator Emeritusは名誉独裁者の訳の方がしっかりくるかと。
教授と聞いて、どこの大学か思わずググってしまいました(笑)。

Re: print文に続き,if文やfor文,def文などが関数に - Python 3.1から

Posted by Dubhead at 2009-04-01 18:00
if式が値を返すようになったので、いわゆる三項演算子はdeprecated扱いになるそうです。

Re:print文に続き,if文やfor文,def文などが関数に - Python 3.1から

Posted by Anonymous User at 2009-04-01 18:05
あ、もしかしてボクタンだまされたかも
いやーん(笑)

Re:print文に続き,if文やfor文,def文などが関数に - Python 3.1から

Posted by Anonymous User at 2009-04-01 18:57
これはひどい。
括弧が増えると見づらくなるし、タイプ量が増えるしいいことないのに。
Pythonのいいところを消しさってどうするの。
まさに暴挙。

見やすく、読みやすく、分かりやすく、すっきりして、シンプルで簡潔な
変更だったら、受け入れるけど。これはダメだな。こんなのPythonじゃない。
Lispは読みにくいから嫌いなんだ。

Re:print文に続き,if文やfor文,def文などが関数に - Python 3.1から

Posted by 暮夜満足 at 2009-04-02 00:11
ごめんなさい。上の空文、僕です。ついカッとなってやってしまいました。

どれだけひどいとおもっているか、URLに記載しました。(トラックバックできなかったので)

Re:print文に続き,if文やfor文,def文などが関数に - Python 3.1から

Posted by ats at 2009-04-02 11:46
>AC1さん
ほんとうに意味が分からないですよね
def()が関数オブジェクトを返して,代入用にlet()関数を使うとするなら,関数を作るのに「let(foo, def(some code))」とかやることになるのかしら。こんなのPythonじゃない!

>Dubheadさん
いろんなところに影響が出るんですね〜

>AC2さん
本当に,暴挙としかいいようがない
まるでエイプリルフールのジョークみたいです!

>暮夜満足さん
お怒りはよく分かります!
幸い,GuidoかBDEVILになり事実上の引退をしたことで,この変更は行われないようですよ

Re:print文に続き,if文やfor文,def文などが関数に - Python 3.1から

Posted by Anonymous User at 2009-11-30 23:49
Python のことはほとんど知らないのですが、一瞬、真に受けそうになりました。

Re:print文に続き,if文やfor文,def文などが関数に - Python 3.1から

Posted by Anonymous User at 2009-12-20 10:57
お手数ですが、エイプリルフールのネタであることを明記したほうが良いと思います。4月に読んだ時は騙された~という感じで楽しく読ませていただきましたが、真に受ける人もいるかもしれません。

Re:print文に続き,if文やfor文,def文などが関数に - Python 3.1から

Posted by Anonymous User at 2010-02-03 19:10
みんなのpython-Webアプリ編のサンプルソースを探しに来たら・・・・・まんまと騙されました。
ウソで良かった。
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
コメントスパム避けのための認証文字列です

Captcha Image

Pythonな求人
r = urlopen("http://www.webcore.co.jp/recruit")
About this blog
■Author
atsこと柴田淳です。この記事を読んでいただくと,技術者としての人となりを分かってもらえるかも。
Webcore株式会社 代表取締役
Plone上で動く,オープンソースのBlog Product - COREBlog2を使って運用しています。

最近書いた原稿
最終回 Python 3.0座談会(動画つき) 2009-07-16
Python 3.0 Hacks 第6回 Pythonicな文字列フォーマットforamat()メソッド 2009-03-30
言語としての一貫性を重視したPython 3の進化 2009-02-20
Python 3が後方互換性を捨てても求めたもの 2009-02-02
Python 3.0 Hacks : 第0回 Pythonの2008-2009 2009-01-01
 
最近書いた本,Mook
みんなのPython 改訂版
Python使いはもちろん,プログラミングの初心者から,他言語からの移行組までご好評いただいているPythonの定番入門書の第2版です。Python 3.0を含む最新の情報について加筆を行い,より読みやすいように構成を大幅に見直しました。第一版をお持ちの方にもお役立ていただける内容になっています。
みんなのPython Webアプリ編
Pythonの基礎から,Webアプリやフレームワークの仕組みまで,つまることなく一気に学べる書籍です。「みんなのPython」と一緒に読んでください:-)。
 

Powered by Plone, the Open Source Content Management System