Pythonブロックのコロンは技術的に必要ですか?


19

これは実際には、Pythonの初心者がもっと理解したいという理論上の質問です。

Pythonのブロック初期ステートメントの後、コロンを忘れ続けます。それらは私が意味するものです:

  • for <variable> in <sequence>:
  • if <blah blah>:

私の考えでは、忘れがちな理由の1つは、それらが事実上の暗黙的であるということです。コロンであるかどうかにかかわらず、ステートメントはその行で終わります。

私の質問-私はPythonの構文がどのように機能するかを学ぶために尋ねます-コロンが本当に不要かどうかです?コロンが不要になるようにPython構文を変更しましたが、何かが壊れるでしょうか?それはいくつかのステートメントを曖昧にするか不可能にするでしょうか?


4
構文を機能させるためにコロンが必要かどうかという質問を理解していないと思います。また、あなたの答えが何であれ、説明を含めるべきです。
トマーシュザト-復活のモニカ

おそらく、質問の一部を言い換えることができますか。そうすれば、この問題についての洞察から恩恵を受けることができます。あなたは最高の裁判官になるだろう、私はあなたの質問の意図について無知だと思う。インタープリター/コンパイラーのパーサーのレベルでそれを意味しますか?本当にありがとう。
BHANシュル

それ以上の言い回しはわかりません。あなたはそれがもはや後にコロンを必要とするように、すべてのPythonの構文を変更することができなかった場合は私の質問は基本的に、あるifelsewhileのように。あなたがそれをした場合、Pythonはあいまいさなく使用できる言語のままですか?
トマーシュザト-復活モニカ

とった!これは、Pythonの構文設計の決定に関する問題です。申し訳ありませんが、誤解されました。説明してくれてありがとう。
バンシュール

推測。これは、実際にはインタープリター/パーサーが改行を検出するのが難しいか、読みやすくするためのものです。LUA if .. then .. endでは、1行で記述できます。そのため、ここではpython thenは2つのa :と必須の改行で置き換えられます。これらの1つは冗長のようです。
BHANシュル

回答:


9

はい、コロンは特定の構造を明確にするために必要です。たとえば、if x - y < z: pass。コロンがなければ、x、y、およびzが何であるかのコンテキストを知らずに、これをどのように解析するかを決定できません。if x: -y < z...xがブール値の場合if x - y < z:は有効、それ以外の場合は有効です。

プログラミング言語では、解析するためにコンパイルしている時点までアプリケーションを実行する必要がないことが非常に良い考えなので、コロンが非常に必要です。落とすこともできますが、明確にするためには他の方法が必要です。


1
待って、同じ行のコロンの後にステートメントを置くことができますか?許可されていないと確信していました。
トマーシュザト-復活のモニカ

1
許可されますが、その後に改行が必要です。
-Phoshi

まだ少し混乱しています。これは許可さif condition: print("Condition passed")\nれていますか:許可されていますか?\nprint文の後に新しい行を象徴しています。
トマーシュザト-復活モニカ

確かに、試してみてください。
-RemcoGerlich

1
@TomasZato:はい、コロンの後に任意のステートメントを含めることができます。ブロックがすぐに終了するため、主にブロックが小さなライナーである場合に役立ちます。
ライライアン

14

コロンは文法的に本当に必要ではありません。Pythonが別の世界で設計されていた場合、言語デザイナーがコロンを必要とすることを決定しない可能性が非常に考えられます。そして実際、コブラのような言語はこれを行います。

Pythonでコロンが必要な主な理由は、人間が読みやすいことです。Python FAQから引用するには:

if / while / def / classステートメントにコロンが必要なのはなぜですか?

コロンは、主に可読性を高めるために必要です(実験的なABC言語の結果の1つ)。このことを考慮:

if a == b
    print(a)

if a == b:
    print(a)

2番目の方が少し読みやすいことに注意してください。さらに、このFAQの回答の例がコロンによってどのように設定されているかに注目してください。英語の標準的な使用法です。

もう1つの小さな理由は、コロンを使用すると、エディターで構文が強調表示されやすくなるためです。プログラムテキストのより複雑な解析を行う代わりに、インデントを増やす必要があるタイミングを決定するためにコロンを探すことができます。

FAQにも記載されているように、コロンを使用すると、言語を完全に解析せずにPythonコードを簡単に処理できます。pythonコンパイラを含む完全なパーサーを備えたテキストプロセッサは、コロンが不要な場合や、明確な場合にオプションにした場合はコロンなしで実行できます。


3
「2番目の方が少し読みやすいことに注意してください。」最初の方が読みやすいと思います。ノイズが少ない。
user76284

10

コンピューターではなく、人間にとって必要です。

Guido van Rossum(Pythonの作成者)には、しばらくの間、Pythonの歴史に関するブログがありました。コロンは、Pythonの多くの機能のソースであるABCで導入されました。

では、「カリンデュワー、インデントやコロン」で、このブログの記事、グイドは書いています:

そしてここで、ランバートの要求に応じて言い換えます。

1978年、ジャブロンナ(ポーランド)の大邸宅でのデザインセッションで、ロバートデュワー、ピーターキング、ジャックシュワルツ、ランバートは、各選択肢で書かれた(バギー)バブルソートの実装を比較することで、Bのさまざまな代替構文を比較していました。彼らは同意できなかったので、ロバート・デュワーの妻は彼女の部屋から呼ばれ、現代のパリがヘラ、アテナ、アフロディーテの美しさを比較するように頼んだように、彼女の意見を求めた。しかし、最初のバージョンが彼女に説明された後、彼女は次のように述べました。「あなたは、「FOR i ...」という行で、その行だけでなく、後続の行に対しても行わなければならないということですか? !」そして、ここで科学者たちは、その行の終わりにコロンがあった場合、誤解が避けられたであろうことに気づきました。

(ここでのBは、ABCにつながった一連のプロトタイプ言語B0、B1、...です。Cの前身であるのはB言語ではありません)。

また、90年代にGuidoが編集者の利益のためであり、コロンで終わる行の後に自動的にインデントを挿入できることを指摘したことを覚えています。しかし、私はまだそのソースを見つけていません。


4

コブラのプログラミング言語の構文は重くPythonのに触発され、厳密には必要ではないようですので、それは、離れてコロンとしています。ただし、コロンを削除するだけでは十分ではなく、必要な構文に他の変更があります。たとえば、私のおもちゃプロジェクトの 1 つからの次のコードを参照してください。

kons  = lambda hd, tl: lambda x: hd if x else tl
virst = lambda l: l(True )
rrest = lambda l: l(False)

パラメータリストから本文を区切るコロンがない場合、インデントを使用する必要があります。

kons  = lambda hd, tl
    lambda x
        hd if x else tl

virst = lambda l
    l(True )

rrest = lambda l
    l(False)

Cobraの以前のバージョンではコロンをオプションにしたと思います。インデントまたはコロン、あるいはその両方を使用できます。Rubyでの動作と同様に、制御式のさまざまな部分を区切るキーワードがありますが、式の区切り文字(セミコロンまたは改行)も使用できます。

# idiomatic
while true do puts "I am awesome" end
#          ↑↑

# non-idiomatic, but legal
while true; puts "I am awesome" end
#         ↑

# non-idiomatic, but legal
while true
puts "I am awesome" end

# idiomatic
while true
  puts "I am awesome"
end

現在のバージョンのCobraでは、コンマを使用できます。

if x
    y

として書くことができます

if x, y

制御式または定義のさまざまな部分を分離する何らかの方法が必要です。Pythonでは、これがコロンです。コロンを削除する場合は、強制インデントなど、別のものに置き換える必要があります。コロンを削除するだけでは機能しません。

絶対に確実にする唯一の方法は、コロンを使用して、または使用せずに構文を形式化し、その曖昧さを証明することです。

ただし、Zen of Pythonの格言の1つは「明示的であると暗黙的である」ので、コロンを使用したブロックの明示的な記述はPythonの一般的な哲学に適合するようです。デザインと歴史FAQでは、また、この決定はPythonの前身、ABCから経験的証拠に基づいていることを言及しています。


3
さて、最後の段落で説明した哲学では、すべての行の終わりにコロンを必要とする可能性があります。明示的vs暗黙的は、明示的に実際に情報を追加する場合にのみ意味があります(たとえば、暗黙的なバリアントがあいまいです)。それが私の質問のポイントでした。
トマーシュザト-復活モニカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.