函数

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# def func, snake case
# return value

# no args, no return
def add_two_number():
    print('a')

# 1 arg
def add_two_number_1(x):
    return x + 5 # return value

# return multiple value 
def two_number_2(x, y):
    c = x + y
    d = x - y
    return c, d

# args
def add_number(x, y, *args):
    print(f'x = {x}')
    print(f'y = {y}')
    print(f'args = {args} ')

# kwargs
# 
def add_number_1(x, y, *args, **kwargs):
    print(f'x = {x}')
    print(f'y = {y}') # f-string f'this is string, {x}'
    print(f'args = {args} ')
    print(f'kwargs = {kwargs} ')
# wrong
# def add_number_2(**kwargs, *args, x, y)
    # pass

# default
def add_number_3(x, y, c=10, d = True):
    print(c)

if __name__ == '__main__':
    # add_two_number()
    # print(add_two_number_1(6))
    # print(two_number_2(10, 5))
    # add_number(1,2, 3, 4, 5, 6)
    # add_number_1(1,2,3,4,5, total=5, ok=6)
    add_number_3(1,2, 20)

##高级用法

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from datetime import datetime

# lambda
b1 = lambda  :  print('ok')
b2 = lambda x :  print('ok')
b3 = lambda x, y :  x * y
sum_1 = lambda x, y: x+y
sub_1 = lambda x, y:x-y

# 函数作为参数
def call_func_demo(func, *args, **kwargs):
    ''' call another function

    Args:
        func the function
        args arguments
        kwargs key work arguments
    Returns:
        new function
    '''
    return func(*args, **kwargs)

# 偏函数
def sum_5(y):
    '''add 5 to y

    '''
    return sum_1(5, y)

# 函数作为返回值
def log_time(func):
    ''' the decorator to log the function spent time
    '''
    # 1 define a function
    def inner(*args, **kwargs):
        t1 = datetime.now()
        res = func(*args, **kwargs)
        t2 = datetime.now()
        print(t2 - t1)
        return res
    # 2 return it
    return inner

# decorator
@log_time
def call_func(func, *args, **kwargs):
    return func(*args, **kwargs)




if __name__ == '__main__':
    a = [5, 7]
    print(call_func(sum_1, *tuple(a)))
    print(call_func(sub_1, *tuple(a)))