python 3入門(三)関数とlambda式、閉パッケージ


関数は、単一または関連する機能を実現するために組織され、再利用可能なコードセグメントです.
 
関数コードブロックはdefキーワードで始まる、関数識別子名と括弧()に続く.
任意の入力パラメータと引数は、カッコの中央に配置する必要があります.パラメータを定義するためにカッコ間を使用できます.
関数の最初の行の文は、文書文字列を選択的に使用することができる-関数の説明を格納するために使用される
関数の内容はコロンで始まり、にインデントされます.
Return[expression]は関数を終了し、呼び出し元に選択的に値を返します.式を持たないreturnは、None を返すことに相当する.
 
関数の定義:
def test0():
    "  _     "
    print('    ')

print(test0.__doc__)  #   _     

デフォルトパラメータを使用して関数を定義し、関数を呼び出すと、デフォルトパラメータの値が入力されない場合は、デフォルト値とみなされます.
def test1(arg1='   ', arg2='   '):
    print('arg1:'+arg1)
    print('arg2:'+arg2)

test1()  # arg1:     arg2:   

#      ,                          
test1('ice', 'cream')  # arg1:ice  arg2:cream
test1(arg2='cream', arg1='ice')  # arg1:ice  arg2:cream

ふていちょうパラメータ
.アスタリスク(*)を付けた変数名には、名前の付いていないすべての変数パラメータが格納されます.マルチパスパラメータを選択しなくてもいいです.
def test2(*args, param):
    print(len(args))
    for arg in args:
        print(arg)
    print(param)

test2(1, 2, 3, 4, param='This is param')


def test3(param, *args):
    print(param)
    print(len(args))
    for arg in args:
        print(arg)

test3('This is param', 1, 2, 3, 4)

すべてのパラメータ(引数)はPythonで参照で渡されます.関数でパラメータを変更すると、この関数を呼び出す関数で元のパラメータも変更されます.
def test4(mylist):
    print(mylist)
    mylist.clear()
    print(mylist)

mylist = [1, 2, 3, 4]
test4(mylist)
print(mylist)

#   :
# [1, 2, 3, 4]
# []
# []

return文[式]は関数を終了し、呼び出し元に選択的に式を返します.パラメータ値を持たないreturn文はNoneを返します
def test5():
    return (1, 2, 3, 4)


def test6():
    return 1, 2, 3, 4


def test7():
    return [1, 2, 3, 4]

result = test5()
print(result)  # (1, 2, 3, 4)

result = test6()
print(result)  # (1, 2, 3, 4)

result = test7()
print(result)  # [1, 2, 3, 4]

内部関数関数内では、関数を再定義できます.
def outerFunc():
    print('Outer Funtion')
    def innerFunc():
        print('Inner Function')
    innerFunc()
    
outerFunc()

#   :
# Outer Funtion
# Inner Function

関数変数のスコープ
 
関数の内部に定義された変数には局所的な役割ドメインがあり、関数の外に定義されたグローバルな役割ドメインがあります.
ローカル変数は宣言された関数の内部にのみアクセスでき、グローバル変数はプログラム全体にアクセスできます.関数を呼び出すと、関数内で宣言されたすべての変数名が役割ドメインに追加されます.
temp = 'ice cream'

def test8():
    "                "
    print(temp)


def test9():
    inner_temp = 'ice'
    print(inner_temp)

print(temp)  # ice cream
test8()  # ice cream
test9()  # ice


#                   
print(inner_temp)  #     name 'inner_temp' is not defined

def test10():
    print(temp)  #     local variable 'temp' referenced before assignment
    temp = 'ice'
    print(temp)

Python閉パッケージ
1つの内部関数で外部役割ドメイン(グローバル役割ドメインではない)の変数を参照すると、内部関数は閉パケット(closure)とみなされます.閉じたパッケージは、関数Aを呼び出し、この関数Aは関数Bを返します.この返される関数Bを閉パケットと呼ぶ.関数Aを呼び出すときに渡されるパラメータは自由変数です
def FuncX(x):
    def FuncY(y):
        return x * y
    return FuncY

tempFunc = FuncX(3)
result = tempFunc(5)
print(result)  # 15

result = FuncX(3)(5)
print(result)  # 15

匿名関数
python lambda式を使用して匿名関数を作成する
 
Lambdaはただの式で、関数体はdefよりずっと簡単ですLambdaの本体はコードブロックではなく式です.限られた論理をlambda式にカプセル化できるのはです
Lambda関数は独自の名前空間を持ち、独自のパラメータリスト以外またはグローバル名前空間のパラメータにアクセスできません.
Lambda関数は1行しか書けないように見えますが、CまたはC++のインライン関数とは等しくありません.後者の目的は、小さな関数を呼び出すときにスタックメモリを消費せずに実行効率を向上させることです.

 
Lambda関数の構文には、lambda[arg 1[,arg 2,.....argn]:expressionという文しか含まれません.
次のように使用します.
square = lambda x : x**2
print(square(3))  # 9

sum = lambda  x, y : x + y
print(sum(2, 3))  # 5

 
組み込み関数filterの使用:
公式文書の内容は以下の通りです.
filter(function, iterable)
Construct an iterator from those elements of iterable for which function returns true. iterable may be either a sequence, a container which supports iteration, or an iterator. If function is None, the identity function is assumed, that is, all elements of iterable that are false are removed.
 
functionパラメータはNone、関数、lambda式、iterableパラメータは反復可能なオブジェクトに転送されます.
functionパラメータがNoneの場合:反復可能なオブジェクト内のFalseでないすべての要素を返します.
functionパラメータが関数またはlambda式の場合:要素を関数パラメータとし、関数の戻り値がTrueの要素を返します.
reslut = filter(None, [1, 0, False, True])
print(list(reslut))  # [1, True]

def odd(num):
    return num % 2

reslut = filter(odd, range(10))
print(list(reslut))  # [1, 3, 5, 7, 9]

reslut = filter(lambda num: num % 2, range(10) )
print(list(reslut))  # [1, 3, 5, 7, 9]

ブログ園ブログ:ぺこぺこなかご