40のおっさんのPython学習記録

20年以上前、学部の必修のC言語が全く理解できずに同級生に放り投げ、その後コーディングから遠ざかったガチ文系のおっさんが、ふと思い立ってPythonに挑戦しています。

新たな気づき(Chapter 11-1)

久しぶりですね。行きています。週末って意味では先々週は旅行に行ってたのと、旅行帰りの週に飲み会が続き、ヘロヘロになっているところに金曜の飲み会で泥酔し、二日酔いがひどく、週末はひたすら休養を取らざるをえないと言う実におっさんらしい情けない状況でした。只今、ウィークデーの夜のもくもく会の会場からお送りしています。尚おっさん、再来週は1週間海外出張なので、週末はほぼ移動する必要があり、ここで2週末はほぼ何もできないことが確定。そして出張中はどうせ疲れ果てて何もする気が起きないに決まっている。おっさんはおっさんなので、海外出張に行くと疲れ果てて、1日の予定が終わるともうホテルでくたばるしかすることがない。本当にダメだ。

  • 関数は数値や文字列と同じように扱うことができる。既定義の関数func1()がある場合、func2=func1と書けば(カッコは書かない)、以後func2()はfunc1()と同じ動きをする。
  • また、以下のように関数を関数の引数にすることもできる。
def calc(func,arg=1):
    price = func(arg)      #funcに代入されるchild(arg)もしくはadult(arg)が実行される。
    return price

def child(arg):
    return 400 * arg

def adult(arg):
    return 1200 * arg

age=input("年齢は?:")
#age = 8
num=input("何人?")
#num =3

if int(age)<12:
    print(f"{age}歳が{num}人なので{calc(child, num):,}円を払え")
else:
    print(f"{age}歳が{num}人なので{calc(adult, num):,}円を払え")

Python Tips: Python でクロージャを使いたい - Life with Python
上のサイトを参考にさせていただいたのだけれど、

def gen_circle_area_func(pi):
    """円の面積を求める関数を返す"""
    def circle_area(radius):
        # ここの pi は circle_area_func に渡された pi が使われる
        return pi * radius ** 2

    return circle_area

# 円周率を 3.14 として円の面積を計算する関数を作成
circle_area1 = gen_circle_area_func(3.14)
print(circle_area1(1))  # => 3.14
print(circle_area1(2))  # => 12.56

# 次は、円周率の精度をぐっと上げて
# 円周率 3.141592 で円の面積を計算する関数を作成
circle_area2 = gen_circle_area_func(3.141592)
print(circle_area2(1))  # => 3.141592
print(circle_area2(2))  # => 12.56638

僕にはcircle_area1(1)で半径1がgen_circle_area_func(3.14)の中のradiusに引き渡される理屈が全くわからない。本当に直感で理解できない。こういうもんなの?

  • ラムダ式は lambda 引数:処理内容 と書く、例えば
lambda x,y:x+y

であれば、xとyが渡されるとx+yが実行される。

(lambda x,y:x+y)(1,2)

の様に書くことでx+y=1+2=3が実行される。要は、

def func(x,y):
    return x+y

を1行で書いたようなもん。じゃあ、だから何、って感じなのだけれど、lambda式でよく利用されるのがソートへの応用。

list = [[10,4],[3,6],[4,6],[5,0],[4,9],[2,0]]
list.sort(key=lambda x:(x[0],x[1])) #1番目でソートし、2番めでソート
print(list)

上の事例の場合はx:(x[0],x[1])と書くことで、まずは1列目x[0]でソートした上で、2列めx[1]をソートする。とりあえず、x:x[1]と書くことで、xがリストを指し、x[i]がリストのi+1番目の要素と認識される模様。この辺の間隔がマジで意味がわかんねえよ。マヂ無理。

  • map関数もラムダ式を利用する事のできる関数。map(関数, イテラブル)と書く。単純言うと、map関数を使うと、イテラブルとして与えられたリスト等の中の要素の全てに関数で記述した処理を行うことができる。例えば数のリストに対してその数をすべて2倍にする等。

>>||
>>> nums = [4,3,8,6,2]
>>> nums2= list(map(lambda x:x*2,nums))
>>> print(nums2)
[8, 6, 16, 12, 4]
|