開発環境
- 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 コメント:
コメントを投稿