まず、指定した範囲内でフィボナッチシリーズを出力する関数を作成しましょう。
#! /usr/bin/env python
# coding=utf-8'''
2016年9月4日午後2時に作成:37:31
@ author: Flowsnow
@ file: D:/Workspaces/eclipse/HelloPython/main/FibonacciSeries.py
@ function:機能を定義する-指定された範囲内でFibonacciシーケンスを出力します
'''
def Fibonacci(n):
# print "success"
a=0
b=1while a<n:
print a,
a,b=b,a+b
# call the function Fibonacci
Fibonacci(2000)
print '\n',
print Fibonacci
f=Fibonacci
f(100)
print '\n',
print Fibonacci(0)
出力は次のとおりです。
011235813213455891442333776109871597< function Fibonacci at 0x000000000258D9E8>01123581321345589
None
最初の行から、Fibonacci関数が2000年以内にFibonacciシーケンスを出力していることがわかります。
2行目は、メモリ内のFibonacci関数のアドレスを示しています
3行目から、Fibonacci関数のアドレス値を別の変数fに割り当てた後、fは重複名メカニズムに似た関数であることがわかります。
4行目から、Fibonacci関数にはreturn
ステートメントがありませんが、None
です。
フィボナッチシーケンスの値を出力せず、その値を戻り値として返す関数を作成することもできます。
#! /usr/bin/env python
# coding=utf-8'''
2016年9月4日午後3時に作成:07:06
@ author: Flowsnow
@ file: D:/Workspaces/eclipse/HelloPython/main/FibonacciSeriesAdv.py
@ function:関数定義-直接印刷する代わりにFibonacciシーケンスを返す
'''
def Fibonacci(n):
a=0
b=1
result=[]while a<n:
result.append(a)
a,b=b,a+b
return result
result=Fibonacci(2000)for x in result:
print x,
出力結果:0 1 1 2 3 5 8 13 21 34 55 89144233377610987 1597
Pythonの組み込み標準タイプには、可変タイプと不変タイプに分けられる分類標準があります
上記の関数定義のパラメーターはすべて不変の型です。
可変パラメータには、デフォルトパラメータ、位置パラメータ * args
キーワードパラメータ ** kwargs
の3つのケースがあります。
デフォルトパラメータの利点は、関数を呼び出すときに書き込まれるパラメータが、関数が定義されているときよりも少ないことです。例えば:
#! /usr/bin/env python
# coding=utf-8'''
2016年9月5日午後2時に作成:50:12
@ author: Flowsnow
@ file: D:/Workspaces/eclipse/HelloPython/main/askYesOrNo.py
@ function:デフォルトパラメータの使用をテストします
'''
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):while True:
ok =raw_input(prompt)if ok in('y','ye','yes'):return True
if ok in('n','no','nop','nope'):return False
retries = retries -1if retries <0:
raise IOError('refusenik user')
print complaint
この関数を呼び出すには、次のような多くの方法があります。
ask_ok( 'ファイルを上書きしてもよろしいですか?')
ask_ok( 'OK to override the file?'、2)
ask_ok( 'ファイルを上書きしますか?'、2、 'さあ、はいまたはいいえのみ!')
デフォルト値に関しては、デフォルト値は関数が定義されたときに一度だけpythonによって解析されることに注意する必要があります。したがって、
i =5
def f(arg=i):
print arg
i =6f()
このコードの出力は6ではなく5である必要があります。これは、関数の定義時にiが解析されるため、この時点ではi = 5です。
**重要な警告:**デフォルト値は1回だけ解析されます。デフォルトのパラメータが可変オブジェクトの場合、リスト、辞書、クラスオブジェクトなどの影響は比較的大きくなります。以下に示す関数は、パラメーターを累積し、後続の関数呼び出しに渡します。
def f(a, L=[]):
L.append(a)return L
print f(1)
print f(2)
print f(3)
このコードは出力します
[1][1,2][1,2,3]
後続の関数呼び出しでデフォルトのパラメーターを共有したくない場合は、この形式で関数を記述できます。
def f(a, L=None):if L is None:
L =[]
L.append(a)return L
このコードは出力します
[1][2][3]
位置パラメーターは、パラメーターの前にアスタリスクを追加する必要があります。パラメータを変数argsとしてタプルに収集します。位置パラメータと呼ばれる理由は、各パラメータを順番に受け取るためです。
def argTest(arg1,*args):
print arg1
print('~start to print *args~')for x in args:
print x,argTest(1,'two',3)
このコードは出力します
1~ start to print *args~
two 3
argsは、複数の変数を含むタプルとして解釈されます。したがって、次のように書くこともできます。
def argTest(arg1,*args):
print arg1
print('~start to print *args~')for x in args:
print x,
# argTest(1,'two',3)
args=['two',3]argTest(1,*args)
関数は、 kwarg = value
の形式のキーワード引数を使用して呼び出すこともできます。キーワードパラメータには、2つのアスタリスクを前に付ける必要があります。その機能は、パラメーターの名前と値を含むパラメーターを辞書タイプに収集することです。
def argTest(arg1,**kwargs):
print 'arg1',arg1
for key in kwargs:
print key,kwargs[key]argTest(1,arg2='aa',arg3='bb')argTest(arg1=1,arg2='aa',arg3='bb',arg4='cc')
arg={'arg2':'bb','arg3':'cc','arg4':'dd'}argTest(arg1='ss',**arg)argTest(arg1='ss',**arg)
このコードは出力します
arg1 1
arg2 aa
arg3 bb
arg1 1
arg2 aa
arg3 bb
arg4 cc
arg1 ss
arg2 bb
arg3 cc
arg4 dd
arg1 ss
arg2 bb
arg3 cc
arg4 dd
[ Python公式ウェブサイト-defining-functions](https://docs.python.org/2/tutorial/controlflow.html#defining-functions)
Passing arguments to Python functions1.pdf
[ Pythonの* argsと** argsの違い](http://bbs.chinaunix.net/thread-3572865-1-1.html)
Recommended Posts