見出し画像

「;」(セミコロン)が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の言語仕様であった


この記事が気に入ったらサポートをしてみませんか?