関数のパラメータⅡ
第三のパラメータ:動的パラメータ
あまりにも二つのパラメータに分かれての移動:動的な位置パラメータを受け取る:*引数、キーワード受信ダイナミックパラメータ:** kwargsからの
*引数**:**動的な位置パラメータを受け取ります
def msg(*args): print('你的信息为:', args) msg('name', 111, False, [1, 3, 4, 5]) # 运行结果:你的信息为: ('name', 111, False, [1, 3, 4, 5])
上記のパラメータの意味を説明します。すべての引数の最初に、引数のパラメータは普通ですが、フロント引数に1を追加した場合、それは特別な意味を持っている:pythonで、乗算記号に加えて、彼は魔法を持っていますA。argsが*ので、パラメータの設定ということ、そして、引数はタプルに配置された位置を、受信パラメータすべての参加者を形成し、ここでは魔法の効果を再生するためにタプル引数パラメータを割り当てます、で追加され、ない引数は、単に結果を得ることができ、私たちPEP8仕様は、引数の使用のための規則を提供します。
- 練習:データ型の変数の数、関数内の着信Int関数とすべての数字とリターンを計算します。
# 传入函数中数量不定的int型数据,函数计算所有数的和并返回。 def cont(*args): n = 0 for i in args: n += i return n cont = cont(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) print(cont) # 运行结果: 55
:動的キーワード引数受け取る ****** kwargsからの
引数角位置パラメータと2種類のキーワードパラメータがありますが、今のpythonすべての位置パラメータその後、確かにすべてのキーワード引数を受け入れるためのパラメータがありますを受け入れることができます* argsがあり、これがされていることをkwargsからは、この共感は、魔法であります使用方法は、パラメータとして使用される規則をkwargsから。例示:** kwargsからは、すべての主要なパラメータを受け付けた後、「辞書」kwargsから、このパラメータに割り当てられているに変換します。
def func(**kwargs): print(kwargs) func(name='Dylan', age=18, sex='男') # 运行结果:{'name': 'Dylan', 'age': 18, 'sex': '男'}
文言のフルダイナミックパラメータ
def fun(*args, **kwargs): print(args) print(kwargs) fun('周一', '周二', '周三', '周四', name='Dylan', age=18, sex='男') # 运行结果: # ('周一', '周二', '周三', '周四') # {'name': 'Dylan', 'age': 18, 'sex': '男'}
パラメータが設定されている場合、動的パラメータは、その後、彼は対応の問題を解決するために、すべてに多くのパラメータの場合、次の引数のための大幅拡大の機能を高めるであろう位置パラメータとキーワード引数を受け取ることができます。
***使用方法の魔法**
重合に機能してブレーク。
集合
とき、私はちょうどと呼ばれるパラメータ定義した場合どのような関数の定義、:argsが、このパラメータは引数を1つしか受け入れることができます。
def msg(args): print('你的信息为:', args) msg('name') # 运行结果:你的信息为: name
プレフィックス数の*引数は、次に引数を複数受信し、タプルを返すことができる場合(** kwargsから同じ理由で、返された辞書キーワードへの変換複数のパラメータである)
だから:
場合関数定義「」重合の役割を果たしています。打たれました
s = 'Dylan' li = [1, 2, 3, 4] tu = ('Name = Dylan', 'age = 18', 'sex = 男') def func(*args): print(args) func(*s, *li, *tu) # 运行结果:('D', 'y', 'l', 'a', 'n', 1, 2, 3, 4, 'Name = Dylan', 'age = 18', 'sex = 男')
関数が実行されると、引数はI(使用可能な反復タイプ)あなたがここにパラメータ*または**、パラメータの場所として各構成要素に分解し、それらの引数に相当し、その後、合格または引数が先行しているがありますkwargsから。
だから:機能、*または**プレーの実行中に役割を分割されます。dic1 = {'name': 'Dylan', 'age': 18, 'sex': '男'} dic2 = {'0': 11, '1': 22, '2': 33} def func(**kwargs): print(kwargs) func(**dic1, **dic2) # # 运行结果:{'name': 'Dylan', 'age': 18, 'sex': '男', '0': 11, '1': 22, '2': 33}
この関数は、残りの外側の要素を処理することができます。
そのような添加は、重合の外側に、機能も柔軟に使用することができ、機能に分けることができます。
# 之前讲过的分别赋值 a,b = (1,2) print(a, b) # 1 2 # 其实还可以这么用: a,*b = (1, 2, 3, 4,) print(a, b) # 1 [2, 3, 4] *rest,a,b = range(5) print(rest, a, b) # [0, 1, 2] 3 4 print([1, 2, *[3, 4, 5]]) # [1, 2, 3, 4, 5]
一つは、言っても過言ではないと理解することができます。
パラメータの順序
位置パラメータ、デフォルトパラメータ:位置パラメータ、すなわち、前である必要があります。
その後、動的パラメータはどこに言えば引数、** kwargsからの*?
動的パラメータの引数、確かにない位置パラメータの前で、私の引数は、特定の引数の位置パラメータを受け取りませんので。# 这样位置参数a,b 始终接收不到实参了,因为 *args全部接收完了 def func(*args, a, b, sex='男'): print(args) print(a, b) func(1, 2, 3, 4, 5) # 运行结果:程序报错了
その後、動的パラメータは、引数の後ろの位置になければならない、彼はその背後にあるパラメータをデフォルトすることができますか?
# 这样也不行,我的实参的第三个参数始终都会将sex覆盖掉,这样失去了默认参数的意义。 def func(a, b, sex='男', *args, ): print(args) # (4, 5) print(sex) # 3 print(a, b) # 1 2 func(1, 2, 3, 4, 5)
* argsが、それは中間の位置パラメータのデフォルトパラメータである必要があります:位置パラメータ、* argsを、デフォルトパラメータ。
# 直接报错:因为**kwargs是接受所有的关键字参数,如果你想改变默认参数sex,你永远也改变不了,因为它会先被**kwargs接受。 def func(a,b,*args,**kwargs,sex='男',): print(args) # (4, 5) print(sex) # 3 print(a,b) # 1 2 print(kwargs) func(1, 2, 3, 4, 5, age=80, sex='666')
したがって、このカットオフ:シーケンスのすべての仮パラメータ:
位置パラメータ、引数、デフォルトパラメータ、 * kwargsから。パラメータの第四パラメータ:唯一のキーワードパラメータ
キーワード引数は唯一、彼の位置は*の引数の後に配置する必要がありますpython3xアップデートの新機能であり、フロントkwargsから(もしそれが前と注文後デフォルトのパラメータで問題ではない、デフォルトの場所のパラメータであるkwargsから)、それが唯一のキーを受け付け言葉は、パラメータを渡します:
def func(a,b,*args,sex= '男',c,**kwargs,): print(a,b) print(sex) print(args) print(c) print(kwargs) func(1,2,3,4,5,6,7,sex='女',name='Alex',age=80,c='666') """ 输出结果: 1 2 女 (3, 4, 5, 6, 7) 666 {'name': 'Alex', 'age': 80} """
キーパラメータは、あなたは彼が唯一のキーワード引数によってパラメータを渡すことができることを見ることができる唯一の名前から定義されたデフォルトパラメータとパラメータのデフォルト値はエラーに合格しない、合格しなければならないとして、実際には、あなたはそれを設定することはできません。
だから、最終的に秩序パラメータ角のすべての正式なパラメータがある:
**位置パラメータ、引数、デフォルトパラメータ、キーワードのパラメータのみ、 * kwargsから。**
名前空間とスコープ
名前空間
Pythonインタプリタが起動する実行した後、それは、メモリ内のスペースを開きますそれが変数に遭遇するたびに、名前と記録された値が、変数間の関係を置く関数定義、通訳に直面したとき単に関数名が変数と関数の内部ロジックに、インタプリタが心配されていないとして、関数が存在することを示す、メモリに読み込まれていない。機能がにロードされているだけの始まりであること、より多くの何も、関数が呼び出されたときにのみ置きますそして、訪問の時間は、インタプリタは関数内で宣言された変数に応じて内部変数のためのスペースを開きます。機能が完了すると、空間の関数として内部変数の機能が完成し空になります占めていました。
Pythonコードが出会いは、それが変数に遭遇するたびに、メモリ内のスペースで開かれた後にPythonインタプリタの実装の初めから、行う方法であることの機能を実行する際に、変数名と値を置くことを私たちは最初のリコール対応するレコードとの間の関係が、関数の定義に直面したとき、唯一のシンボリックインタプリタは、メモリなどの関数の名前を読みますが、インタプリタは気にしない、内部変数とロジックの機能として、この機能の存在を知っていました。
このような関数呼び出しを実行するとき、Pythonインタプリタは、この内部に格納するメモリ機能を開きます、この時間は、そこに変数だけが機能かについて懸念している、と変数の機能が新たに開かメモリに格納されているような、内部変数の機能は使用のみに機能することができ、このメモリの完成、すべての内容がクリアされるように機能します。
私たちは、この「リレーションシップ・ストアに名前と値の」名前をスペースを与えています:名前空間を。
呼ばれるストレージを作成するには、「変数名と値の関係の」宇宙の実行は、最初のコード、グローバル名前空間を。
実行機能に開か一時的なスペースがで呼び出され、ローカルな名前空間としても知られ、一時的な名前空間。
今、私たちは、PYファイル、保存されている値とグローバル名前空間と呼ばれるスペースの変数間の関係を知っているし、機能が実行されたときに、一時メモリは、変数の値の関数との関係を一時的に記憶するためのスペースを開きますこれは一時的な名前空間、またはローカル名前空間と呼ばれています。
実際には、パイソンと呼ばれるスペースがあり、組み込みの名前空間に保存されている特殊な変数組み込みの名前空間は、いくつかの機能を内蔵しており、その::入力、印刷、リストによってもたらされること、などであります
要約:
グローバル名前空間 - >ドキュメントに直接おPY、変数はグローバル名前空間に属し関数の外で宣言しました
ローカル名前空間 - >関数内で宣言した変数は、ローカル名前空間に保持されます
内蔵のネームスペース - >ストレージPythonインタプリタは、これらの組み込まれている名前空間をint型、名前、リスト、タプル、STRを提供してくれます
# 内置名称空间:python源码给你提供的一些内置的函数,print input # print(666) # python分为三个空间: # 内置名称空间(builtins.py) # 全局名称空间(当前py文件) # 局部名称空间(函数,函数执行时才开辟)
ロード順
、メモリ内に作成した3つのスペースの順であるために、メモリにロードされた3つのスペース、いわゆるロード順は、あなたは彼らが同時にそれを作成することができると思いますか?確かに、そして誰がそれを投稿する必要がありませんか?それに沿って我々ストローク:Pythonのインタープリターを開始した後、さらに任意の変数または関数を作成することなく、いくつかの機能が存在するであろう直接ABSなどを用いることができる(-1)、最大値(1,3 ) というように、Pythonのインタープリターを開始それは私たちの使用のためにメモリにインポートされたとき、それは最初の組み込みの名前空間にロードし、次にあなたが初期化変数が発生した場合は、この時点で、ラインごとにトップダウンからファイルを実行するために始めなければなりませんので、ですが、それは、グローバルネームスペースを作成します。関数がそのように変数の数の一時的な空間、ローディング機能を開くために、メモリ内に実行されたとき、これらの対応関係記憶部に、およびが満たさ。
:3つのスペースのロード順序だから、
>ローカル名前空間(プログラムの実行:コール・ロード) - : - >グローバル名前空間(上から下への負荷プログラムの実行)を内蔵した名前空間(プログラム・ロードを実行している始まりは) 。# 加载顺序: # 内置名称空间 ---> 全局名称空间 ----> 局部名称空间(函数执行时) def func(): pass func() a = 5 print(666)
オーダーの値
順序の値は変数を参照し、最初の参照を開始する空間です。変数:からの参照(参照のみが変数の層の上に変更することはできません)スペースの始まり:これは重要なポイントがあります。私たちは、それぞれ、示しています。
# 如果你在全局名称空间引用一个变量,先从全局名称空间引用,全局名称空间如果没有,才会向内置名称空间引用。 input = 666 print(input) # 666 # 如果你在局部名称空间引用一个变量,先从局部名称空间引用,局部名称空间如果没有,才会向全局名称空间引用,全局名称空间在没有,就会向内置名称空间引用。 input = 666 print(input) # 666 input = 666 def func(): input = 111 print(input) # 111 func()
次の例では、比較的明確です
# 取值顺序(就近原则) 单向不可逆 # LEGB原则 input = 'Dylan' def func(): input = 'xiaoyu' print(input) # xiaoyu func() # (从局部找时)局部名称空间 ---> 全局名称空间 ---> 内置名称名称空间 input = 'Dylan' def func(): print(input) # Dylan func() print(input) # Dylan
したがって、積載空間順の順序の値は、近接の原理を満足するための値を反転し、小から大基準範囲の範囲を徐々に層毎。
スコープ
スコープは、グローバルスコープとローカルスコープにビューの範囲の発効に応じて、スコープであります
グローバルスコープ:(⾏実行することにより、上から下へのフォロー)を内蔵した名前空間とファイル全体のグローバル名前空間のどこでも使用することができますが含まれています。
ローカルスコープは:関数内で使用することができます。
以下のためのドメイン名前空間を使用します:
1.グローバルスコープ:グローバルネームスペース+内蔵の名前空間
2.ローカルドメインとして:ローカル名前空間
内蔵機能のグローバル()、地元の人々()
組み込み関数の二つは言うここに正しい場所にいる、しかし、彼らは直接コンテンツのスコープを反映することができ、私たちはスコープの範囲を理解するのに役立ちます。
グローバル():グローバルスコープに対応関係辞書のフォーム内のすべての変数を返します。
()ローカル:変数の形で現在のスコープの対応関係辞書を返します。
ここで、1は現在のスコープはその後、我々はコード検証を使用し、明確にする必要があり、グローバルスコープです。
# 在全局作用域下打印,则他们获取的都是全局作用域的所有的内容。 a = 2 b = 3 print(globals()) print(locals()) ''' {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001806E50C0B8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/lnh.python/py project/teaching_show/day09~day15/function.py', '__cached__': None, 'a': 2, 'b': 3} ''' # 在局部作用域中打印。 a = 2 b = 3 def foo(): c = 3 print(globals()) # 和上面一样,还是全局作用域的内容 print(locals()) # {'c': 3} foo()
高階関数(ネストされた関数)
実際には、我々は、ネストされたリストを話した前に、ネストされたリストは、そこにリストのリストは、だから、定義、機能によって......そのリストが一覧表示可能性があり、ネストされた用語には見知らぬ人を見ていません巣は、関数、および機能です。
何も機能がない場合は、長い満たして関数名+()が呼び出された関数が呼び出されないように、それはさえ理解して理解:機能のキーポイントを理解し、ネストされた再生したいです。その後、我々は例を練習します。
# 例1:
def func1():
print('in func1') # 1
print(3) # 2
def func2():
print('in func2') # 4
print(4) # 5
func1()
print(1) # 3
func2()
print(2) # 6
# 例2:
def func1():
print('in func1') # 3
print(3) # 4
def func2():
print('in func2') # 2
func1()
print(4) # 5
print(1) # 1
func2()
print(2) # 6
# 例3:
def fun2():
print(2) # 2
def fun3():
print(6) # 4
print(4) # 3
fun3()
print(8) # 5
print(3) # 1
fun2()
print(5) # 6