"""
推导式的范围：只支持  列表，字典，集合  这三个可变类型的序列
作用：1.利用其他可迭代（可遍历）的对象创建一个新的列表，字典，或者集合
        2.可对得到的元素进行转换或者筛选。
        3. 简化代码
原理：类似for循环
"""
# 列表推导式语法：
# 变量名 = [表达式 for 变量 in 可迭代对象]   或者   变量名 = [表达式 for 变量 in 可迭代对象 for 变量 in  ......]
# 变量名 = [表达式 for 变量 in 可迭代对象 if 条件]
# 可迭代对象就是可以遍历的对象，如list列表，set集合，str字符串，tuple元组，dict字典等
"""
执行流程：
        1.把可迭代对象中遍历出来的内容给变量，然后表达式根据变量值进行逻辑运算。
        2.或者先把可迭代对象中遍历出来的内容给变量，然后对这个变量值进行判断，符合的条件的值在给表达式。
"""

# 题目1：将下面list1列表中的每一个元素进行平方后放入到一个新列表中
list1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


# 先用普通方式1
new_list1 = []      # 声明一个空列表
i = 0
while i < len(list1):
    new_list1.append(i * i)
    i += 1
print(f"题目一的方式一：{new_list1}")


# 用普通方式2
new_list2 = []
for j in list1:
    new_list2.append(j * j)
print(f"题目一的方式二：{new_list2}")


# 使用推导式解题 3         变量名=[表达式 for 变量 in 列表]
new_list3 = [i * i for i in list1]
print(f"题目一的方式三：{new_list3}")
# 在简化一下
print([i * i for i in list1])

# 通过上面的代码发现，while用了6行，for循环4行，而推导式只需一行就可以达到相同的效果


print("-----------------------------------------------------------------------------------")
# 题目2：筛选出list1中的元素是奇数的值，然后放入到一个新列表中
list1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 普通方式1
new_list4 = []
for j in range(0, len(list1)):
    if j % 2 == 1:
        new_list4.append(j)
print(f"题目二的方式一：{new_list4}")


# 推导式2                  变量名 = [表达式 for 变量 in 列表 if 条件]
new_list5 = [i for i in list1 if i % 2 == 1]
print(f"题目二的方式二：{new_list5}")

print("-----------------------------------------------------------------------------------")
# 题目3：将嵌套列表lis1转换成一个一维列表。
lis1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 普通方式1
new_lis1 = []   # 声明空列表
for i in lis1:  # 嵌套for循环遍历出每个元素
    for j in i:
        new_lis1.append(j)
print(f"题目三的方式一：{new_lis1}")

# 推导式 2             变量名 = [表达式 for 变量 in 列表 for 变量 in  列表]
new_lis2 = [j for i in lis1 for j in i]
print(f"题目三的方式二：{new_lis2}")

# 通过上面的三个题发现，使用推导式会让代码变得更简洁
