4 三元表达式 列表解析 生成器表达式
三元表达式
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @File : 三元表达式 # @Version : 1.0 ''' 三元表达式能实现简单的 if else 语句 so.... 有那三元呢:自己理解 1. 左边成立执行的代码 2. if 判断条件 3. esle 不成立所执行的代码 -- 最后的结果用变量接收 ''' # 简单的 if else 语句: num = 7 if num > 10: print('大于10的数字') else: print('小于10的数字') # ------------------------- def max2(x,y): if x > y: return x else: return y print(max2(3,7)) # 三元表达式:将简单的 if els 写在一行,赋值给一个变量接受 ret = '大于10的数字' if num > 10 else '小于10的数字' print(ret) # --------------------------------------------- def max2(x,y): return x if x > y else y print(max2(3,7)) # --------------------------------------------- days = 45 result = '必掀起大浪' if days >= 45 else 'select' print(result)
列表解析 生成器表达式
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @File : 列表解析 # @Version : 1.0 from collections import Iterator ''' 将迭代数据,利用列表解析,生成新的列表。但数量大的时不可用列表解析,会引爆内存。 ''' # 取得列表元素的平方 l = [11,22,33,44,55,66,77,88,99] new_l = [] # 1 正常解析 for k in l: new_l.append(k**2) print(new_l) # [121, 484, 1089, 1936, 3025, 4356, 5929, 7744, 9801] # ----------------------------------------------------------------------------------------- # 2 列表解析 ret = [ k**2 for k in l ] print(ret) # [121, 484, 1089, 1936, 3025, 4356, 5929, 7744, 9801] 效果一样 # 3 列表解析时也可加入条件 ''' [ 列表解析肯定要用list包起来 表达式之间空格即可 不需要写特殊分隔符 结果肯定也是个list ] 列表解析的好处缩减代码两 ''' # [ 列表最左边对解析出的每一个元素处理 中间是解析语句 最右边是过滤条件 ] ret = [ k**2 for k in l if k > 44 ] print(ret) # [3025, 4356, 5929, 7744, 9801] # 再弄个例子 l2 = ['tony','seven','eggtea'] new_l2 = [ k.capitalize() for k in l2 ] print(new_l2) # ['Tony', 'Seven', 'Eggtea'] # ----------------------------------------------------------------------------------------- # 将 [] 换成() 会是啥玩意呢 --- 生成器表达式 new_l2_ = ( k.capitalize() for k in l2 ) print(new_l2_) # <generator object <genexpr> at 0x7f194c8982b0> 是个生成器 print(type(new_l2_)) # <class 'generator'> 是个生成器 print(isinstance(new_l2_,Iterator)) # True 迭代器 __iter__ ,__next__ print(next(new_l2_)) # Tony print(next(new_l2_)) # Seven print(next(new_l2_)) # Eggtea # so ... list_old = [1,2,3,4,5,6,7,8,9] new_list = ( k**2 for k in list_old if k > 4 ) # [] 换成了() 结果是 generator print(new_list) # <generator object <genexpr> at 0x7f2d59946410> for i in new_list: print(i) ''' so ... 将列表解析的 [] 换成 () 结果是一个生成器(迭代器)不确定生成器里元素的数量时 不要用next 取值 用 独有特性的 for 循环 取值 ''' # 列表解析 [] 换成 () 后 结果是个生成器, 就成了生成器表达式,这样解析数量大的时就不会爆内存了 # 弄个例子 # ret = [ 'egg%s' %k for k in range(100000000)] 这种情况内存吃不了 g = ('egg%s' %k for k in range(10000000000000000)) # 数据在大也无妨,next 只有一个值在内存中 print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) # 可以无限next g1 = ('egg%s' %k for k in range(10000000000000000) if k == 9) # 后面加上过滤条件 print(next(g1)) # 生成器里就一个过滤成功的一个值,只能next一次 #print(next(g1)) # StopIteration Error # ------------------------------------------------------------------------------------------ # 生成器表达式应用场景于读取大文件比较好 with open('test.c',encoding='utf-8') as f_read: g=( line.strip() for line in f_read ) # 去掉换行符,整个文本搞成生成器 print(next(g)) print(next(g)) for k in g: print(k) print(100*'{0}'.format('-')) ''' 这里循环生成器不行,此时文件已关闭,生成器不存在了 for i in g: print(i) # ValueError: I/O operation on closed file ''' # 在弄个例子 --如:数据库中的数据 ''' apple 10 3 tesla 100000 1 mac 3000 2 lenovo 30000 3 chicken 10 3 ''' # 计数总消费 with open('db.txt',encoding='utf-8') as f: ''' ret = [ float(line.split()[1]) * int(line.split()[2]) for line in f] print(ret) # [30.0, 100000.0, 6000.0, 90000.0, 30.0] print(sum(ret)) # 196060.0 ''' cont = sum(float(line.split()[1]) * int(line.split()[2]) for line in f) print(cont) # 196060.0 # 格式化输出数据 [{'name':xxx,},{'price':xxxx},{'price':xxx}] with open('db.txt',encoding='utf-8') as f_read: goods_info = [ {'name':line.split()[0], 'price':line.split()[1], 'count':line.split()[2]} for line in f_read ] print(goods_info) # [{'count': '3', 'name': 'apple', 'price': '10'}, # {'count': '1', 'name': 'tesla', 'price': '100000'}, # {'count': '2', 'name': 'mac', 'price': '3000'}, # {'count': '3', 'name': 'lenovo', 'price': '30000'}, # {'count': '3', 'name': 'chicken', 'price': '10'}]