【0813 | Day 14】三元表达式/列表推导式/字典生成式/生成器及其表达式

三元表达式

{条件成立时的返回值 if条件 else返回值}

列表推导式

print(F"[i for i in range(10)]: {[i for i in range(10)]}")

字典生成式

一、字典生成式

print({i: i**2 for i in range(10)})

---> {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

二、zip()方法

keys = [ 'name', 'age', 'gender' ]

values = ['nick', 19, 'male' ]

res = zip (keys, values)

print (zip(keys,values))

info_dict = {k: v for k, v in res}*

print (info_dict)

---> <zip object at 0x11074c088>

---> {'name': 'nick', 'age': 19, 'sex': 'male'}

info_dict = {'name' : 'nick', 'age' : 19, 'gender' : 'male'}

print(info_dict.keys( ))

print(info_dict.values( ))

res = zip (info_dict.keys( ), info_dict.values( ))

print(zip(info_dict.keys( ), info_dict.values( )) )

info_dict = {k: v for k, v in res}

print(info_dict)

---> dict_keys(['name', 'age', 'gender'])
---> dict_values(['nick', 19, 'male'])
---> <zip object at 0x1105cefc8>
---> {'name': 'nick', 'age': 19, 'gender': 'male'}

生成器

生成器的本质就是迭代器,同时也并不仅仅是迭代器。

一、yield关键字
#主体
def func():
    yield [1, 2, 3]
    print('我出来了吗?')
    yield 789
    print('那我呢?')
    yield 456


g = func()

# 第一种
for i in g:
    print(i)

# 第二种
g_iter = g.__iter__()
print(g.__next__())
print(g.__next__())  #只打印两个yield

#第三种
g_iter = g.__iter__()
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())  #找不到值

---> [1, 2, 3]
我出来了吗?
789
那我呢?
456

---> [1, 2, 3]
我出来了吗?
789

---> Traceback (most recent call last):
[1, 2, 3]
File "D:/fxyadela/上课练习/生成器.py", line 20, in
print(g._next_( ))
我出来了吗?
StopIteration
789
那我呢?
456

def func():
    print('from func 1')
    yield 'a'
    print('from func 2')
    yield 'b'


g = func()
for i in g:
    print(i)  
    
#from func 1
#a
#from func 2
#b

res = list(func())
print(res)

#from func 1   #这只是打印的值
#from func 2   #这只是打印的值
#list(func()): ['a', 'b']  yield的值属于返回值,会存入列表中
  1. yield + return

    def i_wanna_return():
        yield 'a'
        yield 'b'
        return None
        yield 'c'
    
    
    for i in i_wanna_return():
        print(i)
    

    ---> a

    ​ b

  2. 迭代器嵌套

    def sub_generator():
        yield 1
        yield 2
        yield from range(3)
    
    
    for i in sub_generator():
        print(i)
    

    ---> 1

    ​ 2

    ​ 0

    ​ 1

    ​ 2

二、自定义range()方法
def my_range(start, stop, step=1):
    while start < stop:
        yield start
        start += 1


g = my_range(0, 3)
print(list(g))

---> [0, 1, 2]

def range(*args,step = 2):
    args = list(args)
    if len(args) == 1:
        count = 0
        while count < args[0]:
            yield count
            count += 1
    elif len(args) >= 2:
        while args[0] < args[1]:
            yield args[0]
            args[0] += step

for i in range(1,10,2):
    print(i)

---> 1

​ 3

​ 5

​ 7

​ 9

三、总结

yield:

  1. 提供一种自定义迭代器的方式
  2. yield可以暂停住函数,并提供当前的返回值

yield & return:

  1. 相同点:两者都是在函数内部使用,都可以返回值,并且返回值没有类型和个数的限制
  2. 不同点:return只能返回一次值yield可以返回多次值

生成器表达式

  • 把列表推导式的[]换成()就是生成器表达式,前者[ ]是个列表,后者( )是generator。
  • list可以直接打印每一个元素,而generator只能通过next( )的方法。
  • 优点:省内存,一次只产生一个值在内存中
#List[]

>>> L = [x * x for x in range(10)]

#generator()

>>> g = (x * x for x in range(10))

---> L[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

---> g<generator object at 0x104feab40>

一、生成器表达式和列表推导式

列表推导式相当于直接给你一筐蛋,而生成器表达式相当于给你一只老母鸡。

# 列表表达式
with open('52.txt', 'r', encoding='utf8') as f:
    nums = [len(line) for line in f]

print(max(nums))

1


# 生成器推导式
with open('52.txt','r',encoding='utf8') as f:
    nums = (len(line) for line in f)

print(max(nums)) # ValueError: I/O operation on closed file.
posted @ 2019-08-13 21:32  fxyadela  阅读(110)  评论(0编辑  收藏  举报