• 検索結果がありません。

listings-ext

N/A
N/A
Protected

Academic year: 2021

シェア "listings-ext"

Copied!
19
0
0

読み込み中.... (全文を見る)

全文

(1)

ネットワークコンピューティング実習

(6)

プログラミング言語

Python (2)

(

文、スコープ、サブルーチン

)

大崎 博之

関西学院大学 理工学部 情報科学科

[email protected]

目 次

5 プログラミング言語 Python (2) 1 5.1 文(statement). . . . 1 5.2 スコープ(scope) . . . . 11 5.3 サブルーチン(subroutine) . . . . 14

5

プログラミング言語

Python (2)

以下、Python の言語仕様を、文・スコープ・サブルーチンの観点で説明 する。

5.1

(statement)

Python のプログラムとは、Python インタープリタに対する命令の列であ る。基本的に、Python はプログラム中に含まれる命令を上から下へと順番に

(2)

実行する。プログラムにおける命令の最小単位は、プログラミング言語の世 界では「文(statement)」 と呼ばれる。言い替えれば、Python は、プログラ ム中に含まれる文を上から下へと順番に実行する。

文には、単純文(simple statement) と複合文 (compound statement) の 2 種類がある。 単純文とは、名前の通り単純な文であり、単体の式(expression) や代入文 (assignment statement) が相当する。例えば、 1 >>> n = 123 2 >>> n += 1 3 >>> s = ’ Hello , World ! ’ 4 >>> p r i n t ( s ) 5 Hello , World ! などが単純文である1。行末の改行が文の終わりであることをあらわしてい る。Python は、この種のプログラミング言語としてはめずらしく、自由形式 (free-form) のプログラミング言語では ない 。 C や Java を始めとする大部分のプログラミング言語は自由形式であり、ホ ワイトスペース(whitespace) (空白・タブ・改行) は単なる区切文字の意味し か持たない。自由形式のプログラミング言語では、ホワイトスペースを用いて 各行のインデント(字下げ) が行われるのが普通である。しかし、これらのホ ワイトスペースは単に人間の可読性を向上させるためのものであって、プロ グラミング言語としてはホワイトスペースの多い/少ないは意味を持たない。 Python では、文は基本的に改行で終端される。また、ホワイトスペー スによるインデント (字下げ) が意味を持っており、適切にインデントを 行わなければならない 。 例えば、以下のようなプログラムでは、行頭のインデントがすべて意味を 持っている(ブロックの深さを表している)。 1 >>> n = 10 2 >>> while n > 0 : 1先頭の»> は Python を対話モードで起動した時のプロンプトである。プログラムの一 部ではないことに注意する。

(3)

3 . . . i f n % 2 == 0 : 4 . . . p r i n t( n ) 5 . . . n −= 1 6 . . . 7 10 8 8 9 6 10 4 11 2 インデントが規則的であれば、必ずしもタブによるインデントである必要は なく、例えば、 1 >>> n = 10 2 >>> while n > 0 : 3 . . . i f n % 2 == 0 : 4 . . . p r i n t( n ) 5 . . . n −= 1 6 . . . 7 10 8 8 9 6 10 4 11 2 のように空白2 つのインデントでも構わない。しかし、他の自由形式のプロ グラミング言語とは異なり、以下のように書くことはできない。 1 >>> n = 10 2 >>> while n > 0 : i f n % 2 == 0 : p r i n t ( n ) 3 F i l e " < s t d i n > " , l i n e 1 4 while n > 0 : i f n % 2 == 0 : p r i n t ( n ) 5 ^ 6 S y n t a x E r r o r : i n v a l i d syntax Python は自由形式を採用しなかったため、結果として、(1) C や Java 等で 必要であった行末のセミコロン(;) が不要となり、(2) 首尾一貫したインデン

(4)

トが必須であるためプログラムの可読性が向上している。 なお、単純文であれば、セミコロンで区切ることにより複数の単純文を一 行に書くことは可能である (が、可読性が低下するため普通こういう書き方 はしない)。 1 >>> n = 1 2 3 ; m = 4 5 6 ; p r i n t ( n ) ; p r i n t (m) 2 123 3 456 複合文とは、単純文よりも複雑な文であり、主にプログラムのフロー(flow) を制御するために利用される。Python にはさまざまな複合文があるが、それ らの中でも特によく使われるものをいくつか紹介しよう。

まず、条件分岐(conditional brach) の中でも 2 分岐 (two-way branch) を 記述するためのif 文である。 if EXPR: STATEMENT : if EXPR: STATEMENT : else: STATEMENT : if EXPR: STATEMENT : elif EXPR: STATEMENT :

(5)

else:

STATEMENT :

ここでEXPR は「式」であり、STATEMENT は「文 (statement)」である2。 if 文の例を以下に示そう。 1 i f n == 0 : 2 p r i n t( ’ zero ’ ) 3 4 i f n % 2 == 0 : 5 p r i n t( ’ even ’ ) 6 e l s e: 7 p r i n t( ’ odd ’ ) 8 9 i f temperature < 1 8 : 10 p r i n t( ’ c o l d ’ ) 11 e l i f temperature > 2 8 : 12 p r i n t( ’ hot ’ ) 13 e l s e: 14 p r i n t( ’ c o m f o r t a b l e ’ )

条件式を連続して記述する場合は、else if や elsif ではなく、elsif と書く。条 件式が真または偽の場合、どの文が実行されるかをインデントの深さで示し ているのがPython の大きな特徴の一つである。 例えば以下のプログラムでは、n が 100 以上であれば n の値が出力され、 なおかつn の値が 100 に設定される。 1 i f n >= 1 0 0 : 2 p r i n t( n ) 3 n = 100

2文が単純文もしくは単純文のリストであれば、「if EXPR: STATEMENT」のように一行

で書くこともできる。例えば、「if n = 0: print(n)」や「if n =0: print(n); n += 1」

のように改行せずに一行で書くことも可能ではある(が、読みにくくなるのでこういう書き

(6)

一方、以下のプログラムでは、n が 100 以上であれば同様に n の値が出力さ れるが、n の値によらず (if 文の条件式の真偽によらず) 常に n の値が 100 に 設定される。 1 i f n >= 1 0 0 : 2 p r i n t( n ) 3 n = 100 Python は最近のプログラミング言語としてはめずらしく、多分岐 (multi-way branch) を記述するための複合文を持っていない。C では switch 文に よって多分岐を記述できるが、Python には多分岐を記述するための文がな い。このため、Python で多分岐を記述する時は、if 文を利用して、 1 >>> item = ’ l e a f ’ 2 >>> i f item == ’ f i r e ’ : 3 . . . p r i n t( ’ red ’ ) 4 . . . e l i f item == ’ l e a f ’ : 5 . . . p r i n t( ’ green ’ ) 6 . . . e l i f item == ’ sea ’ : 7 . . . p r i n t( ’ blue ’ ) 8 . . . e l s e : 9 . . . p r i n t( ’unknown ’ ) 10 . . . 11 green のように書く。当然、elif 節の数が増えると、プログラムの実行速度がどん どん遅くなる。if/elif の条件節が N 個あれば、(それぞれの条件に一致する 確率がすべて等しいとすれば) 平均 N/2 回の条件をチェックする必要がある からである。つまり、計算量のオーダが O(N ) だからである。 上記の例であれば、elif 節を多用するのではなく、辞書を使って、 1 >>> item = ’ l e a f ’

2 >>> c o l o r = { ’ f i r e ’ : ’ red ’ , ’ l e a f ’ : ’ green ’ , ’ sea ’ : ’ blue ’ } 3 >>> t r y :

4 . . . p r i n t( c o l o r [ item ] ) 5 . . . e x c e p t KeyError :

(7)

6 . . . p r i n t( ’unknown ’ ) 7 . . .

8 green

のように書くとよい。辞書(連想配列) の計算量のオーダは O(1) だから、こ ちらのほうが圧倒的に高速である。

繰り返し(loop) でよく使われるのは for 文と while 文である。まず、for 文を説明しよう。

for TARGET_LIST in EXPR_LIST: STATEMENT : if 文と同じように、STATEMENT は文である。TARGET_LIST は変数 (もし くは変数のリスト) であり、EXPR_LIST は式 (もしくは式のリスト) である3 例えば、変数i を 0 から N - 1 まで変化させてループするには、以下のよ うに書く。 1 >>> N = 5 2 >>> f o r i in range (N) : 3 . . . p r i n t( i ) 4 . . . 5 0 6 1 7 2 8 3 9 4 range(n) は 0 から n - 1 までのリストを作成する組み込み関数である。リス ト[0, 1, 2, . . . , 9] を作成し、リストの各要素を変数 i に代入して各ループが実 行される4。

3Python の for 文では末尾に else 節を加えることができる (これを使えばループから break

した/しないに応じて処理を分けることができる) が、マイナーな機能であるため説明は省略 する。

(8)

EXPR_LIST はリストとして扱えるようなものであれば何でもよい5

1 >>> names = [ ’ John ’ , ’ Bob ’ , ’ Michael ’ ] 2 >>> f o r s in names : 3 . . . p r i n t( s ) 4 . . . 5 John 6 Bob 7 Michael のようにリストを指定してもよいし、

1 >>> c o l o r = { ’ f i r e ’ : ’ red ’ , ’ l e a f ’ : ’ green ’ , ’ sea ’ : ’ blue ’ } 2 >>> f o r item in c o l o r : 3 . . . p r i n t( item ) 4 . . . 5 f i r e 6 l e a f 7 sea 8 >>> f o r c in c o l o r . v a l u e s ( ) : 9 . . . p r i n t( c ) 10 . . . 11 red 12 green 13 blue のように辞書のキーや値に対してループすることもできる。さらに Python では、TARGET_LIST や EXPR_LIST はリストでもよい。従って、

1 >>> c o l o r = { ’ f i r e ’ : ’ red ’ , ’ l e a f ’ : ’ green ’ , ’ sea ’ : ’ blue ’ } 2 >>> f o r k , v in c o l o r . items ( ) : 3 . . . p r i n t( k + ’ i s ’ + v ) 4 . . . ジェクト(iterator object) を生成している。ただ、細かい話なので最初のうちは気にしなく てよい。 5正確には 、イタラ ブル (iterable) なオブジェクトであれば何でもよい。「これは、 __iter__メソッドを持つオブジェクトであれば何でもよい」ことを意味する(のだが、こ れも細かい話なので最初は気にしなくてよい)。

(9)

5 f i r e i s red 6 l e a f i s green 7 sea i s blue 8 >>> f o r i , item in enumerate ( c o l o r ) : 9 . . . p r i n t( i , item ) 10 . . . 11 0 f i r e 12 1 l e a f 13 2 sea 14 >>> p o i n t s = [ ( 1 2 , 3 4 ) , ( 5 6 , 7 8 ) , ( 9 0 , 1 0 ) ] 15 >>> f o r x , y in p o i n t s : 16 . . . p r i n t( x , y ) 17 . . . 18 12 34 19 56 78 20 90 10 のような便利な書き方ができる。 ループ中で、次のループにジャンプするもしくはfor ループから抜けるた

めには、C や Java と同じように、それぞれ continue 文および break 文を用 いる。 繰り返す回数があらかじめ決まっていない場合は、while 文を使うとよい。 while EXPR: STATEMENT : if 文と同様に、EXPR は条件式であり、STATEMENT は文をあらわす。例 えば、 1 >>> while True : 2 . . . t r y: 3 . . . s = input ( ’ $ ’ ) # 標準入力から文字列を読み込む 4 . . . e x c e p t EOFError : 5 . . . break 6 . . . p r i n t( s )

(10)

7 . . . 8 $ Hello 9 Hello 10 $ Welcome ! 11 Welcome ! 12 $ >>> # C t r l−D で終了 のように使う。上記の例では、行を読み込み6、入力された行を標準出力に出 力するという処理を繰り返す。ファイルの終端に到達した場合はループから 抜ける。break は、ループを制御するための文であり、一番内側のループか ら抜けるために用いられる。 ちなみに、継続条件は式でなければならないので、 1 >>> while s = input ( ) : 2 F i l e " < s t d i n > " , l i n e 1 3 while s = input ( ) : 4 ^ 5 S y n t a x E r r o r : i n v a l i d syntax

のようには 書けない 。C や Java 等では、if 文や while 文の条件式に代入文 を書くのは普通(常套句) だが、Python ではそういう書き方は できない 。if 文やwhile 文の条件式に代入文を書くのは、(1) = と == を書き間違えるとい うエラーが起こりやすく、また、書き間違えたという誤りに気付くのが比較的 難しい、(2) 一行で複数の処理が行われるためプログラムが読みづらくなる、 等の問題があった。Python では、「代入文は式にあらず」という大胆な設計 をしたことにより、上記のような既存のプログラミング言語の問題点を解消 している。「条件式に代入文が書けないのは不便だなあ……」とC や Java に 慣れたプログラマは最初思うだろうが、すぐにPython の選択のほうが合理 的であることに気付くだろう。 基本的に、Python は記述の自由度が非常に小さい。4 章で述べたように、 Python には、 6input は組み込み関数であり、標準入力から一行を読み込み、読み込んだ行 (行末の改行 を除く) を文字列として返す。標準入力が EOF に到達すれば、EOFError という例外を発生 させる。

(11)

• Beautiful is better than ugly. • Explicit is better than implicit. • Readability counts.

• In the face of ambiguity, refuse the temptation to guess.

などの設計思想がある。「あんな書き方とか、こんな書き方とか、そんな書き 方」のようないろいろな書き方が できない のがPython の特徴である。没個 性的と思えるかもしれないが、Python は「どんなプログラマが書いても同じ ような(大体似たような) コードになる」ように設計されている。

5.2

スコープ

(scope)

他のプログラミング言語と同じように、Python では変数や関数に自由に名 前をつけることができる。プログラム中において、名前が有効(valid) な範囲 をスコープ(scope) と呼ぶ。「スコープ」と書くと難しく、高級な概念のよう に聞こえるが、単に「範囲」の意味である。

Python では、ユーザが作成した変数は、すべて局所変数 (local variable) になる。変数のスコープ(有効範囲) がプログラム全体 (= グローバル) である ような大域変数とは異なり、局所変数は、変数のスコープ(有効範囲) がプロ グラムの一部(= ローカル) である。 Python における変数の有効範囲は「ブロック (block)」である。ここでブ ロックとは、クラス、関数、もしくはモジュールである。つまり、変数をプ ログラム中のどこで作成したかによって変数のスコープが決まる。C や Java では、if 文や while 文の内側がブロックとなるが、Python ではこれらは (ス コープを決定する) ブロックでは ない ことに注意する。

Python では、C や Java のように、変数を毎回宣言する必要はなく、変数 に値を代入した時点で変数が生成される。例を見てみよう。if 文の内側で n に456 を代入しているが、if 文を抜けた時に n が 123 に ならない ことに注 意する。

(12)

1 >>> n = 123 2 >>> p r i n t ( ’ o u t e r n = ’ , n ) 3 o u t e r n = 123 4 >>> i f True : 5 . . . n = 456 6 . . . p r i n t( ’ i n n e r n= ’ , n ) 7 . . . 8 i n n e r n= 456 9 >>> p r i n t ( ’ o u t e r n = ’ , n ) 10 o u t e r n = 456 n に最初に代入が行われたのは 1 行目であり、ここはモジュールの最上位 (ク ラス中でも、関数中でもない) ので、変数 n のスコープはモジュール全体と なる。 以下の例では、関数f(x) 中の局所変数 y (= 123) のスコープは関数内であ り、モジュールの最上位の局所変数y (= 456) のスコープはモジュール全体と なる。 1 >>> def f ( x ) : 2 . . . y = 123 3 . . . r e t u r n x 4 . . . 5 >>> y = 456 6 >>> x = f ( 1 ) 7 >>> x 8 1 9 >>> y 10 456 関数内から、外側のスコープにある局所変数を参照することもできる。以 下の例では、関数f(x) の内側で、モジュール全体がスコープである変数 y (= 456) の値を参照している。 1 >>> def f ( x ) : 2 . . . r e t u r n y 3 . . .

(13)

4 >>> y = 456 5 >>> x = f ( 1 ) 6 >>> x 7 456 8 >>> y 9 456 なおPython では、外側のスコープの局所変数は参照のみが可能であり、そ のままでは値を書き換えることができない。 1 >>> def f ( x ) : 2 . . . y += 1 3 . . . r e t u r n y 4 . . . 5 >>> y = 456 6 >>> x = f ( 1 ) 7 Traceback ( most r e c e n t c a l l l a s t ) : 8 F i l e " < s t d i n > " , l i n e 1 , in <module> 9 F i l e " < s t d i n > " , l i n e 2 , in f 10 UnboundLocalError : l o c a l v a r i a b l e ’ y ’ r e f e r e n c e d b e f o r e assignment 以下のようにglobal 文を用いれば、外側のスコープの局所変数を書き換え ることができる。 1 >>> def f ( x ) : 2 . . . g l o b a l y 3 . . . y += 1 4 . . . r e t u r n y 5 . . . 6 >>> y = 456 7 >>> x = f ( 1 ) 8 >>> x 9 457 10 >>> y 11 457

(14)

C や Java 等に慣れたプログラマは、以下のような Python プログラムに最 初戸惑うだろう。 1 >>> def f ( x ) : 2 . . . i f x >= 0 : 3 . . . s = ’ non−negative ’ 4 . . . e l s e: 5 . . . s = ’ n e g a t i v e ’ 6 . . . p r i n t( s ) 7 . . . 8 >>> f ( 1 2 3 ) 9 non−negative 10 >>> f (−456) 11 n e g a t i v e 変数type は、関数 f 内で作成されているため、関数 f をスコープとする (関 数f 内で有効となる) 局所変数となる。if 文の内側で変数 s が作成されている が、変数s のスコープは if 文の内側のブロック (3 行目や 5 行目) では なく 、 関数f となる。もちろん、 1 >>> def f ( x ) : 2 . . . s = None 3 . . . i f x >= 0 : 4 . . . s = ’ non−negative ’ 5 . . . e l s e: 6 . . . s = ’ n e g a t i v e ’ 7 . . . p r i n t( s ) 8 . . . のように書いても構わないし、こちらのほうがプログラムの見通しはすっき りする。が、上記のように書く必要はない(どちらでもよい)。

5.3

サブルーチン

(subroutine)

プログラミング言語の世界では、ひとまとまりの独立した小さなプログラ ムのことを、「手続き (procedure)」や、「関数 (function)」、「サブルーチン

(15)

(subroutine)」などと呼ぶ。プログラミング言語によっては、「サブプログラ ム(subprogram)」や「モジュール (module)」と呼ぶ場合もある。これらは 基本的に同じものを意味している。値を返すものを「関数」と呼び、値を返さ ないもの(副作用に意味があるもの) を「手続き」と呼んで区別することもあ る。Python では、関数と手続きは区別されずに、すべて「関数 (function)」 と呼ばれている。 まずは単純な関数定義と呼び出しの例を示そう。 1 >>> def s a y _ h e l l o ( ) : 2 . . . p r i n t( ’ Hello , World ! ’ ) 3 . . . 4 >>> s a y _ h e l l o ( ) 5 Hello , World ! 1∼2 行目で say_hello という名前の関数を定義し、4 行目で関数 say_hello を呼び出している。この例のように、関数の定義にはdef 文を使う。関数呼 び出しは、「関数名(引数)」のように書く。上記の例では、引数 (parameter) が空になっている。Python では、インデントが意味を持っているため、4 行 目が関数定義の一部ではないことがインデントからわかる。 もう少し複雑な例を示そう。 1 >>> def i s _ e v e n ( n ) : 2 . . . i f n % 2 == 0 : 3 . . . r e t u r n True 4 . . . e l s e: 5 . . . r e t u r n F a l s e 6 . . . 7 >>> i s _ e v e n ( 1 2 3 ) 8 F a l s e 9 >>> i s _ e v e n ( 4 5 6 ) 10 True 関数is_even は、引数の値が偶数かどうかをチェックし、偶数なら True を返 し、偶数でなければ(奇数であれば) False を返す。 Python では、すべての関数は 0 個以上の引数 (parameter) を取る。引数

(16)

は必ず値渡し (call by value) であり、参照渡し (call by reference) や名前渡 し(call by name) は書けない。例えば、C 言語では、整数型の変数の値を関 数内で1 だけ増加させるような関数は 1 void i n c ( i n t ∗n ) { 2 ∗n += 1 ; 3 } 4 5 i n t main ( void ) { 6 i n t n = 1 2 3 ; 7 i n c (&n ) ; 8 r e t u r n ( n ) ; 9 } のように書けるが、Python では 書けない7Python で同じようなプログラム を書くなら、以下のように明示的に返り値を変数に代入しなければならない。 1 >>> def i n c ( n ) : 2 . . . r e t u r n n + 1 3 . . . 4 >>> n = 123 5 >>> n = i n c ( n ) 6 >>> n 7 124 Python における関数で便利なのは、引数のデフォルト値 (初期値) を指定 できること (その結果、関数呼出し時の引数の一部を省略できること) だ 8 引数n の値が、引数 m で割り切れるかどうかを判定する関数の例を示そう。 7正確に言えば、C 言語も値渡ししかできない言語である (この例では、int 型の変数 n へ のポインタを値として渡している)。C 言語では、変数へのポインタを値として引数に渡せる ため、結果として参照渡しと同じようなことが記述できる。 8引数のデフォルト値としてリストや辞書を指定してもよいが、直感的に期待されるよう に動作しない(その結果、分かりづらいバグの原因となる)。このため、Python にある程度習 熟するまでは、リストや辞書のような変更可能な(ミュータブルな) オブジェクトを初期値と して指定 しない ことをすすめる。(当面の間は) 引数の初期値には、数値や None、文字列、 タプルのようなイミュータブルなオブジェクトだけを用いるようにしよう。

(17)

1 >>> def i s _ m u l t i p l e ( n , m=2 , debug= F a l s e ) : 2 . . . i f debug : 3 . . . p r i n t( ’ i s _ m u l t i p l e : n = { } , m= { } , debug = { } ’ . format( n , m, debug ) ) 4 . . . i f n % m == 0 : 5 . . . r e t u r n True 6 . . . e l s e: 7 . . . r e t u r n F a l s e 8 . . . 9 >>> i s _ m u l t i p l e ( 1 2 , 2 , F a l s e ) 10 True 11 >>> i s _ m u l t i p l e ( 1 3 , 2 , F a l s e ) 12 F a l s e 13 >>> i s _ m u l t i p l e ( 1 2 , 2 , True ) 14 i s _ m u l t i p l e : n=12 , m=2 , debug=True 15 True 16 >>> i s _ m u l t i p l e ( 1 2 ) 17 True 18 >>> i s _ m u l t i p l e ( 1 3 ) 19 F a l s e 20 >>> i s _ m u l t i p l e ( 1 3 , debug=True ) 21 i s _ m u l t i p l e : n=13 , m=2 , debug=True 22 F a l s e 23 >>> i s _ m u l t i p l e ( 1 3 , 3 ) 24 F a l s e 25 >>> i s _ m u l t i p l e ( 1 5 , 3 ) 26 True 引数m の初期値に 2 を、引数 debug のデフォルト値に False を指定してい る。関数呼出しの際に引数を省略すると、引数m や debug にはデフォルト 値がそれぞれ代入される。関数呼出しにおいて、単にis_multi(12, 3, True) の ように値だけを並べることもできるし、is_multi(12, m=3, debug=True) の ように「引数名=値」の形で並べることもできる。 ただし、この柔軟性がPython プログラミングにおいて混乱する原因の一つ になっている。Python では、実行時に引数の型チェック等は行われない。こ

(18)

のため、例えばis_multiple 関数の引数の順序を誤って覚えてしまっており、 1 >>> i s _ m u l t i p l e ( 1 2 , 3 , True ) と書くべきところを、 1 >>> i s _ m u l t i p l e ( 1 2 , True , 3 ) とか 1 >>> i s _ m u l t i p l e ( 1 2 , True ) のように書いてしまったとしてもエラーにならず、また誤りに気付きづらい。 Python に限らず (実際にはプログラミング言語にも限らず)、利便性と安全性 はトレードオフの関係にある。Python の関数は、やや利便性に寄せた言語設 計となっている。このため、使用する場合はプログラマが安全性に注意する 必要がある。

Python では、関数中に return 文があれば、return 文で指定された値を返 り値(return value) として返される。return 文がなければ None が返される。 return 文によって返り値として返せるのは単一のオブジェクトだけである。 ただし、Python ではリストやタプルが使えるため、関数から複数の値を返し たい場合には、 1 >>> def geometry ( ) : 2 . . . l a t i t u d e = 35 3 . . . l o n g i t u d e = 135 4 . . . r e t u r n l a t i t u d e , l o n g i t u d e 5 . . . 6 >>> l a t , long = geometry ( ) 7 >>> l a t 8 35 9 >>> long 10 135 のように書くことができる。 C 言語とは異なり、Python における関数定義はネストする (入れ子にする) ことができる。つまり、関数定義の中で別の関数を定義し、その関数の定義

(19)

の中でまた別の関数を定義する……といったことが可能である。簡単な例を 示そう。 1 >>> def f ( ) : 2 . . . def g ( ) : 3 . . . r e t u r n 123 4 . . . r e t u r n g ( ) + 256 5 . . . 6 >>> f ( ) 7 379 8 >>> g ( ) 9 Traceback ( most r e c e n t c a l l l a s t ) : 10 F i l e " < s t d i n > " , l i n e 1 , in <module> 11 NameError : name ’ g ’ i s not d e f i n e d

関数f のスコープはモジュール全体、関数 g のスコープは関数 f の内側とな

る。従って、関数f の外側から関数 g を呼出そうとしてもエラーになってし

参照

関連したドキュメント

Maurer )は,ゴルダンと私が以前 に証明した不変式論の有限性定理を,普通の不変式論

次亜塩素酸ナトリウムは蓋を しないと揮発されて濃度が変 化することや、周囲への曝露 問題が生じます。作成濃度も

LF/HF の変化である。本研究で はキャンプの日数が経過するほど 快眠度指数が上昇し、1日目と4 日目を比較すると 9.3 点の差があ った。

事業所や事業者の氏名・所在地等に変更があった場合、変更があった日から 30 日以内に書面での

近年は人がサルを追い払うこと は少なく、次第に個体数が増える と同時に、分裂によって群れの数

各テーマ領域ではすべての変数につきできるだけ連続変量に表現してある。そのため

られる。デブリ粒子径に係る係数は,ベースケースでは MAAP 推奨範囲( ~ )の うちおよそ中間となる

40m 土地の形質の変更をしようとす る場所の位置を明確にするた め、必要に応じて距離を記入し