大文字、小文字、全組合せを表示

ちょうどよさげな問題なので初Python

大文字と小文字の全ての組み合わせを表示したいのですが・・・

"abc" をパラメータとして受け取った場合、
['abc', 'Abc', 'aBc', 'abC', 'ABc', 'AbC', 'aBC', 'ABC']

というリストを作成し、表示する。
という単機能な関数を作りたいのですが、どのようにしたら良いかわからず困っています。


というわけでこんなでどうでしょう!?

def func(s, i=0):
  if len(s) == i: return [s]

  return func(s[0:i]+s[i:].lower(), i+1) + func(s[0:i]+s[i:].upper(), i+1)

print func("abc")

Pythonの特徴、感想

インデントでブロックを表現

好みが分かれるところだけど、すっきりしたもの好きなので個人的にはいいと思う。
なによりインデントの深いダラダラしたコードを書くとメチャメチャ読みづらくなるので、自然とそういうコードが減るんじゃなかろうか。

配列を切り貼りする感覚がおもしろい(上のコードは配列じゃなくて文字列だけど)
>>> a=[1,2,3,4,5]
>>> a
[1,2,3,4,5]
>>> a[1:3]
[2, 3]
>>> a[3:]
[4, 5]
>>> a[1:3]=[7]
>>> a
[1, 7, 4, 5]
>>> a[:0]=[0]
>>> a
[0, 1, 7, 4, 5]
>>> a[:]=[]
>>> a
[]
ちょっと中途半端なオブジェクト指向

len(arr)はググらないとわからなかった。てっきりarr.length()かと。このへんはMatzほどのこだわりがないようで残念。
効率上しかたないと思いつつもJavaの全てのプリミティブ型でオーバーロードされたsort関数の定義とかを見るとなえてしまう人なので。

3項演算子がない

上の関数はちょっとロジックが見えづらい。if,elseにしたほうがいいか。
ほんとはこんな感じに書きたかった。

def func(s, i=0):
  return len(s)==i ? [s] : func(...lower...) + func(...upper...)