python 列表推导式和生成器表达式

列表推导式又称为列表解析

用来干什么的的

在python中列表用的比较多,用来简化的代码的。所以提供了列表解析这种方式。

循环列表推导式

循环模式: [(要加工的变量)for 变量 in iterable]
in iterable 是可迭代的例如 range(1,10) list,tuple、字符串这种,如果是一个整数就不行,因为不能迭代。简单来说在python中就是可以用for循环的。python内部来说就是含有 __iter__下划线方法
例子:要将列表中每个数字翻倍并加7,使用循环列表表达式可以这样做

 l=[2*n+7 for n in range(1,11)]
print(l)

放集合也可以的,只不过最后输出是列表,那[] 换成{} or() 可以吗?不可以,所以才叫列表推导式

l={2,3,4,5}
l1=[2*n+7 for n in l]
print(l1)

将字符串每个字符变大写

l=[2*n+7 for n in range(1,11)]
print(l)

用到的地方:以某种方式修改现有的列表,比如下面的列表执行后首字母都会变为大写

names=['a1','mei','jo','del']
print(names)
cap_names=[n.capitalize() for n in names]
print(cap_names)

筛选列表推导式

还可以剔除不想要的元素
筛选列表推导式:[加工的变量 for 变量 in iterable if 条件]
例子 返回一个列表中的整数

nums=[-1,0,6,-4,-2,3]
result=[n for n in nums if n>0]
print(result)

使用列表解析删除字符串中的所有元音

eat_vowels='Apple Sauce'
list_ret = [c for c in eat_vowels if c.lower() not in "aeiou"]
#ret返回的结果是一个字符串列表['p', 'p', 'l', ' ', 'S', 'c']
#因此需要join将所有字符串拼接成一个,再返回
str_ret = ''.join(list_ret)
print(str_ret)

join的用法就是str.join(sequence) ,sequence是你要连接的序列,str就是你要选择你要以什么方式将他们连接起来。例子如下

str = "-"
seq = ("a", "b", "c")# 字符串序列
print(str.join(seq))

生成器表达式

生成器表达式和列表表达式不同之处在于,把[] 换成()就可以了,例如上面的去掉元音,就是生成器表达式酷似苏生成所需列表或序列部分,但是根据需要生成元素,而不是像列表解析式一次性生成所有元素,就是可以节省空间的意思。

eat_vowels='Apple Sauce'
list_ret = (c for c in eat_vowels if c.lower() not in "aeiou")
print(list_ret)#<generator object <genexpr> at 0x0000016D84432340>
str_ret = ''.join(list_ret)
print(str_ret)

生成器表达式也能筛选

# 获取1-100内能被3整除的数
gen=(i for i in range(1,101) if i%3==0)
print(gen) #<generator object <genexpr> at 0x0000019CC6422340>

列表推导式vs生成器表达式

1、列表推导式数据一次性加载到内存,生成器表达式遵循迭代器协议,逐个产生元素
2、列表推导式得到的是一个列表,生成器表达式获取的是一个生成器,是一个内存地址

同时还有字典推导式,集合推导式
l

st1 = ('spring','summer','winter')
lst2 = ('春天','夏天','冬天')
dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
print(dic)
lst = [1,2,3,-1,-3,-7,9]
s = {abs(i) for i in lst}
print(s)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值