「;」(セミコロン)がPythonの言語仕様だったという話
前にこちらの記事でね、こう言ったのね。
Pythonは「;」を使わないから、そんな文字を入力しても構文エラーと言われるだけ
ところがね、このコードがエラーにならへんの。
def is_prime(n):
if (n == 2):
return True;
if ((n & 0x01) == 0):
return False;
for i in range(3, n//2):
if (n % i) == 0:
return False;
return True;
問題はココね。この赤い丸のところ。
セミコロンだらけね。
そもそもは、これをC言語に移植しようとした。
まずはそのままコピーした。
それから「:」を消した。
一文だからわざわざ { } もいらんかな。
でも、「;」がいるな。
そう思って「;」を付けようとした。
そしたら既に付いていた
え?
あれ?
あ!
やっと気付いた。
Pythonのコードに「;」を付けていたのだ
もう、一人でおかしくって😅😆🤣
無意識に付けてたわけか。
セミコロン「;」を。
すごい。
いや、感心している場合ではない。
習慣とはオソロシイ…………。
兎にも角にも、「;」を付けても怒られないわけで。
ちょっと、いろいろ試してみた。
Pythonをインタラクティブモードで立ち上げて。
% python
Python 3.12.7 (main, Oct 6 2024, 15:06:14) [Clang 18.0.2 (https://android.googlesource.com/toolchain/llvm-project d8003a456 on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
まずは普通の式。これはOK(当たり前)。
>>> a=0
>>>
末尾にセミコロン。これもOK…………らしい。
>>> a=0;
>>>
末尾にセミコロンでなくコロン。これはダメ。
>>> a=0:
File "<stdin>", line 1
a=0:
^
SyntaxError: invalid syntax
>>>
末尾「!」 ダメ。
>>> a=0!
File "<stdin>", line 1
a=0!
^
SyntaxError: invalid syntax
>>>
末尾「?」 ダメ。
>>> a=0?
File "<stdin>", line 1
a=0?
^
SyntaxError: invalid syntax
>>>
末尾「*」 ダメ。
ん?
なんか「^」の位置が少しズレているような。
あ。演算子「*」やから0と掛け算する数値がないと怒っているのか。
>>> a=0*
File "<stdin>", line 1
a=0*
^
SyntaxError: invalid syntax
>>>
末尾「"」 ダメ。
>>> a=0"
File "<stdin>", line 1
a=0"
^
SyntaxError: unterminated string literal (detected at line 1)
>>>
末尾「'」 ダメ。
>>> a=0'
File "<stdin>", line 1
a=0'
^
SyntaxError: unterminated string literal (detected at line 1)
>>>
末尾「+」 ダメ。
これも演算子「+」だな。
0と足し算する数値がないから怒る。
>>> a=0+
File "<stdin>", line 1
a=0+
^
SyntaxError: invalid syntax
>>>
末尾「-」 ダメ。
同じく演算子「-」。
>>> a=0-
File "<stdin>", line 1
a=0-
^
SyntaxError: invalid syntax
>>>
末尾「$」 ダメ。
>>> a=0$
File "<stdin>", line 1
a=0$
^
SyntaxError: invalid syntax
>>>
末尾「)」 ダメ。
>>> a=0)
File "<stdin>", line 1
a=0)
^
SyntaxError: unmatched ')'
>>>
末尾「()」 ダメ。
ん。
怒られ方が違う。
あ。「0」という関数は呼び出せないと言ってるのか。「()」は関数呼び出しと判断したわけね。
>>> a=0()
<stdin>:1: SyntaxWarning: 'int' object is not callable; perhaps you missed a comma?
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>>
末尾「/」 ダメ。
これも除算演算子「/」。
それに続く数字がなくって怒ってる。
>>> a=0/
File "<stdin>", line 1
a=0/
^
SyntaxError: invalid syntax
>>>
末尾「.」 ダメ。
あ、いや、ダメちゃう?
あ。小数点と思ったのか。
>>> a=0.
>>>
ということは、「a」の型は…………。
>>> a=0.
>>>
>>> type(a)
<class 'float'>
>>>
なるほど。「int」型ではなくて、「float」型ね。
末尾「,」 ダメ…………じゃない?
>>> a=0,
>>>
「a」は、いったい何?
>>> a=0,
>>>
>>> type(a)
<class 'tuple'>
>>>
「tuple」(~_~;)
「;」だけも、ダメ。
>>> ;
File "<stdin>", line 1
;
^
SyntaxError: invalid syntax
>>>
やっぱり、ダメか。
ここまで来てようやく気付く。
もしかして、「;」で区切って複数文を書けたりする?
まさか…………ね。
>>> a=2;b=3;
>>>
アッチョンプリケ!😱
私、なんか、根本的に勘違いしていたのか?
>>> a=2;b=3;
>>>
>>> print(a);print(b);
2
3
>>>
…………。
ここまで来て、ようやくPythonドキュメントへ走っていった(実際には走ってないが、気持ち的には文字通り脱兎のごとくだった)。
「;」がデリミタ!😱
マジか。
じゃあ次は「Full Grammar」へと、今度はよろめくように這々の体でたどり着く。
めったに見ぃひんよな、「Grammar」なんか…………。
「;」を検索。
simple_stmts:
| simple_stmt !';' NEWLINE # Not needed, there for speedup
| ';'.simple_stmt+ [';'] NEWLINE
ん?
んんん?
頼む。もう少しわかりやすく書いてくれ…orz。
いや、これがわかりやすいのか。
上の方に「Grammar Syntax」があるのでそれを読みつつ解読する。
ぐちゃぐちゃ読んでできた解釈は次の通り。
sImple statement は次のいずれかで構成される
「;」(セミコロン)なしで新しい行に書く
sImple statement
sImple statement
「;」(セミコロン)で区切って1つ以上を書く
sImple statement; sImple statement;
そ、そうだったのか。
もう、てっきり、
1行に1文、1行に複数文はなし!
そう思い込んでいた。
重いコンダラの世界か😑。
「;」(セミコロン)はPythonの言語仕様であった
この記事が気に入ったらサポートをしてみませんか?