#!/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'}]