楽しい楽しいお勉強日記

IT系の勉強や読書記録を書きます。勉強大好き!(自己暗示)

Python公式チュートリアルを頑張って読んでいる ラムダ・キーワード引数

これです。

docs.python.org

 

言語はPythonが初めてです。

 

すごいひと「プログラミングは公式ドキュメント読めば分かるよ」

僕「わかりました!」

...

僕「メソッド?クラス?分からんやめよ」

僕「リストとかのこういうの(['kiwi', 'apple', 'banana'])入力するの面倒だからやめよ」

公式ドキュメント「1.やる気を高めよう」

僕「」

 

 

めちゃくちゃゆっくりなペースですが読んでます。

分かるひとには何を当たり前な事を...って感じですけど自分用の記録として。

 

 

 

 

4.7.5. ラムダ式

lambdaで名前の無い関数を作れる。

docs.python.org

 

defでmake_incrementorって関数作って、その中にlambdaで関数作ってる↓

nは仮の引数?

>>> def make_incrementor(n):

...     return lambda x: x + n

...

 

make_incrementorをfに代入してる。呼び出す時楽だからかな?↓

>>> f = make_incrementor(42)

>>> f(0)

42

>>> f(1)

43

 

 

最初見たとき何で4,1,3,2の順番なのか5分ぐらい分からなかったw

>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]

>>> pairs.sort(key=lambda pair: pair[1])

>>> pairs

[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

これは辞書の二つ目の要素でソート「pair: pair[1]」してるのでアルファベットでソートされてる。

 

辞書の1つ目の要素でソート「pair: pair[0]」すれば数字でソートできる。

>>> pairs = [(1, "one"), (2, "two"), (3, "three"), (4, "four")]

>>> pairs.sort(key=lambda pair: pair[0])

>>> pairs

[('one', 1), ('two', 2), ('three', 3), ('four', 4)]

 

それか辞書の要素の順番を入れ替えるかすれば数字でソート出来る(これは無いか)

>>> pairs = [("one", 1), ("two", 2), ("three", 3), ("four", 4)]

>>> pairs.sort(key=lambda pair: pair[1])

>>> pairs

[('one', 1), ('two', 2), ('three', 3), ('four', 4)]

 

 

4.7.2. キーワード引数

関数には必須引数とオプション引数を指定出来る。

docs.python.org

 

↓のvoltageが必須引数、state,action,typeがオプション引数。

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):

    print("-- This parrot wouldn't", action, end=' ')

    print("if you put", voltage, "volts through it.")

    print("-- Lovely plumage, the", type)

    print("-- It's", state, "!")

 

parrot関数を呼び出す時、必須引数(ここだとvoltage)は入れないとだめ。

オプション引数は何も入れなければ、関数で指定されてる値が勝手に入る。

関数を呼び出す際に一緒に入れる引数は、カンマで区切られた順に割り当てられる?

parrot('a million', 'bereft of life', 'jump')なら、

voltage引数にはa millionが、

state引数にはbereft of lifeが、

action引数にはjumpが入る。

type引数は指定してないのでNorwegian Blueが入る。

 

引数を指定する事も出来る。

parrot(action='VOOOOOM', voltage=1000000)

 

これはだめらしい。

✖︎ parrot(voltage=5.0, 'dead')

多分これ↓ならok、引数を指定する場合は、指定してない引数よりも後ろにしなきゃいけないみたい。

◎ parrot('dead', voltage=5.0)

 

 

 

あとこれ。初見で全く意味が分からなくて理解するのに時間かかった。

↓関数作る

def cheeseshop(kind, *arguments, **keywords):

    print("-- Do you have any", kind, "?")

    print("-- I'm sorry, we're all out of", kind)

    for arg in arguments:

        print(arg)

    print("-" * 40)

    for kw in keywords:

        print(kw, ":", keywords[kw])

 

↓関数呼び出す

cheeseshop("Limburger", "It's very runny, sir.",

           "It's really very, VERY runny, sir.",

           shopkeeper="Michael Palin",

           client="John Cleese",

           sketch="Cheese Shop Sketch")

 

↓出力

-- Do you have any Limburger ?

-- I'm sorry, we're all out of Limburger

It's very runny, sir.

It's really very, VERY runny, sir.

----------------------------------------

shopkeeper : Michael Palin

client : John Cleese

sketch : Cheese Shop Sketch

 

 

def cheeseshop(kind, *arguments, **keywords):

↑の*argumentsで引数をカンマで区切ってたくさん指定出来るって意味らしい。

↑の例だと、⑴"It's very runny, sir.","It's really very, ⑵VERY runny, sir."で二つの引数を指定してる。forで回してる。

 

で、どっからが**keywords何だ?カンマでずっと区切ってるじゃん、ずっと*argumentsの範囲やろ。って思ってたけど、a=bみたいになってるやつを辞書として受け取ってるみたい。**keywordsが受け取ってるのはこいつら↓

shopkeeper="Michael Palin",

           client="John Cleese",

           sketch="Cheese Shop Sketch"

 

こちらの解説が分かりやすかった。

note.nkmk.me

 

 

使いこなせるまでまだまだ先は長い...というかいつ使うんだろ...