Python 4日目勉強

5712 ワード

python関数基礎2019-05-18--張伯羽
1.変長パラメータ
  • 一つ*:パラメータを一つのグループに入れる
  • def self_print(*a):
        print(a)
        print(type(a))
    self_print(1,2,3,4,5,6)
    
    (1, 2, 3, 4, 5, 6)
    
    
  • 両方*:パラメータを1つの辞書に入れる
  • def d_self_print(**kwargs):
        print(kwargs)
    d_self_print(last_name=' ', first_name='  ')
    
    {'last_name': ' ', 'first_name': '  '}
    
  • パラメータ順:位置パラメータ->タプル->辞書
  • def mix(name, *t, **kw):
        print(name)
        print(t)
        print(kw)
    
    mix(' ', 20, 'dongqin', gender=' ')
    
     
    (20, 'dongqin')
    {'gender': ' '}
    
  • 一つ*メタグループとリストを外すことができる
  • t = (1,2,3,4,5)
    print(*t)
    def f(*tt):
        print(tt)
    f(*[1,2,3,4,5])
    
    1 2 3 4 5
    (1, 2, 3, 4, 5)
    
  • 2個*辞書を外すことができる
  • def ff(**kwargs):
        print(kwargs)
    ff(**{'name':'zhang', 'age':20})
    
    {'name': 'zhang', 'age': 20}
    
  • return戻り値
  • def sum_and_avg(*numbers):
        total = sum(numbers)
        avg_number = total/len(numbers)
        return total, avg_number
    
    sum, avg = sum_and_avg(1,2,3,4,5,6,7,8,9,10)
    print("   %f" % sum)
    print("    %f" % avg)
    

    2.関数の参照問題
    データは参照タイプに分けられ、通常タイプpythonの基本データ型はすべて通常タイプ、数、ブール型、文字列型それ以外のタイプはすべて参照タイプ普通タイプ賦値時伝のは値で、参照タイプ賦値時伝のはアドレスです
    l1 = [1,2,3,4,5]
    l2 = l1
    #        
    l2[1] = 5
    print(l1)
    
    [1, 5, 3, 4, 5]
    

    パラメータの本質は付与操作であり、参照タイプのデータが渡されている場合は、関数で変更されているかどうかに注意する必要があります.
  • numbers[:]でコピー可能
  • def power(numbers):
        # numbers = {x**2 for x in numbers}
        numbers = numbers[:]
        #     
        numbers = list(numbers)
        #    
        numbers[3] = 10
        return numbers
    
    nums = [1,2,3,4,5,6]
    print(power(nums))
    print(nums)
    
    [1, 2, 3, 10, 5, 6]
    [1, 2, 3, 4, 5, 6]
    

    3.関数の閉パッケージ
  • 関数名本質は関数のアドレスを表す
  • def fun():
        print('Hello World!')
    fx = fun()
    fx
    
    Hello World!
    
  • 内層関数は外層関数の変数にアクセスできるが、修正できない
  • 内層関数が変数にアクセスするときはまず自分から検索し、見つからない場合は上から検索する
  • pythonにおける変数の役割ドメインは関数単位
  • global修飾変数の場合、最外層のグローバル変数を使用していることを説明
  • nolocalが変数を修飾する場合、ネスト層関数を用いた変数閉包の本質が関数ネスト関数であることを説明し、外層関数が内層関数のアドレスを返す
  • aa = 10
    def outter():
        aa = 10
        def inner():
            #            
            # global a
            nonlocal aa
            aa -= 1
            print(aa)
            print('hello inner')
    
        return inner
    fo = outter()
    fo()
    fo()
    fo()
    
    9
    hello inner
    8
    hello inner
    7
    hello inner
    

    4.再帰
    関数は自分で自分を呼び出して、再帰あるいは循環を編纂して一般的に出口(終わりの条件)の問題を先に考慮します
  • 階乗を求める質問
  • def factorial(n):
        res = 1
        for num in range(1, n+1):
            res *= num
        return res
    
    print(factorial(5))
    
    120
    
  • フィボナッチ数列1.再帰
  • #   
    def feibonaqi2(n):
        if n==1 or n==2:
            return 1
        else:
            return feibonaqi2(n-1) + feibonaqi2(n-2)
    list = []
    for i in range(1, num+1):
        list.append(feibonaqi2(i))
    print(list)
    
    [1, 1, 2, 3, 5]
    

    2.サイクル
    #   for  
    def feibonaqi3(n):
        before = 0
        after = 1
        if n==1:
            return 1
        for i in range(2, n+1):
            tmp = before + after
            # before = after
            # after = tmp
            before, after = after, tmp
        return tmp
    list2 = []
    for i in range(1, num+1):
        list2.append(feibonaqi3(i))
    print(list2)
    
    [1, 1, 2, 3, 5]
    
  • 高次関数、パラメータまたは戻り値は関数の関数
  • 累積
  • def handle(func, *param):
        return func(*param)
    def my_sum(*param):
        sum = 0
        for i in range(len(param)):
            sum += param[i]
        return sum
    print(my_sum(1,2,3,4,5))
    
    #            
    print(handle(my_sum, 1, 2, 3, 4, 5))
    
    15
    15
    
  • 累乗
  • print(handle(my_sum, 1, 2, 3, 4, 5))
    def my_mul(*param):
        """
          
        :param param:
        :return:
        """
        mul = 1
        for v in param:
            mul *= v
    
        return mul
    print(handle(my_mul, 1,2,3,4,5))
    
    120
    
  • map(func,inteable)

  • この関数はinteableのデータをfunc関数処理に順次渡し,最後に処理の結果を返す.
    # [1,2,3,4,5]->[1,4,9,16,25]
    def power(x):
        return x * x
    # result = map(power, [1,2,3,4,5,6])
    result = map(lambda x:x*x, [1,2,3,4,5,6])
    # for i in result:
    #     print(i)
    print(list(result))
    
    [1, 4, 9, 16, 25, 36]
    
  • reduce(func,interable)関数
  • 累積操作ではfunc関数は2つのパラメータを受信する必要があります.reduceはfuncの実行結果を1つのパラメータとして、inteableからもう1つのデータを別のパラメータとして取り出します.
    from functools import reduce
    li = [1,2,3,4,5,6]
    result = reduce(lambda x,y:x*y,li)
    #1*2=2 2*3=6 6*4=24...
    print(result)
    
    720
    
  • filter(func,interable)

  • 関数funcに基づいてinterableをフィルタリングし、interableのデータを関数funcに転送します.関数がTrueを返すと、そのデータは保持されます.そうしないと保持されません.
    li = [1, 2, 4, 5, 6, 9, 10, 15]
    result = list(filter(lambda x: x % 2 == 1, li))
    print(result)
    
    [1, 5, 9, 15]
    
  • sort(interablen, kry = none, reverse = False)

  • データをソートします.keyはソートのルールを指定します.値は関数で、reverseはソートの順序を指定します.->昇順または降順
    li = [1, 2, -4, -10, 12]
    # rs = li.sort() #     
    res = sorted(li[:], key=abs, reverse=True)
    print(res)
    print(li)
    
    [12, -10, -4, 2, 1]
    [1, 2, -4, -10, 12]