一、列表推导式

  1)创建一个列表推导式。

# 需求:给出一个列表,通过循环,向列表中添加1-10的整数。
# 通常情况下,我们是这样操作的。 lst = [] for i in range(1,11): lst.append(i) print(lst) >>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 如果使用列表推导式,我们是这样操作的。 lst = [ i for i in range(1,11)] print(lst) # 代码可写很多! >>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  2)列表推导式的两种模式介绍

循环模式:[变量名(加工的变量) for 变量 in iterable]
筛选模式:[变量(加工变量) for 变量 in iterable if 条件]
# 循环模式:
# 需求1:将10以内所有整数的平方写入列表
lst = [i ** 2 for i in range(1,11)]
print(lst)


>>[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 需求2:将10以内所有的偶数写入列表
lst = [i for i in range(2,11,2)]
print(lst)


# >>[2, 4, 6, 8, 10]
# 需求3:从python1期到python5期写入列表lst
lst = ['python'+ str(i) for i in range(1,6)]
print(lst)


# >>['python1', 'python2', 'python3', 'python4', 'python5']
# 筛选模式:
# 需求1:将大于3的元素留下来
lst = [i for i in range(1,11) if i > 3]
print(lst)


>>[4, 5, 6, 7, 8, 9, 10]
# 需求2:三十以内可以被三整除的数
lst = [i for i in range(1,31) if i % 3 is 0]    #如果取模是0
print(lst)


# >>[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
# 需求3:找到嵌套列表中名字含有两个‘e’的所有名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]

lst = [a.upper() for i in names for a in i if a.count('e') >= 2]

print(lst)


# >>['JEFFERSON', 'WESLEY', 'STEVEN', 'JENNIFER']

  3)补充内容

#列表推导式:【循环变量名 for 循环变量名 in 可迭代对象 if 条件判断】
#(第一种)通常情况:
# a=[]
# for i in range(10):
#     a.append(i)
# print(a)
# #(第二种)列表推导式:
# # b=[i for i in range(10)]
# b=[i for i in range(10) if i>5]          #取出列表中大于5的值
# print(b)


num_in=int(input("请输入数字!"))
def fib(num):
    if num<=0:
        raise Exception("数字应该大于0!")    #非循环中的异常处理
    if num==1 or num==2:
        return 1
    else:
        return fib(num-1)+fib(num-2)
# print(fib(num_in))

# fib_list=[fib(i) for i in range(1,num_in+1)]         #fib(i)得到前N个数的值
fib_list=[fib(num_in) for i in range(1,num_in+1)]     #fib(num_in)会得到最后N个N位置的值
print(fib_list) 

二、字典推导式

  1)字典推导式:是一个或多个迭代器快速简洁的创建数据类型的一种方法。它将循环和条件判断结合,从而避免语法冗长的代码,提高代码运行效率。类似于列表推导式,不同的是字典推导式返回的是一个字典,所以整个表达式需要写在{}内部。

  2)字典推导式的语法格式:

# 第一种语法格式:
# key:字典中的key
# value:字典中的value
# dict.items():序列
# condition:条件表达式
# key_exp:for循环中,如果条件表达式conditionw为True,返回对应的key,value
# value_exp:for循环中,如果条件表达式condition为True,返回对应的key,value

# {表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]}            # 用[]括起来的部分,可省略。
# {key_exp:value_exp for key,value in dict.items() if condition}


# 第二种语法格式:
# key:字典中的key
# value:字典中的value
# dict.items():序列
# condition:条件表达式
# key_exp:在for循环中,如果条件表达式condition为True,返回对应的key, value并作key_exp, value_exp处理
# value_exp1:在for循环中,如果条件表达式condition为True,返回对应的key, value并作key_exp, value_exp1处理
# value_exp2:在for循环中,如果条件表达式condition为False,返回对应的key, value并作key_exp, value_exp2处理

# {[if else条件表达式] 表达式 for 迭代变量 in 可迭代对象}
# {key_exp:value_exp1 if condition else value_exp2 for key,value in dict.items()}

  3)字典推导式案例

dict1 = {"a": 10, "B": 20, "C": True, "D": "hello world", "e": "python教程"}

# 需求1:获取字典中key值是小写字母的键值对
dict2 = {key: value for key, value in dict1.items() if key.islower()}

# 需求2:将字典中的所有key设置为小写
dict3 = {key.lower(): value for key, value in dict1.items()}

# 需求3:将字典中所有key是小写字母的value统一赋值为'error'
dict4 = {key: value if key.isupper() else "error" for key, value in dict1.items()}

print(dict2)
print(dict3)
print(dict4)


>>{'a': 10, 'e': 'python教程'}
>>{'a': 10, 'b': 20, 'c': True, 'd': 'hello world', 'e': 'python教程'}
>>{'a': 'error', 'B': 20, 'C': True, 'D': 'hello world', 'e': 'error'}
# 需求4:我们需要将获取到字符串格式的 cookies 转换为字典 dict 格式。
cookies = 'ln_hurl=http://www.baidu.com;id=969937120;ver=7.0;loginfrom=null;wp_fold=0'

# 字典推导式
cookies = {cookie.split("=")[0]:cookie.split("=")[1] for cookie in cookies.split(";")}
print(cookies)


# >>{'ln_hurl': 'http://www.baidu.com', 'id': '969937120', 'ver': '7.0', 'loginfrom': 'null', 'wp_fold': '0'}
# 分析:在字符串cookies中 ‘=’ 前面是key ,’=’ 后面是value ,每一个 ‘;’ 构成一个键值对;多个键值对构成一个字典;
# 1.根据 ‘;’ 将字符串拆分为列表;
# 2.根据第一步获取的列表,遍历时将每一个字符串根据 ‘=’ 再次拆分;
# 3.根据第二步拆分的结果,列表第一个元素作为key, 列表第二个元素作为value ;
# 字典推导式与列表推导式的区别:
# 1.列表推导式返回列表,表达式在中括号[]中。
# 2.字典推导式返回字典,表达式在大括号{}中。

三、条件推导式

  1)条件推导式:是从一个或者多个迭代器快速简洁的创建数据类型的一种方法,它将循环和条件判断结合,避免语法冗长的代码。

  2)语法结构:

# value1:如果条件表达式condition成立,返回value1 ; 如果条件表达式不成立,返回value2 ;
# condition:条件表达式
# Value2:如果条件表达式condition成立,返回value1 ; 如果条件表达式不成立,返回value2 ;

 value1 if condition else Value2

  3)条件推导式案例:

# 条件语句
x = 10
if x % 2 == 0:
    print("佩琪说:x是偶数")
else:
    print("佩琪说:x是奇数")

# 条件表达式语句
x = 15
print("佩琪说:x是偶数") if x % 2 == 0 else print("佩琪说:x是偶数")


>>佩琪说:x是偶数
>>佩琪说:x是偶数

四、列表推导式与生成器的区别

  1)列表推导式比较耗内存,所有数据一次性加载到内存。而.生成器表达式遵循迭代器协议,逐个产生元素。

  2)得到的值不一样,列表推导式得到的是一个列表.生成器表达式获取的是一个生成器。

  3)列表推导式一目了然,生成器表达式只是一个内存地址。

  4)无论是生成器表达式,还是列表推导式,他只是Python给你提供了一个相对简单的构造方式,因为使用推导式非常简单,所以大多数都会为之着迷,这个一定要深重,推导式只能构建相对复杂的并且有规律的对象,对于没有什么规律,而且嵌套层数比较多(for循环超过三层)这样就不建议大家用推导式构建。

  5)生成器的惰性机制: 生成器只有在访问的时候才取值,说白了.你找他要才给你值.不找他要.他是不会执行的。