python 3カスタム関数

7380 ワード

関数の定義
関数コードブロックはdefキーワードで始まり、関数識別子名とカッコ()が続く.任意の入力パラメータと引数は、カッコの中央に配置する必要があります.カッコ間でパラメータを定義できます.関数の最初の行の文は、ドキュメント文字列を選択的に使用できます.関数の説明を保存します.関数の内容はコロンで始まり、インデントされます.
return[式]は関数を終了し、呼び出し元に選択的に値を返します.式を持たないreturnはNoneを返すことに相当します.
def test(a):
    a=a+1
    return a
test(1)

関数の戻り値
関数の戻り値が複数ある場合、1.受信しなくてもよい.1つの値で受信し、受信した値はメタグループタイプです.
3.戻り値と同じ数の変数で受信可能
def test():
    return 1,2,3

test()
a=test()
print(a)        #(1, 2, 3)
a1,a2,a3=test()
print(a1,a2,a3) #1 2 3

関数伝達パラメータ
位置パラメータとキーワードパラメータ
以下の2つはいずれも合法的です
def test(a,b):
    print(a)
    print(b)
test(b=1,a=2)	        #         
test(1,2)		#        

既定のパラメータ
関数を使用してパラメータの既定値を渡します.
def test(a,b=0):	#          ,    ,         
    print(a)
    print(b)
test(1)	#             
test(1,2)
test(a=10)

既定のパラメータトラップ
デフォルトのパラメータの値が可変データ型の場合、関数が呼び出されるたびに、
このデータ型のリソースを値なしで共有する場合
def test(a=[]):
    a.append(1)
    print(a)

test()
test()
test()

  
[1]
[1, 1]
[1, 1, 1]

 
ダイナミックパラメータ
 
任意のパラメータの動的パラメータを受信するには、*argsと*kwargsの2種類があります.*argsは*kwargsの前になければなりません.
順序:位置パラメータ、*args、デフォルトパラメータ、*kwargs
*args:受信した値は位置に従ってパラメータを伝達し、メタグループに組織されます.
**kwargs:キーワードのパラメータ値に従って辞書を構成することを受け入れます.
def test(*args):
    print(args)#      
    b=0
    for i in args:
        b=b+i
    print(b)
test()
test(1)
test(1,2)
test(1,2,3)

  
()
0
(1,)
1
(1, 2)
3
(1, 2, 3)
6

 
def test(**kwargs):
    print(kwargs)

test()
test(a=1)
test(a=1,b=2)

  
{}
{'a': 1}
{'a': 1, 'b': 2}

ダイナミックパラメータの別のパラメータ伝達方法
これは入力変数の前に星を付けて、入力変数を散らすことです.
 
def func(*args):#        ,     *,          。
    print(args)

l = [1,2,3,4,5]
func(1,2,3,4,5)
func(*l)  #        ,       *,             
func(l)

  
(1, 2, 3, 4, 5)
(1, 2, 3, 4, 5)
([1, 2, 3, 4, 5],)
def func(**kwargs):
    print(kwargs)

func(a=1,b=2)
d = {'a':1,'b':2} #      d
func(**d)

アスタリスクの役割は、入力変数を分散させることです.
print([1,2,3])  #[1, 2, 3]
print(*[1,2,3]) #1 2 3

関数のパラメータ伝達における変更可能オブジェクトと変更不可オブジェクトの違い
pythonではstrings,tuples,numbersは変更できないオブジェクトであり,list,dictなどは変更可能なオブジェクトである.可変タイプ:変数付与a=5の後にa=10を付与し、ここでは実際にint値オブジェクト10を新たに生成し、aを指し示すが、5は破棄され、aの値を変更するのではなく、新たにaを生成したことに相当する.
 
 
可変タイプ:変数付与la=[1,2,3,4]後の再付与la[2]=5はlist laの3番目の要素値を変更し、自身laは動かず、その内部の一部の値が変更されただけである.
 
 
python関数のパラメータ転送:可変タイプ:整数、文字列、メタグループなどのc++のような値転送.fun(a)のように,伝達されるのはaの値だけであり,aオブジェクト自体に影響を及ぼさない.例えばfun(a)内部でaの値を変更し、別のコピーされたオブジェクトを変更するだけで、a自体に影響を与えません.可変タイプ:リスト、辞書などのc++のような参照伝達.fun(la)のように、laを本当に伝え、修正するとfun外部のlaも影響を受けます
pythonではすべてオブジェクトであり、厳密には値の伝達か参照の伝達かは言えません.可変オブジェクトと可変オブジェクトの伝達と言うべきです.
def test(a):
    a[0]='a'

ss=[1,2,3]
test(ss[:]) #    ss
print(ss)   #[1, 2, 3]
test(ss)    #   ss
print(ss)   #['a', 2, 3]

 
名前空間と役割ドメイン
ネーミングスペース
3種類ある
内蔵ネーミングスペース-pythonインタプリタはpythonインタプリタが起動すると使用できる名前内蔵ネーミングスペースに格納内蔵された名前です.インタプリタを起動するとメモリにロードされます.私たちが書いたコードは、関数のコードではありません.プログラムが上から下まで実行される過程で順次メモリにロードされます.私たちが設定したすべての変数名と関数名のローカルネーミングスペースが配置されています.関数は関数の内部定義の名前です.関数を呼び出すと、このネーミングスペースが生成されます.関数の実行が終わるにつれて、このネーミングスペースはローカルに消えます.グローバル、組み込みネーミングスペースの名前グローバル:組み込みネーミングスペースの名前は使用できますが、ローカルでは使用できません.
 
内蔵:ローカルとグローバルの名前は使用できません.
通常の状況では、内蔵の名前を直接使用します.グローバルに内蔵の名前空間と同じ名前を定義したとき、グローバルの名前を使用します.私が持っているときは、私の上司を探していません.もし自分が持っていなければ、上位レベルを探していません.上位レベルを探していません.上位レベルを探していません.内蔵の名前空間がなければ、エラーを報告します.
 
 
複数の関数は、互いに共有しない複数の独立したローカル名前空間を持つべきです.
 
アクティブドメイン
役割ドメイングローバルに作用する2つのグローバル役割ドメイン--内蔵とグローバル名前空間に作用する名前はグローバル役割ドメインに属する--globals()ローカル役割ドメイン--ローカルに作用する--関数(ローカル名前空間における名前はローカル役割ドメインに属する)--locals()
globals()グローバルのすべての名前を永遠に印刷
locals()ローカル役割ドメインのすべてを出力し、何を出力するかは、localsが存在する位置によって異なります.
グローバルアクション
ローカルではグローバル役割ドメインの変数を表示できますが、直接変更することはできません.変更するには、プログラムの最初にglobal宣言を追加する必要があります.
ローカル(関数)内にglobal変数が宣言されている場合、この変数はローカルのすべての操作でグローバル変数に有効になります.
a=[1,2,3]
def test():
    print(a)
test()	#  [1,2,3]

 
a=[1,2,3]
def test():
    global  a
    a[0]=2
    print(a)
test()	#  [2,2,3]

 
 
 
関数のネストと役割ドメインチェーン
関数のネストされた呼び出し
def max2(x,y):
    m  = x if x>y else y
    return m

def max4(a,b,c,d):
    res1 = max2(a,b)
    res2 = max2(res1,c)
    res3 = max2(res2,d)
    return res3

関数のネスト定義(レイヤ数に制限なし)
def f1():
    print("in f1")
    def f2():
        print("in f2")

    f2()
f1()

関数の役割ドメインチェーン
def f1():
    a = 1
    def f2():
        print(a)
    f2()

f1()    #  1

 
def f1():
    a = 1
    def f2():
        def f3():
            print(a)
        f3()
    f2()

f1()        #  1
def f1():
    a = 1
    def f2():
        a = 2
    f2()
    print(a)

f1()        #  1

 
nonlocalキーワード
彼は、現在の関数に最も近い上位レベルのローカル変数を探すためにしか使用できません.外部にはこの変数が必要です.内部関数がnonlocal変数を宣言するまで、同じ名前の変数は表示されません.
 
 
3.内部修正この変数を外部にこの変数がある第1層関数で有効にしたい場合
 
def f1():
    a = 1
    def f2():
        nonlocal a
        a = 2
    f2()
    print(a)

f1()        #  2

 
関数名の本質
 
関数名は本質的に関数のメモリアドレスです
1.参照可能
def func():
    print('in func')

f = func
print(f)    #

2.コンテナタイプとして使用できる要素
def f1():
    print('f1')

def f2():
    print('f2')

def f3():
    print('f3')

l = [f1,f2,f3]
d = {'f1':f1,'f2':f2,'f3':f3}
#  
l[0]()  #  f1
d['f2']()   #  f2

3.関数のパラメータと戻り値は、通常変数が第1クラスオブジェクト(first-class object)で1を指すものとすることができる.実行期間に2を作成できます.関数パラメータまたは戻り値として使用できます.
3.変数を格納できるエンティティ.
クローズドパッケージ
閉包関数:内部関数には、全体の役割ドメイン名ではなく外部の役割ドメインへの参照が含まれています.この内部関数を閉包関数psと呼びます.関数内部で定義された関数を内部関数と呼びます.役割ドメインの関係があるため、関数内部の変数と関数数を得ることはできません.もし私たちが取りたいならどうしますか?帰れ!関数内の変数を関数の外部で使用するには、この変数を直接返すことができることを知っていますが、関数の外部で関数内部の関数を呼び出したい場合は?この関数の名前をそのまま戻せばいいのではないでしょうか.これこそ閉包関数で最もよく使われる使い方です
簡単に言えばいくつかの変数の生存周期を保護し、
def test():
    a=1
    def inner():
        nonlocal a
        a=a+1
        print(a)
    return  inner
inn=test()

inn()   #  2
inn()   #  3
inn()   #  4

閉包関数の判断方法_closure__
#出力の_closure__cell要素あり:閉パッケージ関数
def func():
    name = 'eva'
    def inner():
        print(name)
    print(inner.__closure__)
    return inner

f = func()
f()

#   __closure__ None :      
name = 'egon'
def func2():
    def inner():
        print(name)
    print(inner.__closure__)
    return inner

f2 = func2()
f2()

閉じたネスト
def wrapper():
    money = 1000
    def func():
        name = 'eva'
        def inner():
            print(name,money)
        return inner
    return func

f = wrapper()
i = f()
i()

閉包関数取得ネットワークアプリケーション
from urllib.request import urlopen

def index():
    url = "http://www.xiaohua100.cn/index.html"
    def get():
        return urlopen(url).read()
    return get

xiaohua = index()
content = xiaohua()
print(content)