茨の道も一歩から

インフラ構築からプログラミング(Python・JavaScript)までITに関するブログです。

74日目:Pythonプログラミング

Pythonプログラミングの講義8日目。

講義のコマ割りが明らかに初心者向け。内部関数、クロージャ、lambda、ジェネレータ、デコレータを1コマでサラッと説明。

基本構文までをサラッと流して、ここらへんからジックリ講義した方が、良いのだけどなぁ。

  • 参考テキスト

【講義内容】

  • Chapter3 条件分岐と繰り返し、関数を使う

【ワンポイント】

可変長引数

def func(*args):
    if args:
        for i in range(len(args)):
            print(f'args[{i}]: {args[i]}')

a = 'A'
b = 'B'
c = 'C'
func(a)
func(a, b)
func(a, b, c)

def func2(arg1, *args, arg2):
    print(arg1, args, arg2)

a = 'A'
b = ['B', 'D']
c = 'C'
func2(a, arg2=c)
func2(a, 'B', 'D', 'E', arg2=c)
#func2(arg2=c, *b, arg1=a)

辞書型キーワード引数

def func(**kwargs):
    if kwargs:
        print(kwargs)

o = {'a': 'A', 'b': 'B'}
func(a='A', b='B')
func(**o)

高階関数

a = 5
b = 3
def add(a, b):
    return a+b

def sub(a, b):
    return a-b

def dofunc(func, a, b):
    return func(a, b)

dofunc(add, a, b)
dofunc(sub, a, b)

内部関数

def outer(s):
    def inner():
        return s+'@@@'
    return inner

i = outer('what is s.')
print(i())
print(i())


def outer2(s):
    print(f'OUTER: {id(s)}')
    def inner2():
        print(f'INNER: {id(s)}')
        return s + '!!!'
    return inner2

s = 'what is s'
print(f'GLOBAL: {id(s)}')
i2 = outer2(s)
print(i2())
print(i2())

クロージャ

def click_counter(i):
    def click():
        return i+1
    return click

c0 = click_counter(0)
print(c0())
print(c0())


def click_counter1(i):
    def click():
        nonlocal i
        i += 1
        return i
    return click

c1 = click_counter1(0)

print(c1())
print(c1())

c2 = click_counter1(3)

print(c2())
print(c2())

lambda式

def tostr(i):
    return str(i)

def iconv(l, func):
    for i in l:
        print(func(i))

iconv(range(5), tostr)
iconv(range(5), lambda i: '@' * i)

ジェネレータ

def countdown(i):
    for i in range(i,0,-1):
        yield i
 
t = countdown(5)
print(next(t))
print(next(t))
print(next(t))

【今日の積み上げ】