import random
#1:+=:是否地址发生改变(发生改变)
num = 1
print(id(num))
num += num
print(id(num))

# 2:匿名函数:用于简化函数的代码
# 格式:lambda [形参1] [形参2] : [单行表达式]/[函数调用]
# 特点:只能写一行  无return关键字

def sum_num (num1, num2):
    result = num1 + num2
    return result
value = sum_num(1, 2)
print(value)

new_func = lambda x, y: x + y
value = new_func(1, 2)

#3: 无参匿名函数
new_func1 = lambda : print("我是无参匿名函数")
new_func1()

# 4: 把匿名函数当做参数传递给另一个函数:建立一个函数,让他传递什么方法内部变量就进行什么操作。
def calculate_value(func):
    num1 = 1
    num2 = 2
    result = func(num1, num2)
    print(result)

def add_num(v1, v2):
    return v1 + v2
calculate_value(add_num)

# 简化  :
calculate_value(lambda x, y: x+y)


# 5:列表推导式:利用for循环快速创建列表
#语法格式:返回值  for value in 容器类型的数据

# 快速创建列表,里面有1到5的数据
new_list = [value for value in range(1, 6)]
print(new_list, type(new_list))

#创建1到5里面的偶数列表
new_list2 = [value for value in range(1, 6) if value % 2 == 0]
print(new_list2, type(new_list2))

#将字符串变成列表并且加倍
my_str = "abcd"
new_list3 = [value * 2 for value in my_str]
print(new_list3)

#多循环使用
new_list4 = [(x, y) for x in range(1, 3) for y in range(2, 4)]
print(new_list4)

# 练习题1:
my_tuple = ({"name": "张三", "age": 23}, {"name": "李四", "age": 18})
#把年龄大于20的字典取出放在列表里
new_list5 = [my_dict for my_dict in my_tuple if my_dict["age"] >= 20]
print(new_list5)


# 练习题2:
#利用列表推导式,5个产生1到10个随机数放在列表表里
new_list6 = [random.randint(1, 10) for value in range(5)]
print(new_list6)

#练习题3:
#定义一个字典,把字典中的键,键值对,值,分别做一次存储到列表
my_dict = {"name": "任善文", "age": 23, "sex": "男"}
new_list7 = [value for value in my_dict.values()]
print(new_list7)

new_list8 = [key for key in my_dict.keys()]
print(new_list8)

new_list9 = [item for item in my_dict.items()]
print(new_list9)
# 输出结果:
# ['任善文', 23, '男']
# ['name', 'age', 'sex']
# [('name', '任善文'), ('age', 23), ('sex', '男')]

#练习题4:利用列表推导式,把姓张的数据过滤出来放在一个列表里
my_list = [{"name": "张三", "age": 23}, {"name": "李四", "age": 24}, {"name": "张三丰", "age": 25}]
value = [item for item in my_list if item["name"][0] == "张"]
print(value)

# 输出: [{'name': '张三', 'age': 23}, {'name': '张三丰', 'age': 25}]

# 练习题5 :利用列表推导式,把姓名是张三丰,年龄等于25的人过滤出来
value = [item for item in my_list if item["name"] == "张三丰" and item["age"] == 25]
print(value)
# 输出结果:[{'name': '张三丰', 'age': 25}]

# 练习6:利用列表推导式,将元组转化成字典列表
my_list2 = [("李四", 20), ('王五', 24)]
value = [{"name": name, "age": age}for name, age in my_list2]
print(value)



from functools import  reduce

# 1:集合

#集合{1, 2,3, 4}
#集合的作用:去除重复数据,特点:唯一  无序  可变

#不能通过下标获取和修改集合的内容
# 定义空集合只能用set方法,不能用{},因为空花括号表示字典
#集合只能存在不可变类型

my_set = {'a', 'b', 'c', 1, 2, 3}
my_set.add('d')
print(my_set)

my_set.remove(1)
print(my_set)

# 获取集合中的数据
for value in my_set:
    print(value, end=" ")

print()
v1, v2, v3, v4, v5, v6 = my_set
print(v1, v2, v3, v4, v5, v6)


# 清空集合:
my_set.clear()
print(my_set)
#set()  输出结果是set()


# 利用集合对容器类型进行去重
my_lsit = [1, 2, 1]
my_set = set(my_lsit)
my_lsit = list(my_set)
print(my_lsit)


my_tuple = (1, 2, 1)
my_set = set(my_tuple)
my_tuple = tuple(my_set)
print(my_tuple)


# 2:高阶函数:函数内再次定义一个函数
#首先执行show_info 将inner_func返回给new_func,
# new_func此时不执行,等最后new_func()执行后才执行
def show_info():
    print("show_info执行了!!")
    def inner_func():
        print("inner_fun执行了!!")
    return inner_func

new_func = show_info()
new_func()


# 3:python提供的高阶函数----reduce(函数,变量)
my_tuple = ('a', 'b', 'c')

# def join_str(v1, v2):
#     return v1 + v2
#
# result = reduce(join_str, my_tuple)
# print(result, type(result))


#使用lambda 表达式

result = reduce(lambda x, y: x + y, my_tuple)
print(result, type(result))

print("--------------------------------------")
# 4:filter() :用法对容器类的每个数据进行过滤   不用导入包,返回的是filter类型

# my_list = ['ab', 'cd', 'abc']
#
# def search_value(value):
#     return value.endwith("b")
#
# new_filter = filter(search_value, my_list)
# print(new_filter, type(new_filter))
# new_list = list(new_filter)
# print(new_list)


#5:filter的案例:
my_list = [{"name": "李四", "age": 21}, {"name": "王五", "age": 21}, {"name": "张三", "age": 19}]
new_filter = filter(lambda my_dict: my_dict["age"] > 20, my_list)
new_list = list(new_filter)
print(new_list)