Python-Task 5関数とlambda式


Python-Task 5関数とlambda式
学習内容
廖雪峰先生python教程https://www.liaoxuefeng.com/wiki/1016959663602400
小甲魚pythonチュートリアル:https://www.bilibili.com/video/av27789609?from=search&seid=697360651657412999
関数#カンスウ#
呼び出し関数
pythonは非常に柔軟に定義された関数をサポートし、それ自体に多くの有用な関数が内蔵されています.
関数の最も基本的なコード抽象方式です.
https://docs.python.org/3/library/functions.html
pythonには多くの内蔵関数があり、公式サイトで検索することができます.help(abs)を使用してabs関数のヘルプドキュメントを表示することもできます.
TypeErrorエラーはパラメータエラーに反応します.
max()and min()は複数のパラメータを有することができる
関数名は実は1つの関数オブジェクトの参照を指して、完全に関数名を1つの変数に与えることができて、この関数に1つの“別名”をつけたことに相当します
>>> i=int
>>> i(1.2)
1

関数の定義
関数を定義するには、def文を使用し、関数名、括弧、括弧のパラメータとコロン:を順に書き出します.その後、インデントブロックに関数体を記述し、関数の戻り値はreturn文で返されます.
x=input('your name:')
def my_hello(x):
    return 'hello '+x

print(my_hello(x))

return文がない場合はNoneが返されます.return Noneはreturnと略記されています
my_をhello()の関数定義はhelloとして保存されます.pyファイルの後、このファイルディレクトリの下で、from hello import my_hello()を使用する必要がない.py拡張子)はmy_をインポートできますhello()関数
>>> from hello import my_hello
>>> my_hello('wenjunjie')
'hello wenjunjie'

空の関数:pass文をプレースホルダとして使用
データ型チェックは、内蔵関数isinstance()を使用して実現できます.
if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')

関数は複数の値を返すことができます!!!
return a,bのような形をする
実際には1つの元祖を返しますが、文法的には1つの元祖を返して括弧を省略することができ、複数の変数は同時に1つのtupleを受け入れ、位置によって対応する値に値を割り当てることができます.
c,d=move(…)
関数のパラメータ
位置パラメータ:power(x,y)、x、yなどの形状は位置パラメータです.関数を呼び出すと,入力された2つの値は位置順にパラメータxとyに順次与えられる.
デフォルトパラメータ:いくつかのパラメータにデフォルトpower(x,y=2)を割り当て、2つの注意点があります.
1.必須パラメータは前、デフォルトパラメータは後
2.変化の大きいパラメータは前に、変化の小さいものは後ろに置く
 def enroll(name, gender, age=6, city='Beijing')
 enroll('Bob', 'M', 7)
 enroll('Adam', 'M', city='Tianjin')

デフォルトパラメータを定義するには、デフォルトパラメータが不変のオブジェクトを指す必要があります.
可変パラメータ:可変パラメータは、入力されたパラメータの個数が可変であり、1個、2個から任意個、0個であってもよい.
def calc(*numbers): #  ,             
calc(1,2,3,4,5...) #  
calc(*nums)  #nums   list tuple     list  tuple       *

キーワードパラメータ:キーワードパラメータを使用すると、0つまたは任意のパラメータ名を含むパラメータを入力できます.これらのキーワードパラメータは、関数内で自動的にdictに組み立てられます.
def person(name, age, **kw):    #  
    print('name:', name, 'age:', age, 'other:', kw)
person('Adam', 45, gender='M', job='Engineer')#  
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'} #  
person('Jack', 24, **extra)  #extra    
**extraは、extraというdictのすべてのkey-valueをキーワードパラメータで関数の**kwパラメータに入力することを示し、kwはdictを取得し、kwが取得したdictはextraのコピーであり、kwの変更は関数外のextraに影響しないことに注意する.
≪ネーミング・キー・パラメータ|Naming Key Parameters|oem_src≫:キーワード・パラメータと比較して、ネーミング・キー・パラメータにはキーワードの名前が表示されます.
def person(name, age, *, city, job): #  
    print(name, age, city, job)
person('Jack', 24, city='Beijing', job='Engineer') #  

名前付きキーワードパラメータには、名前付きキーワードパラメータとして扱われる特殊な区切り記号**の後のパラメータが必要です.
名前付きキーにはデフォルト値(デフォルト)があります.
パラメータの組み合わせ
パラメータ定義の順序は、必須パラメータ、デフォルトパラメータ、可変パラメータ、ネーミングキーパラメータ、キーワードパラメータでなければなりません.
任意の関数について、パラメータがどのように定義されているかにかかわらず、func(*args, **kw)のような形式で呼び出すことができる.
5種類までのパラメータを組み合わせることができますが、あまり組み合わせを使わないでください.そうしないと、関数インタフェースの理解性が悪くなります.
小さな練習
テーマ:1つ以上の数の積を求めます
def product(x,*y):
    ans=x
    for i in y:
        ans=ans*i
    return ans
*args**kwを使うのがPythonの書き方で、もちろん他のパラメータ名も使えますが、習慣的な使い方が望ましいです.
さいきかんすう
関数が内部で呼び出されること自体が再帰関数です.ロジッククリア
スタックオーバーフローを解決する方法,テール再帰最適化.
テール再帰とは、関数が返されると、自身が呼び出され、return文に式が含まれないことを意味します.これにより、コンパイラまたは解釈器は、再帰自体が何度呼び出されてもスタックフレームを1つだけ占有し、スタックオーバーフローが発生しないように、テール再帰を最適化することができる.
Python標準の解釈器はテール再帰を最適化せず,どの再帰関数にもスタックオーバーフローの問題がある.
小さな練習
ハノータ問題
def move(n,a,b,c):
    if n==1:
        print(a,'-->',c)
    else:
        move(n-1,a,c,b)
        move(1,a,b,c)
        move(n-1,b,a,c)
move(3, 'A', 'B', 'C')

Lambda式
>>> def fun1(x):      #      
...     return 2*x+1

>>> g=lambda x:2*x+1 #  lambda   


Lambda式を使用する目的
  • は、コードを
  • に簡略化する.
  • ネーミングを考慮する必要はありません.1、2回しか使用しない関数に対しては
  • が友好的です.
  • 簡易可読性
  • 補足BIF
    filter(function,iterator):フィルタiterator.反復iteratorの要素で、functionを経てtrueを返して結果に追加しないとフィルタされます.
    >>> list(filter(lambda x:x%2,range(20)))
    [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
    

    map(fun,iterator):マッピング.iteratorの要素をfunのパラメータとして順に処理した結果を結果シーケンスに加える
    >>> list(map(lambda x:x**2,range(10)))
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]