web-dev-qa-db-ja.com

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

これは本当に、python詳細を知りたい初心者による理論的な質問です。

Pythonのブロックの最初のステートメントの後にコロンを忘れてしまいます。それらは私が意味するものです:

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

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

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

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

プログラミング言語では、アプリケーションを解析できるようにコンパイルするまでアプリケーションを実行する必要がないことは非常に良い考えなので、コロンは非常に必要です。あなたはそれを落とすことができますが、曖昧さをなくすために他の方法が必要でしょう。

9
Phoshi

Pythonが別の世界で設計されていた場合、コロンは文法上本当に必要ではありませんが、言語デザイナーがコロンを必要としないことを考えているかもしれません。Cobraのような言語は実際にこれを行います。

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

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

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

if a == b
    print(a)

versus

if a == b:
    print(a)

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

もう1つのマイナーな理由は、コロンを使用すると、構文を強調表示できるエディターが簡単になることです。コロンを探して、プログラムテキストのより複雑な解析を行わなくても、インデントを増やす必要があるかどうかを判断できます。

FAQでも言及されているように、コロンを使用すると、言語を完全に解析しなくてもpythonコードを処理しやすくなります。pythonコンパイラー。コロンが不要な場合や、あいまいでない場合にオプションにした場合は、コロンなしで実行できます。

14
Lie Ryan

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

Guido van Rossum(Pythonの作成者)にはしばらくPython履歴ブログがあります。コロンは[〜#〜] abc [〜#〜]、Pythonの多くの機能のソース。

「カリンデュワー、インデントとコロン」に関するこのブログ投稿 で、Guidoは次のように書いています。

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

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

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

コロンで終わる行の後にインデントを自動的に挿入できるeditorsのためであると90年代にGuidoが指摘したことも覚えています。しかし、その出典はまだわかりません。

10
RemcoGerlich

Cobraプログラミング言語 の構文はPythonの影響を強く受けており、コロンを使用しないため、厳密に必要なわけではないようです。ただし、コロンをだけ削除するだけでは不十分で、構文に他の変更が必要です。たとえば、 このコードの一部 私の1つから toyプロジェクト を参照してください。

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)

コブラの以前のバージョンでは、コロンをオプションにしたと思います。インデントまたはコロン、あるいはその両方を使用できます。 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

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

確実に確認する唯一の方法は、コロンの有無にかかわらず構文を形式化し、そのあいまいさがないことを証明することです。

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

4
Jörg W Mittag