'''
lambda表达式练习
'''

import random

# test

class User:
    def __init__(self, name = '', age = 0):
        self.name = name
        self.age = age
    
    def intro(self):
        print("My name is {}, My age is {}".format(self.name, self.age))

def randName(len: int = 5) -> str:
    """
    根据传入的数字生成对应长度的随机字符串
    
    Parameters:
    len - 待生成的字符串长度
    
    Returns:
        对应长度的随机字符串
    
    Raises:
        None
    """
    str = 'abcdefghijklmnopqrstuvwxyz'
    name = ''
    for i in range(len):
        idx = random.randint(0, 25)
        s = str[idx]
        if name == '':
            s = s.upper()
        name += s
    return name

userlist = []
for i in range(1, 10):
    userlist.append(User(randName(random.randint(5, 10)), random.randint(15, 60)))

'''
filter(function, iterable)
对可迭代对象进行过滤,参数function是一个函数,参数iterable是可迭代对象。
filter()函数调用时iterable会遍历,它的元素被逐一传入funciton函数,function函数返回布尔值。
在funciton函数中编写过滤条件,如果为true则保留,为false则被过滤掉
'''
cuser = filter(lambda u: u.name.startswith('C'), userlist)
print("filter:")
for u in cuser:
    u.intro()


'''
map(function, iterable)
对可迭代对象的元素进行变换,参数使用同上
'''
print("map:")
# map(lambda u: u.name.lower(), userlist)
# for u in userlist:
#     u.intro()

users = ['jack', 'Tom', 'Tony', 'Alice']
users_map = map(lambda u: u.lower(), users)  
print(list(users_map))

users_map = map(lambda u: u.lower(), filter(lambda u: u.startswith('T'), users))
print(list(users_map))


"""
reduce的作用是先把列表中的前俩个元素取出计算出一个值然后临时保存着,
接下来用这个临时保存的值和列表中第三个元素进行计算,求出一个新的值将最开始
临时保存的值覆盖掉,然后在用这个新的临时值和列表中第四个元素计算.依次类推
"""
from functools import reduce

na = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print("reduce:")
print(reduce(lambda x, y: x * 10 + y, na))