python基础(十七):三元表达式、列表生成式、生成器生成式

一、三元表达式

三元表达式是python为我们提供的一种简化代码的解决方案,语法如下

res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值

二、列表生成式

(1)列表生成式语法

列表生成式是python为我们提供的一种简化代码的解决方案,用来快速生成列表,语法如下:

list1 = [value for item in iterable if condition]
# for循环,满足conditon条件的,就会把value append到本列表中。看过我前面博客的都应该知道iterable代表一个可迭代对象。

不仅仅有列表生成式,与列表生成方法类似的还有字典生成式、集合生成式、

(2)列表生成式案例
list1 = ['lxx','hxx','uxx','huahua']
list2 = [ i.upper() for i in list1 if i.endswith('xx') ]
print(list2) # 执行结果:['LXX', 'HXX', 'UXX']
(3)字典生成式案例
keys = ['华晨宇','吴晋丞','爱根','dsb']
dic0 = [ key:None for key in keys if key != 'dsb' ]
print(dic0) # 执行结果:{'华晨宇': None, '吴晋丞': None, '爱根': None}

tuple1 = (['华晨宇',30],['吴晋丞',20],['爱根',28],['dsb',10])
dic1 = { k:v for k,v in list1 if k != 'dsb' }
print(dic1) # 执行结果:{'华晨宇': 30, '吴晋丞': 20, '爱根': 28}
(4)集合生成式案例
keys = ['华晨宇','吴晋丞','爱根','dsb']
set1 = { key for key in keys } # 默认识别成字典,因为没有k,因此识别成集合
print(set1,type(set1)) # 执行结果:{'吴晋丞', '爱根', 'dsb', '华晨宇'} <class 'set'>

三、生成器生成式

创建一个生成器对象有两种方式,一种是调用带yield关键字的函数,另一种就是生成器生成式,与列表生成式的语法格式相同,只需要将[]换成(),即:
注意:有人可能会认为这不是元组生成式吧,其实不然,元组、字符串是不可变类型,没有append方法,因此不可变类型没有生成式

语法:

g =(expression for item in iterable if condition)

对比列表生成式返回的是一个列表,生成器生成式返回的是一个生成器对象

>>> [x**2 for x in range(3)] #这里是x的平方
[0, 1, 4]
>>> g=(x*x for x in range(3)) #x乘x
>>> g
<generator object <genexpr> at 0x101be0ba0>

对比列表生成式一下产生全部值来说,生成器生成式的优点自然是节省内存(调用一次才产生一个值在内存中)

>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g) #抛出异常StopIteration

如果我们要读取一个大文件的字节数,应该基于生成器生成式的方式完成:

with open('db.txt','rb') as f: #也可以改成t模式,计算字符数
    nums=(len(line.strip()) for line in f) # 去掉每行的空格,再计算字节数
    total_size=sum(nums) # 依次执行next(nums),然后累加到一起得到结果=
    print(total_size) 

注意:sum函数,传的必须是一个可迭代对象,比如字典、列表、元组、集合。文件对象不行,因为文件对象里面的内容要么是字符要么是字节,不是数字,上面也是用了len函数转变成了对数字的求和。无论是那个可迭代对象,都要求求和的内容只能是数字,不能是字符串,即是'1'都不行。

扫描二维码关注公众号,回复: 11227356 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_44571270/article/details/106021522