アカウント名:
パスワード:
print "0x" + hex(x) # hex()は整数の十六進表記文字列を返す組み込みメソッドx = 128
を実行すると、1行目でxが未定義というエラーになります。これは納得できますよね。
print f(128)f = lambda x: "0x" + hex(x) # lambdaで無名の関数オブジェクトを生成
を実行すると、1行目でfが未定義というエラーになります。これも納得できますよね。
defで関数を定義した
print f(128)def f(x): return "0x" + hex(x)
も同様に、1行目でfが未定義というエラーになります。それだけのことです。
あーー、これは困ったな。実は最初の1つと後の2つは違う事を言っています。
print "0x" + hex(x) # hex()は整数の十六進表記文字列を返す組み込みメソッドx = 128を実行すると、1行目でxが未定義というエラーになります。これは納得できますよね。
えー、この段階ですでに「納得できない」だったりします。あ、いや、Pythonがそういう言語だ、と言うのは判りました。でも、それは必ずそうならざるを得ない、と言うものではない。
例えば Perl ですと、(x ではなく $x と書く必要がありますし、hex()は変換方向が逆向きなんで sprintf を使いますが):
print "0x" . sprintf "%lx\n", $x; # hex()は整数の十六進表記文字列を返す組み込みメソッド$x = 128;
関数宣言に関する前方参照不能性は、「Pythonが1パスで実行可能な文法」を採用していると言う事です。しかし、変数は「前方参照不能」なのではなく「書き込み参照以外、変数生成対象としない」と言う事です。と言う事は、当然実際にはあと2通りのパターンのプログラミング言語があり得る事になります。
Cのような関数宣言はないんですよね。関数定義はある。しかるに、def fはfという変数にlambda式を代入するのと等価であると。そしてそれは変数と同じで後で別の内容をbindすることができます。なので、関数と変数のscopeは同じで、どちらも、書き込み参照・定義によってのみ生成されると統一的に理解するべきです。f(128)で生じるエラーがname 'f' is not definedであってfunction f is not definedとかいわれないことにも注目。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲは一日にしてならず -- アレゲ研究家
前方参照はできません (スコア:1)
を実行すると、1行目でxが未定義というエラーになります。これは納得できますよね。
を実行すると、1行目でfが未定義というエラーになります。これも納得できますよね。
defで関数を定義した
も同様に、1行目でfが未定義というエラーになります。それだけのことです。
Re: (スコア:1)
あーー、これは困ったな。実は最初の1つと後の2つは違う事を言っています。
えー、この段階ですでに「納得できない」だったりします。あ、いや、Pythonがそういう言語だ、と言うのは判りました。でも、それは必ずそうならざるを得ない、と言うものではない。
例えば Perl ですと、(x ではなく $x と書く必要がありますし、hex()は変換方向が逆向きなんで sprintf を使いますが):
fjの教祖様
関数宣言なんてない (スコア:1)
関数宣言に関する前方参照不能性は、「Pythonが1パスで実行可能な文法」を採用していると言う事です。
しかし、変数は「前方参照不能」なのではなく「書き込み参照以外、変数生成対象としない」と言う事です。
と言う事は、当然実際にはあと2通りのパターンのプログラミング言語があり得る事になります。
Cのような関数宣言はないんですよね。
関数定義はある。
しかるに、def fはfという変数にlambda式を代入するのと等価であると。
そしてそれは変数と同じで後で別の内容をbindすることができます。
なので、関数と変数のscopeは同じで、どちらも、書き込み参照・定義によってのみ生成される
と統一的に理解するべきです。
f(128)で生じるエラーがname 'f' is not definedであって
function f is not definedとかいわれないことにも注目。