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'}]
原文地址:https://www.cnblogs.com/liushubao/p/7700729.html