Python入門6
****************************************
Pythonのスクリプトファイルから実行する
****************************************
いままでは、コマンドプロンプトで実行していましたが、複数行にわたるプログラムなどはスクリプトファイルを作成して実行します。
>>>def func(*x):
... for n in x:
... print(n)
...
>>>func("abc", "def", "ghi")
abc
def
ghi
上記のプログラムをスクリプトファイルにします。
拡張子「.py」のUTF-8形式のファイルを作ります。
(script.py)
def func(*x):
for n in x:
print(n)
func("abc", "def", "ghi")
実行するときは、
コマンドプロンプトで行います。
Pythonが起動した居る場合(プロンプトが「>>>」の場合)、「quit()」を入力してpythonが終了します。
コマンドプロンプトの状態で実行します。
ファイルの位置が「C:\python\script.py」の場合の例
C:\python>python sampleScript.py
abc
def
ghi
---------------------------------------------
コーディングスタイルについて
1.インデントは空白4つを使う。
2.ソースコードの幅が79文字を越えないように行を折り返す。
3.コードブロックの区切りに空行を使う。
4.コメントは行に独立で書く。
5.演算子の前後とコンマの後には空白をいれ、括弧類のすぐ内側に空白を入れない。
コメントは'#'で始まります。
#足し算の関数例
def add(x, y):
print('{0} + {1} = {2}'.format(x, y, x + y))
add(4, 9)
実行すると
4 + 9 = 13
****************************************
関数
****************************************
関数定義は「def」で始まる。
if __name__ == "__main__":
__name__ はグローバル変数です、
スクリプトファイルとして実行する場合、この値が__main__となる
関数の引数は値渡し(call by value)
return文では、関数から一つの値を返します
returnの戻り値となる式がない場合、Noneが帰ります。関数が終了したときにもNoneが返ります。
引数について、
■位置引数
順番に仮引数を代入する
def outStr(s1, s2):
print(s1 + ',' + s2)
outStr('Apple', 'Lemon')
Apple,Lemon
■キーワード引数
仮引数の名前を指定して代入する。
def outStr(s1, s2):
print(s1 + ',' + s2)
outStr(s2='Lemon', s1='Apple')
Apple,Lemon
■デフォルト引数
引数のデフォルト値を設定できる。
def outStr(s1, s2='Defulte'):
print(s1 + ',' + s2)
outStr('Aplle')
Apple,Defulte
■タプル引数
引数をタプルで受け取る
仮引数に「*」を付けます。
可変長引数として使用出来ます。
def outStr(*tp):
print(tp)
outStr('Apple')
outStr('Apple', 'Lemon')
outStr('Apple', 'Lemon', 'Orange')
('Apple')
('Apple', 'Lemon')
('Apple', 'Lemon', 'Orange')
■辞書引数
引数を辞書で受け取る
仮引数に「**」を付けます。
可変長引数として使用出来ます。
def outStr(**di):
print(di)
outStr(First='Apple')
outStr(First='Apple', Second='Lemon')
outStr(First='Apple', Second='Lemon', Third='Orange')
{'First':'Apple'}
{'First':'Apple', 'Second': 'Lemon'}
{'First':'Apple', 'Second': 'Lemon', 'Third': 'Orange'}
関数呼び出しでは、キーと成る部分では数値は使用出来ない。
キーと成る部分は変数と同じで先頭に数字が付く文字列も使用出来ない。
--------------------------
○問題01
次の処理で何が出力されるでしょうか。
i = 5
def f(arg = i):
print(arg)
i = 6
f()
答えは「5」
○問題02
次の処理で何が出力されるでしょうか。
def f(x, y, z):
print(y)
f(x = 3, z = 5, y = 4)
答えは「4」
スコープ
■グローバル変数
関数内でのグローバル変数の扱いについて、
グローバル変数は、関数内から読み出すことは出来ますが、変更できません。
関数内でグローバル変数の値を変更したいときは「global」を記述浸ます。
v='abcde'
def func():
global v
v='fghijkl'
return v
x=func()
print(x)
fghijkl
変数にアクセスする
関数の外にある変数にアクセスできる
def func():
print("print1" + x1)
x1 = "No.1"
func()
print("print2" + x1)
print1 No.1
print2 No.1
func関数の変数にアクセス
def func():
x1 = "No.2"
print("print1" + x1)
x1 = "No.1"
func()
print("print2" + x1)
print1 No.2
print2 No.1
def func():
x1 = "No.2"
if True:
x1 = "No.3"
print("print1" + x1)
print("print2" + x1)
x1 = "No.1"
func()
print("print3" + x1)
print1 No.3
print2 No.3
print3 No.1
def func():
x1 = "No.1"
def dlocal():
x1 = "No.2"
print("print1" + x1)
dlocal()
print("print2" + x1)
x1 = "No.3"
func()
print("print3" + x1)
print1 No.2
print2 No.1
print3 No.3
一番外側の変数にアクセスする場合
global文を使う
def func():
x1 = "No.1"
def dlocal():
global x1
x1 = "No.2"
print("print1" + x1)
dlocal()
print("print2" + x1)
x1 = "No.3"
func()
print("print3" + x1)
print1 No.2
print2 No.1
print3 No.2
1つ外側の変数にアクセスする場合
nonlocal文を使う
def func():
x1 = "No.1"
def dlocal():
nonlocal x1
x1 = "No.2"
print("print1" + x1)
dlocal()
print("print2" + x1)
x1 = "No.3"
func()
print("print3" + x1)
print1 No.2
print2 No.2
print3 No.3
いろいろな関数
■関数内関数
関数の中で宣言する関数。
def func(s):
def inner():
print(s)
inner()
func("abcde")
abcde
■クロージャ
クロージャはパラメータの異なる関数を複数作りたいときにペン利です。
クロージャは関数内関数をreturnで返します。
def func(str1):
def inner(str2):
return str1 + ',' + str2
return inner
callfunc1 = func("abc")
callfunc2 = func("ABC")
print(callfunc1("def"))
print(callfunc2("DEF"))
abc,def
ABC,DEF
■無名関数
無名関数は「lambda」(ラムダ)を使って記述します。
ラムダ式
無名関数を作る
lamb = lambda x, y : x + y
sam = lamb(3, 4)
print(sam)
答えは「7」
def func(f):
return f(3, 5)
num=func(lambda x, y : x + y)
print(num)
8
■ジェネレータ
反復処理で使う特殊な関数です。
for文などで利用します。
「return」の代わりに「yield」(イールド)を使います。
次の例では3つの引数を順番に返すジェネレータ関数です。
def func():
yield "abc"
yield "def"
yield "ghi"
for i in func():
print(i)
abc
def
ghi
「next(<ジェネレータ>)」や「<ジェネレータ>.next()」で値を取り出す事が出来る。
def func():
yield "abc"
yield "def"
yield "ghi"
f = func()
print(next(f))
print(next(f))
print(next(f))
abc
def
ghi