Pythonの隠された機能9つ

StackOverflowでHidden features of Pythonという面白い質問がありました。原文の方では何十も項目があるのですが、独断と偏見で9個に絞って紹介します。

1. chaining comparision operator

不等式を連結出来るなんて初めて知りました。スーパーかっこいいです。今まで1 < x and x < 10とか書き続けてました。

x = 5
if 1 < x < 10:
    print "yay"
if x < 10 < x*10 < 100:
    print "yaay!"
if 5 == x > 4:
    print "yaaay!!"

他の言語でも出来んの?と思ってちょっと調べてみましたが、どうもPythonだけっぽいです。やっぱりPython最高ですね!

2013.03.05 追記
twitterで突っ込まれました。Pythonだけって言うのは嘘でした。

まずCoffeeScriptで同じ事が可能です。Pythonのドキュメントにリンクが張られてるので、元ネタはPythonっぽいですが。

x = 5
if 0 < x < 10 < x*x
    console.log 'yay!'

そして各種Lisp方言では演算子の結合は当たり前の話ですね。忘れてました。下記はscheme。CommonLispは書いた事無いからパッと書けないです。

(let ((x 5))
  (if (< 0 x 10)
	  (print "yay")))

だがRuby、てめぇはダメだ。
2013.03.05 追記2
@yashiganiさんに色々教えてもらったのに流石に全否定はダメかなということで、下記Ruby。

x = 5
case x
when 0..10
  puts 'yay!'

確かにcaseも範囲式も便利で同等の処理を綺麗に処理しているのは分かるのですが、このコンテキストだとちょっと違うかなって。

2. try-except構文のelse

これも知りませんでした。try-except中で例外が発生しなかった場合elseブロックが実行されます。いつもtry-exceptの中が膨れがちで、しかも思わぬ例外が出たりして嫌だなぁと思っていたのですが、普通に構文として解決策が提供されていました。モグリですいません。

filename = raw_input("Please enter a filename: ")
try:
    f = open(filename, 'r')
except IOError:
    print 'cannot open', filename
else:
    # try-excpetの中に書くよりイイネ!
    print filename, 'has', len(f.readlines()), 'lines'
    f.close()

3. for構文のelseとgoto

さっきのと似てるんですが、forループ中にbreakされなかった場合にelseブロックが実行されます。あとループつながりでgotoがPythonでも使えるよという。gotoは知りませんでした。どちらも時々欲しくなります。

# ループで何か探したりするのに便利
for i in foo:
    if i == 0:
        break
else:
    print("i was never 0")

# ネストループから脱出
from goto import goto, label
for i in range(1, 10):
    for j in range(1, 20):
        for k in range(1, 30):
            print i, j, k
            if k == 3:
                goto .end # breaking out from a deeply nested loop
label .end
print "Finished"

ちなみにgotoはサードパーティモジュールとして提供されているのでインストールしないと使えません。
$ pip install goto

2013.03.06 追記
すいません、pipでインストールできるgotoは別物でした。コチラのコードをお試しください。あと念のため言っておきますが、gotoはジョークモジュールなので本気で使うとかは無いです。ちゃんとループばらしたコード書きましょう。

4. enumerate

これは定番だと思いますが、for文中でインデックスにアクセスできます。ちなみにenumerateの第2引数を指定すると開始インデックスを0から変更出来ます。あまり使わないですけど。

a = ['a', 'b', 'c', 'd', 'e']
for index, item in enumerate(a):
    print index, item

# 開始indexを1に変更
for index, item in enumerate(a, 1):
    print index, item

5. New Style Format

Python2.6から使えるようです。知りませんでした。個人的に%の構文はちょっと気持ち悪かったので良い感じです。

print("The {foo} is {bar}".format(foo='answer', bar=42))
print("The {0} is {1}".format('answer',42))

6. dictのget

辞書に指定のキーが含まれてない場合に、デフォルト値を指定出来るget。DjangoのQueryDictのメソッドだと思い込んでいました。ビルトインの辞書に実装されてたんですね。

a = {'a':10, 'b':20}
print a.get('c', 30)

7, 8, 9. オモシロimport文3つ

やった事無い人は試してみましょう。

import antigravity
from __future__ import braces
import this

以上、他にも色々な項目が紹介されているので元ページも是非ご覧下さい。

2 thoughts on “Pythonの隠された機能9つ”

  1. gotoというモジュールは確かにPyPIにありますが、上で書かれているのとは違うみたいですね。
    もしかしてネタですか?

  2. odiakさん、ありがとうございます!
    ご指摘の通りpypiに登録されているのは別モジュールでした。本文修正しましたのでご確認ください。

Leave a Reply

Your email address will not be published. Required fields are marked *