2013年3月6日水曜日

開発環境

『初めての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 コメント:

コメントを投稿