So-net無料ブログ作成
検索選択

動的型言語と言っても [Python]

Perl/PHP/Python は、「動的型言語」で「型がない」と言われることもあるが、
少なくとも Python は Perl/PHP と違って、変数に入っている値がどんな型かは
明確に区別していて、Perl や PHP のように "5" / "2" の結果が 2.5 になったりしない。

>>> a = 5
>>> b = 2
>>> print a/b
2
>>> a = 5.0
>>> print a/b
2.5
>>> a = '5'
>>> print a/b
Traceback (most recent call last):
  File "", line 1, in ?
TypeError: unsupported operand type(s) for /: 'str' and 'int'
>>>
型を指定する宣言文がないので、C/C++ のように実行前に静的型チェックでバグを防ぐ っていうことはできないけど、テスト実行時に違う型(浮動小数点と整数の間は除く) の間での演算で例外が発生すれば十分な場合が多い。 以前に「Perl と PHP だけは無理です」と書いた。 http://blog.so-net.ne.jp/nakagami/2005-01-14 その時は具体的な原因は分かってなかったが、最近、ここらへんの挙動の差に原因があることに気付いた。 どうしてみんな、Perl/PHP と Python には、こういう違いがあることは指摘しないで、 (別に、どっちのほうが優れているって事を言っているわけではない) やれインデントが気持ち悪いの CPAN がどうの、日本語のドキュメントがどうのってばっかり言うんだろう。 ちなみに、VBScript では
MsgBox "5" / "2"
で 2.5 と表示され、Perl/PHP ライクな挙動になっている。 どおりで、使っている割には馴染めないと思った。 Perl や PHP で、アプリケーションをバリバリ書いたり、フレームワークを作ったりする人って、皮肉でなく天才だと思う。
nice!(0)  コメント(7)  トラックバック(1) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 7

ぶらぼたん

なんかRSSでpre-formatされてないから情報が劣化してるお。Web2.0非対応なのかしらんwww
by ぶらぼたん (2005-12-13 10:13) 

nakagami

>ぶらぼたん
pre タグを含むとレイアウトが崩れちゃうのもふくめて so-net blog に言ってください
by nakagami (2005-12-14 09:19) 

nakagami

JavaScript だと
2 + "2" が "22" になるらしい・・・恐ろしい
by nakagami (2005-12-19 17:31) 

lnznt

Python は OOP 言語、Perl/PHP は手続き型言語という違いが大きいと思います。(Perl/PHP vs. Ruby を引き合いに出しても同じような感じになるのでは?)

> 2 + "2" が "22" になるらしい・・・恐ろしい
JavaScript (プロトタイプベース OOPL) は特殊ですね。
型の概念ひとつ取っても一癖あります。難解です。
by lnznt (2005-12-25 02:01) 

chewganabira

はじめまして。

「釈迦に説法」かとは思いますが、Java でも 2 + "2" は "22" になります。この事実を初めて目撃したときは、動揺しました。+ 演算子のどちらか一方の演算数が String オブジェクトの場合は、加算ではなく文字列の連結になります。上記の例の場合は、2 の型の int のラッパーである Integer クラスの toString が呼び出され、"2"という文字列が生成されます。
by chewganabira (2006-01-14 03:18) 

nakagami

>chewganabira さん
>Java でも 2 + "2" は "22" になります。
うっ、そうでしたっけ。
Java は、ちゃんと使った経験がないんですが、でも Java の場合は
int ival;
と宣言した ival に
ival = 2 + "2";
としても、"22" とは入りませんよねぇ。
Perl や PHP は、整数値を入れてるつもりでも文字列や小数点数になっちゃうのがいやですね
by nakagami (2006-01-14 20:48) 

chewganabira

たしかに
int ival = 2 + "2";
はコンパイル・エラーになります。

String ival = 2 + "2;
は合法です。
Pythonでも却下されるもの(整数+文字列)がJavaで合法だということが、ショックでした。
by chewganabira (2006-01-15 08:24) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 1