2011-01-24 16 views
10

私はその意味や定義についていくらか混乱しています。Pythonの式とは何ですか?

新しいデータ値を生成または計算するコードはありませんか? (彼の本にZelleが言っています)

それから、文字列データ型が式なのか疑問です。

もしそうなら、引数が文字列のときにはeval()は何をしますか?

Zelleの本ではeval(<string>)stringを式として評価していますが、stringがすでに式である場合はどういう意味ですか?

stringが式でない場合は、printの後にはどうなりますか?

+1

関連(しかし**ない**正確な複製):ここでbreak文がだ[式と文との違いは何ですか?](http://stackoverflow.com/questions/4728073/ python-what-is-the-difference-of-expression-and-a-statement) –

答えて

17

は、数字、文字列、またはクラスのインスタンスのようなものです。を表します。どの値も式です!

何かを実行するものはすべてです。変数または関数呼び出しへの代入はすべてステートメントです。式内のそのステートメントに含まれる値。

foo = "hello"は、式「hello」の値にfooを割り当てるステートメントです。コード"hello"は単純な式なので、実際には何も評価されないので、fooは"hello "に割り当てられます。

evalは、Python式であるかのように文字列を評価しますが、Evalは式を引数として取りますが、特別なことはありません。これは以降のすべての値が式です。「evalは引数として値をとります」とはまったく同じことを言っていますが、はるかに簡単です:D

eval("2+2")は、文字列"2+2"を関数に渡します。文字列が既に表現である場合、関数は4

Zelleの著書がeval(<string>)が表現として文字列を評価すると言うに出てくる文字列に含まれる式を、評価し、それが正確に何を意味するのでしょうか?

任意の文字列は値を表すため、式です。しかし、文字列内にあるものは、それが式であることに全く影響しません。その値なら、その式。 "evalによって式として評価される"とき、文字列内の文字はあたかもPython式であるかのように実行されます。

+2

'eval'文ができない点を除いて、良い説明です:Python 2.xでは' eval( "print hello") 'を試してください。 –

+6

関数呼び出しはPythonの式です。任意の式は、ステートメントでもあり、「式ステートメント」です。上記の関連する質問へのリンクも参照してください。 –

+0

@Sven私は簡単にするために、表現の別の定義を使用しています。私はその情報を残しておくことは余分な複雑さを避けると考えていました。特に文があまり広く使われていないためです。 :D –

1

文字列は式です。式は「値」を持つものです。 3、 'Hello world'、1 + 1、math.sqrt(9)などと同じです。関数名も式です。

eval()は、与えられた式の値を文字列として返します。 eval( '1 + 1')と言うと、2を返します。したがって、1 + 1と書くだけで返されるものを返します。

+1

それに加えて:値を返すすべてのメソッド/関数は式としてもカウントされます。したがって、eval自体は、たとえば、よく表現されています。 – poke

+0

@poke:これは誤解を招くようなものです。 _Every_メソッド/関数は値を返します。明示的に何も返さなければ、暗黙的に 'None'を返します。 (もちろん実際には、特定の関数呼び出しは 'sys.exit'を送出し、無限ループなどで永遠に戻りますが、関数呼び出し式は式ではなく、' ' 1/0'。) – abarnert

+0

@abarnert今は私が当時の意味を言いにくいですが、基本的な静的な演算子だけでなく、その間にあるすべてのものが式として数えられることを意味していたと思います。 – poke

2

Pythonの独自のスクリプトパーサがどのように動作するかを考えれば、「表現」は少し混乱することになります。 standard documentationは式と "アトム"を区別しますが、その用語をかなり限定的にしています(5.11のBNF図はの表現であることを意味します)はラムダ型でも条件式でもかまいません。私のBNFは錆びています。)

原子は、一方、@ kynnysmattoは「値を持っている」と言っているようです。たぶん「カッコで囲むことができ、括弧の外側から対応する値と区別できないものは、原子のより良い定義かもしれません。

Zelleが、例えば、以下の文脈で表現を論じるとき。 evalの(fooが)、私は彼が意味を考える:

  • fooが識別子、原子
  • の種類があるが、fooが何か
  • この「何か」の識別子ある紐状でありますおそらく実際の文字列
  • eval()の内部にあるこの文字列は、Pythonの "式"を構成します。つまり、Pythonが解析して意味をなすことができます。

tl; dr: "式"という用語は、コード解析の観点から最もよく理解できます。あなた自身をプログラムするときには、「原子」という言葉を考えるのがよいでしょう。

2

TL; DR:式は値と演算子の組み合わせであり、常に1つの値まで評価します。ステートメントは、他のすべての命令です。いくつかの文は式を含んでいます。

発現が常に単一の値まで評価値と演算子を組み合わせたことの指示です。例えば

、これは式である:

>>> 2 + 2 

2Sが整数値であり、+は、数学的演算子です。表現として

>>> 4 

私が言うとき、それは単一の値4.

まで評価されます。この式は技術的には、これも表現され、単一の整数値に4

をダウン評価します値や演算子は、これは数学の問題に限定されない:

>>> 'You will be ' + str(int(myAge) + 1) + ' next year.' 

myAge変数は内部の値を評価します。関数呼び出しint('5')は、関数の戻り値、5を評価します。これらの文字列のすべての値は、+演算子(この場合は文字列連結演算子)と組み合わされています。この場合、文字列値まで評価されないPythonの命令である声明、と'You will be 6 next year.'

コントラストこれを:どんなに表現がどのように大きな、それは単一値まで評価されていません値。 Pythonの文は、式以外のものです。ここで代入文です:

>>> spam = 2 + 2 

はここにif文です:

>>> if spam == 4: 

は、ここで無限ループのためのwhile文です:これらのステートメントの両方が表現が含まれていることを

>>> while True: 

注意(Trueでも、単一値Trueまで評価されます)。しかし、すべてのステートメントで式を使用するわけではありません。

>>> break 
関連する問題