381.Pythonのマルとバツ(2)
初回:2024/09/11
Python ネタの、三日坊主の2回目です。
P子「前回は、三週和尚って呼んでって言ってなかった?」※1
とりあえず、マルとバツと言ってますが、まずは『大っ嫌い』な所を上げてみたいと思います。
P子「結局、バツばっかりってことね」
いつも揉めますが、Pythonは人気No1の言語です。お気に入りの人はたくさんいます。そういう人やPythonをバカにしているのではなく、あくまで私の個人的な感性に合わない所があるという事です。前回も書きましたが、最近ではJavaよりPythonで組むことが多くなってきているので、慣れも出てきています。
それでも気に入らない所は気に入らないので、Pythonに代わるPythonくらい素晴らしい言語の登場を待ち望んでいます。
P子「気に入らない所が気に入ってたら、性格破綻してるわよ」
1.Pythonのバツ
1).for 文が気に入らない
Pythonのfor文には、開始、条件、増分 という文法がありません。これが気持ち悪い。指定回数だけ回すとか配列を順番に回す分にはあまり問題はありませんが、これは感性というか慣れというか、ずっと触っていたプログラム言語が、大抵、開始、条件、増分という形式だったからかもしれません。
Python
for i in range(1, 11):
print(i)
Java
for (int i = 0; i < 11; i++) {
System.out.println(i);
P子「Pythonの方が判りやすいし、Javaの場合、拡張for文が導入されるまで、配列やリストのアクセスが難しかったわよ」
2).コンストラクタやmainが気に入らない
コンストラクタが変態です。プログラムの開始の main というのがなく、代わりに変態の文法があります。
そもそも、import したファイルが無条件で実行されるって制御が効きません。しかも、privateとかいう概念もないので危険極まりありません。
def __init__(self):
if __name__ = "__main__"
P子「変態は言い過ぎだけど、特殊な文法よね」
3).from xxxx import yyyy が判りにくい
Pythonで最初につまづいたのが、この文法です。まず、モジュールとパッケージとライブラリという概念が判りにくい。import でモジュールをインポートするんですが、from もモジュールを指定して、関数やクラスをimportします。また、from でパッケージを指定することもできたり、よく判りませんでした。
from xxxx import yyyy
4).クラスの命名規則が不自然
list, dict, tuple, str, set などのクラスが大文字で始まっていないというのが不自然です。これらの単語は変数に使いたくなります。
a = str(123) # a には '123' がセットされる。
str = '4567' # str という変数を間違って使ってしまう。
b = str(123) # 別の箇所で、本来の使い方を行うとエラー
Traceback (most recent call last):
File "
TypeError: 'str' object is not callable
5).数字と文字列の連結が邪魔くさい
javaに慣れていたからという事もあるかも知れませんが、動的型付け言語で型推論しているなら、文字列と数値を連結するのはもっと簡単にしてほしい。
Python
a = 'x' + 1
TypeError: can only concatenate str (not "int") to str
Java
String s = 10 + "才"; → "10才"
String s = 10 + 20 + "才"; → "30才"
String s = "年齢" + 10 + 20; → "年齢1020"
P子「Java も順番を間違えると思い通りにならない場合があるわよ」
6).三項演算子が何となく嫌
Pythonの思想かもしれませんが、無理から if 文を使って三項演算子を定義しなくても良いと思います。まず、式1と式2が離れているのが嫌です。そして、三項演算子を使うという事は、まず判定があって値を選択するというのが、素直なイメージです。
Python
変数 = 式1 if 条件式 else 式2; → 条件成立時に、式1 を実行する。
Java
変数 = 条件式 ? 式1 : 式2; → 条件成立時に、式1 を実行する。
7).辞書のアクセスが気に入らない
辞書に値をセットする方法が2種類あったり、取り出すのと設定するのが同じ構文だったり、取り出せないときの挙動が違ったり、色々と嫌です。
a = {}
a['1'] = 1 # a は {'1': 1} になる
b = a['1'] # b には 1 がセットされる
c = a.get('1') # c には 1 がセットされる
d = a['2'] # エラーになる。
Traceback (most recent call last):
File "
e = a.get('2') # e には None がセットされる
f = a.get('2', 2) # f には 2 がセットされる
g = a['2'] = 2 # g には 2 がセットされ、a は {'1': 1, '2': 2} になる
P子「最後の式は、無理からよね」
8).実行時エラーというのが、ほんとに嫌
間違ったプログラムを書くのが悪いのですが、実行時エラーが嫌です。Javaなら、コンパイル時点で明らかな文法間違いは引っかかりますが、Pythonでは実行するまで気づきません。それも、if の中とかに間違いがある場合、実行するまでエラーが現れません。
a = {}
for i in range(10):
if i > 5:
b[i] = i/2
else:
a[i] = i
print(a[i])
0
1
2
3
4
5
Traceback (most recent call last):
File "
NameError: name 'b' is not defined
9).オブジェクト指向言語ではない
Pythonはオブジェクト指向言語ではないと思っています。というか、オブジェクト指向的なメリットがほとんどありません。一番いけないのが、インターフェースでの設計ができない事です。private がないとか、継承時の super とかstatic とか、変数や関数アクセスがほんとに気に入りません。
オブジェクト指向の定義というのが明確ではないので、ここでの説明は割愛しますが、単に継承出来たりオーバーライド出来ても、安心安全にシステムを組めません。オブジェクト指向のメリットをどこに見出すのかによるのでしょうが、私はPythonがオブジェクト指向だというメリットを見いだせないという事です。
3.まとめ
今回は、この程度にしておきます。
実際、何が我慢出来て、何が我慢できないかという所ですが、細かい所は置いておいて、やはり、8),9) あたりが、どうしても気に入らない所です。なので、お遊びとかチョンプロレベルなら便利でお手軽ですが、本格的に組めと言われると相当注意しないとバグがあちこちに発生してしまいそうです。
とはいうものの、次回は Python のお気に入りの箇所について述べてみたいと思います。
P子「期待しないで待ってるわ」
ほな、さいなら
======= <<注釈>>=======
※1 P子「前回は、三週和尚って呼んでって言ってなかった?」
P子とは、私があこがれているツンデレPythonの仮想女性の心の声です。