ちょうどよさげな問題なので初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...)