パラメータ関数Python凡人ノートパラメータ関数

29212 ワード

文句を言うのはテーマとは関係ありません.
前回の「Python常人条記--装飾器」では、Pythonのパラメータ法魔の表現がはっきりしていないことを園友が提案したので、この機会にまとめて、いくつかの例を結びつけて、皆さんに助けてほしいと思います.また竹風はPython 2.6.6
参考資料:『Python基礎教程』(第2版)Magnus Lie Hetland
一、Pythonの関数は何を返しますか?一般的に言われる関数は、いつも計算後に何かを返します.Pascalのように、分関数とプロセスがあります.Pythonの関数が何を返すかを例から見てみましょう.
1 def test():
2     print "This is printed"
3     return
4     print "This is not"

ここのreturn文語は、終了関数としてのみ機能します.
1 >>> x = test()
2 This is printed
3 
4 >>> x
5 >>>
6 
7 >>> print x
8 None

2番目のprint文語がスキップされていることがわかります.xだけを見ると何もないようで、「print x」を通じて私たちはよく知っている値を見ることができます:None.このように、Pythonでは、すべての関数が値を返します.値を返す必要がない場合は、Noneを返します.
二、どんな種類のパラメータを修正できますか?関数は、パラメータによって一連の値を取得します.Pythonでは、文字列(および数字とメタグループ)は可変ではなく、修正されない(すなわち、新しい値で覆われるしかない)、学術的な点では、関数内で可変タイプのパラメータに新しい値を付与しても外部の変数の値は変更されません.   
1 >>> def try_to_change(n):
2 ...     n = "Mr Gumby"
3 ...
4 >>> name = "Mrs Entity"
5 >>> try_to_change(name)
6 >>> name
7 'Mrs Entity'

nameはパラメータとして関数に伝達されるが,最後のnameの値は何の変更もないことが分かる.実際には、フェース上のコード世代の作業方法は、フェースの下のようなものです.
1 >>>name = "Mrs Entity"
2 >>>n = name    #      
3 >>>n = "Mr Gumby"    #      n       
4 >>>name
5 'Mrs Entity'

では、もし私たちが送ったパラメータが可変のデータ構造であれば、リストなどですか?みんなはもう結果を推測できるだろう.
1 >>> def change(n):
2 ...     n[0] = "Mr Gumby"
3 ...
4 >>> name = ["Mrs Entity", "Mrs Thing"]
5 >>> change(name)
6 >>> name
7 ['Mr Gumby', 'Mrs Thing']

ここで発明パラメータの値は変更され,これも目の前の例で最も重い区分である.2つの変数が同時に1つのリストを参照している場合、それらは確かに1つのリストを同時に参照していることを明らかにします.このような状況を防止するには、リストのコピーをコピーします.具体的には,パラメータを渡す場合,リストのスライスをパラメータとして,例えばchange(name[:])とする.これで、元のリストは安全です.PS:竹風が入門したばかりの頃、元のリストを関数に入れるミスを犯したことがありますが、肝心なのは関数の中にremoveが操作されていることで、結果はみんなも推測できます.の
では、可変のパラメータを操作するとしたら?例えば数字ですが、これはどうすればいいですか?この場合、関数から必要な値をすべて返し、値が1つ以上ある場合はメタグループの式で返します.たとえば、変数の数値を1に増やす関数は、次のように書くことができます.
1 >>> def inc(x):return x + 1
2 ...
3 >>> foo = 10
4 >>> foo = inc(foo)
5 >>> foo
6 11

本当にパラメータを変更したい場合は、小さなスキルを適用して、値をリストに置くことができます(リストが変更可能であることを覚えていますか?):
1 >>> def inc(x): x[0] = x[0] + 1
2 ...
3 >>> foo = [10]
4 >>> inc(foo)
5 >>> foo
6 [11]

どんな方法を応用するかは,すべて個人の喜びにかかっている.
三、セットパラメータ、キーワードパラメータ、黙認パラメータはこれまで、目の前の例で適用されていたのはセットパラメータだった.セットパラメータは重いからだ.実際には名前よりも重い.まず、単一のカラムを見て、キーワードパラメータが導入された理由を見てみましょう.
 1 >>> def hello_1(greeting, name):
 2 ...     print "%s, %s!" % (greeting, name)
 3 ...
 4 >>> def hello_2(name, greeting):
 5 ...     print "%s, %s!" % (name, greeting)
 6 ...
 7 >>> hello_1("Hello", "World")
 8 Hello, World!
 9 >>> hello_2("World", "Hello")
10 World, Hello!

この2つの関数が実現する機能は完全に同じであり,唯一の区別はパラメータの順序である.パラメータが多い場合,竹風得覚パラメータの順序は覚えにくい.イベントリストを簡単にするために、パラメータの名前を供給することができます.
1 >>> hello_1(greeting = "Hello", name = "World")
2 Hello, World!
3 >>> hello_1(name = "World", greeting = "Hello")
4 Hello, World!
5 >>> hello_2(greeting = "Hello", name = "World")
6 World, Hello!

パラメータの名前を供給した後、順序はあってもなくてもいいので、顔のhelloのようです.1用調.パラメータ名と値は必ず対応しなければならない.そうしないとhello_が現れる.2そのまま「World Hello!」しました.このようなパラメータ名を適用して供給されるパラメータをキーワードパラメータと呼ぶ.重要な役割は、各パラメータの役割を明確にすることであり、面の下でこのような奇妙な使用を防止することです.
1 >>>stroe("Mr Brainsample", 10, 20, 13, 5)
2 
3 >>>stroe(patient="Mr Brainsample", hour=10, minute=20, day=13, month=5)

竹风は、大部分の园友が第1种の调子を见た时に虎の体が震えたと思っています.の第2の用調は打つ字が少し多いが,パラメータの意味がより明確になり,パラメータの順序を乱しても順序の機能には何の影響もない.キーワードパラメータが最も実用的な点は,関数にパラメータに黙認値を供給できることであり,ガガガ,変調関数を用いる際にパラメータが漏れる心配はない~~
>>> def hello_3(greeting="Hello", name="World"):
...     print "%s, %s!" % (greeting, name)
...
>>> hello_3()    #      
Hello, World!
>>> hello_3('Greetings')    #          greeting
Greetings, World!
>>> hello_3('Greetings','God')    #        
Greetings, God!
>>> hello_3('Greetings',name = 'Tom')    #            
Greetings, Tom!
>>> hello_3(name = 'Jerry')    #          name
Hello, Jerry!

最後に、セットパラメータとキーワードパラメータについて注意しなければならないのは、セットパラメータとキーワードパラメータを同時に適用する場合、セットパラメータをキーワードパラメータの目の前に置かなければならない.そうしないと、解釈器はこれらのパラメータがいったい何のセットにあるべきか分からない.
四、収集パラメータと解パラメータがこんなに長く敷かれていたので、今日の2つのボスの目の前に来ました.セットパラメータは恨みを晴らして、キーワードパラメータは治療をして、他の人は全力で出力しましょう!(ブロガーwow五人本打ちすぎた...无视すればよかった..)まずセット受信パラメータについてお話しします.関数を定義するとき、*paramsセットは残りのセットパラメータ(parameter)を受信し、メタグループに戻ります.**kwparamsセットは残りのキーワードパラメータ(key word parameter)を受け取り、辞書を返します.恣意量数を供給できるパラメータは、例えば関数addが恣意数の和を求めることができ、add(1,2,3)とadd(1,2,3,4,5)はいずれも正確な結果を与えることができる.ユーザは関数に恣意的に多くのパラメータを供給することができ,実現も難しくない.注記例ではパラメータは1つしか供給されていませんが、目の前に星印が付けられています.   
1 >>> def print_params(*params):
2 ...     print params
3 ...
4 >>> print_params('Testing')
5 ('Testing',)
6 >>> print_params('Testing',1,2,3)
7 ('Testing', 1, 2, 3)

結果はメタスタンプとして出てくることがわかります.パラメータの前のアスタリスクは、すべて渡されたパラメータを同じメタグループに配置します.これらの値セットを収めて適用するとも言える.もちろん、一般的なパラメータと組み合わせて適用することもできます.
 1 >>> def print_params_2(title, *params):
 2 ...     print "title =",title
 3 ...     print params
 4 ...
 5 >>> print_params_2("Test2", 1, 2, 3)
 6 title = Test2
 7 (1, 2, 3)
 8 >>> print_params_2("Test3")
 9 title = Test3
10 ()

全然大丈夫!だから星号の意味は「残りのセットパラメータを集める」ということです.セットされた要素が供給されない場合、paramsは空のメタグループです.キーワードパラメータの「コレクション」操作を見てみましょう.
1 >>> def print_params_3(**kwparams):
2 ...     print kwparams
3 ...
4 >>> print_params_3(x=1, y=2, z=3)
5 {'y': 2, 'x': 1, 'z': 3}

メタグループではなく辞書を返します.一緒に置いてみましょう
>>> def print_params_4(x, y, z=3, *pospar, **keypar):
...     print x, y, z
...     print pospar
...     print keypar
...
>>> print_params_4(1, 2, 3, 5, 6, 7, foo='A', bar='B')
1 2 3
(5, 6, 7)
{'foo': 'A', 'bar': 'B'}
>>> print_params_4(1, 2, 3)
1 2 3
()
{}

OK、私たちが期待していた結果と変わらない.
コレクションパラメータが終わったら、展開パラメータを打ってください.パラメータを展開し、変調関数を使用する場合、*paramsはメタグループをセットパラメータ(parameter)に分割して入力します.**kwparamsは辞書をキーワードパラメータ(key word parameter)に分割して入力する.これは2つの型典の例です.
 1 >>> def add(x,y): return x + y
 2 ...
 3 >>> params = (1, 2)
 4 >>> add(*params)
 5 3
 6 >>> def hello_3(greeting="Hello", name="World"):
 7 ...     print "%s, %s!" % (greeting, name)
 8 ...
 9 >>> kwparams = {'name': 'Sir Robin', 'greeting': 'Well met'}
10 >>> hello_3(**kwparams)
11 Well met, Sir Robin!

最後に、このいくつかの方法が一緒に適用されている状況を見てみましょう.
 1 >>> def finally_test(x, y, z=3, *params, **kwparams):    #        :    ,     ,*params,**kwparams
 2 ...     print "pos x =",x
 3 ...     print "pos y =",y
 4 ...     print "key z =",z
 5 ...     print "params =",params
 6 ...     print "kwparams =",kwparams
 7 ...
 8 >>> list = [1,2,3,4,5]
 9 >>> dict = {"foo":"A", "bar":"B"}
10 
11 >>> finally_test(1,2,*list,**dict)    #    z  ,   list[0]  z  ,     params
12 pos x = 1
13 pos y = 2
14 key z = 1
15 params = (2, 3, 4, 5)
16 kwparams = {'foo': 'A', 'bar': 'B'}
17 
18 >>> finally_test(1,2,3,list,dict)    #       ,  dict         
19 pos x = 1
20 pos y = 2
21 key z = 3
22 params = ([1, 2, 3, 4, 5], {'foo': 'A', 'bar': 'B'})
23 kwparams = {}
24 
25 >>> finally_test(1,2)    #                  
26 pos x = 1
27 pos y = 2
28 key z = 3
29 params = ()
30 kwparams = {}
31 
32 >>> finally_test(1,2,3,*list,**dict)    #       
33 pos x = 1
34 pos y = 2
35 key z = 3
36 params = (1, 2, 3, 4, 5)
37 kwparams = {'foo': 'A', 'bar': 'B'}

一般的にはdef foo(*params,**kwparams):passと定義されています
ここまでまとめましたので、皆さんに使っていただきたいです.もし足りないことがあるならば、みんなを歓迎して交流を指して、感謝します^^;
馬雲は自分を教主に包装するのが好きで、張朝陽は自分をスターに包装するのが好きで、李彦宏は自分を包装するのが好きで、丁磊は自分を包装するのが好きで、李開復はいつも獣という顔をしています.どうやら.実は私は言いたいのは、何が足りないのか、人の常情です.