PerlやPHPでは文字列を連結する時と数値を足す時では演算子が違うので例えば

$num1 = 10;
$num2 = 20;
print $num1 . $num2."\n";
print $num1 + $num2."\n";

上の例ではそれぞれ

1020
30

と出力される。
では数値と文字列に対してそれぞれの演算子を適用してみる。

$num1 = 10;
$str = "Hello";
print $num1 . $str."\n";
print $num1 + $str."\n";

この場合は

10Hello
10

こんな出力になる。上の方は数値を暗に文字列へと変換してくれる。
下の方は単純に文字列は無視される。
ちなみにPerlではuse warningsしていた場合は下の文では警告が発せられる。
警告が発せられるがエラーとまではいかない。

ではRubyやPythonはどうか?
これらの言語では文字列の連結も数値を足すときも同じ+演算子が使われる。

num = 10
str = "Hello"
print num + str

このコードを実行するとRuby,Python共にエラーになる。原因はもちろんデータの型が違うからだ。
この場合はデータを適切に変換してやる必要がある。Rubyならば

print num.to_s + str

Pythonなら

print `num` + str

とすれば変数numを文字列として扱ってくれる。文字列を数値として扱いたいときは Rubyでは

'10'.to_i

Pythonでは

int('10')

とすればいい。数値として扱えない文字列に対して呼び出すとRubyの場合は0として扱われ、Pythonの場合はエラーになった。
ところでPythonでは通常数値を文字列として扱いたいときは上のようなバッククオートで囲うよりは組み込み関数のstrを呼び出すのが常套手段だろう。
こんな感じで

str(num)

あるいは

repr(num)

こうでもいい。ところが上の例だとstr関数の方は使えなくなってしまっている。
これはstrという変数名に"Hello"という文字列を格納した事によって元々存在していたstr関数を上書きしてしまった為だ。Pythonでは関数オブジェクトもクラスオブジェクトも単なる変数に格納されているだけだと思えばいい。Pythonでは予約語を変数名として使う事は出来ない。例えば

class = "hello"
continue = 1

はいずれもエラーになる。ただし組み込み関数で使われている関数名には新たに代入が出来てしまう。

len = 10
reversed = "hello"

はいずれもOKなのだ。その後len関数とreversed関数は使用できなくなっている。
この事について何の警告もしてくれない。Pythonにはそんな冷たいところがある。
strなんて変数名はいかにも使いそうなので注意したいとこだ。
組み込み関数にどんなものがあるか調べるにはインタラクティブシェルを使って

import __builtin__
dir(__builtin__)

どんな予約語があるか知りたい時は

import keyword
keyword.kwlist

とすればいい。

昔、javascriptを書いてて似たような事で悩んだ事があった。

<form id="form1" action="sample01.php" method="post">
<input type="text" name="name" />
<input type="text" name="age" />
<input name="submit" type="submit" />
</form>

上のコードは通常の使い方でフォームの送信をする時は全く問題ない。
ただしjavascriptを使ってフォーム送信したい時は注意が必要だ。
例えば

var f = document.getElementById('form1');
f.submit()

こんな風に書いてもこのコードは実行されない。
これもPythonの時と同じ考え方だ。f.submitとした時に最初に見つかるオブジェクトはname属性を'submit'としているinputタグなのだ。カッコを付けても"not a function"と怒られてしまう。たしかid属性に'submit'としても同様の結果になった。まあ、注意深くエラーメッセージを見れば分かるんだが・・・。

話が全然違う方に進んでしまったが要はRubyやPythonで数値を文字列として、文字列を数値として扱うにはどうすればいいか、という話。

カテゴリ:

トラックバック(0)

トラックバックURL: http://blog.beanz-net.jp/beanz_mtos/mt-tb.cgi/25

コメントする