開発環境
- OS X Lion - Apple(OS)
- BBEdit - Bare Bones Software, Inc.(Text Editor)
- プログラミング言語: Python
『初めてのPython 第3版』(Mark Lutz 著、夏目 大 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-393-7) のIV部(関数)のまとめ演習3.(引数の数を増やす(減らす))を解いてみる。
その他参考書籍
3.(引数の数を増やす(減らす))
コード(BBEdit)
sample.py
#!/usr/bin/env python3.3 #-*- coding: utf-8 -*- def adder(*args): res = args[0] for x in args[1:]: res += x return res # 引数無しだとエラーになる try: print(adder()) except Exception as err: print(err) print(adder("a")) print(adder("a","b")) print(adder("a","b","c")) print(adder(1.2)) print(adder(1.2, 2.3)) print(adder(1.2, 2.3,3.4)) print(adder([1,2])) print(adder([1,2],[1,2,3])) # 加算演算子「+」が使えない異なる型の引数を指定するとエラーになる try: print(adder("a",1)) except Exception as err: print(err) print(adder(1.2,1)) # intとfloatは「+」を使える # ディクショナリ同士は「+」が使えないので例外が発生する try: print(adder({'a':1},{'b':2})) except Exception as err: print(err)
入出力結果(Terminal)
$ ./sample.py tuple index out of range a ab abc 1.2 3.5 6.9 [1, 2] [1, 2, 1, 2, 3] Can't convert 'int' object to str implicitly 2.2 unsupported operand type(s) for +=: 'dict' and 'dict' $
ちなみにJavaScriptの場合。
コード(BBEdit)
var adder = function ( ) { var result = arguments[0], i, max; for (i = 1, max = arguments.length; i < max; i += 1) { result += arguments[i]; } return result; }, result = ""; // JavaScriptの場合は引数を指定しなくてもPythonのように例外にはならず // undefinedになる try{ result += adder() + "\n" } catch (e) { result += e + "\n"; } // 配列同士に加算演算子「+」を使うと、文字列に変換してその連結になるみたい result += [adder("a"), adder("a", "b"), adder("a", "b","c"), adder(1.2), adder(1.2, 2.3), adder(1.2, 2.3, 3.4), adder([1,2]), adder([1,2],[1,2,3])].join("\n") + "\n"; // 加算演算子「+」が使えない異なる型の引数を指定するとエラーになる // ということで異なる方の引数を指定した場合についてはだいたいPythonと同じ挙動っぽくなる(?) // ただし、JavaScriptでは加算演算子が使える異なる型はPythonとは違う。(数値と文字列でも「+」を // 使えたりする) result += [adder(10, "a"), adder("a", 10)].join("\n") + "\n"; // これはエラーになるかと思ったらならなかった // 配列と同様に、文字列(ただし連想配列は定義の見た目そのままではなく[object Object]という // 文字列に変換される)に変換してから加算演算子「+」を適用しているみたい try{ result += adder({"a":1,"b":2}, {"c":3,"d":4}); } catch (e) { result += e + "\n"; } // 蛇足 // これは大丈夫 1 + 2; // なのにこれは例外が発生する。 // {'a':1,'b':2} + {'c':3,'d':4}; // ブロック開始の「{」が優先されるて、'a'がラベルと解釈されて // そして文字列「'a'」はラベルとして有効ではないからみたい // っていう解釈でいいのかな。。(そういうJavaScript自体が仕様なのかな) $('#pre0').text(result);
0 コメント:
コメントを投稿