首页 > 技术文章 > 050 三元表达式,列表推导,字典生成器’生成器

xichenHome 2019-08-13 20:15 原文

一、三元表达式

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

  • 三元表达式只支持双分支结构

x = 10
y = 20
if x > y:
    print(x)
else:
    print(y)

# 三元表达式
x = 10
y = 20
print(f"x if x > y else y: {x if x > y else y}")

# x if x > y else y: 20

二、列表推导式

ls = []
for i in range(10)
	ls.append(i)
print(ls)



# 推导式
ls = [ i for i in range(10)]
print(ls)

ls = [ i**2 for i in range(10)]
print(ls)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

三、字典生成式

  • 字典生成器一般与zip(拉链函数---列表里面包了元组)连用
dic = {'a':1,'b':2}
dic_new = {k**2,v**2 for k,v in dic.items()}
print(new_dic)


z = zip(['a','b','c'],[1,2,3])
for k,v in z:
    print(k,v)
# 结果    
a 1
b 2
c 3
d 4


dic = {k: v ** 2 for k, v in zip(['a', 'b', 'c', 'd'], [1, 2, 3, 4])}  # 不能写这种代码
print(dic)
# {'a': 1, 'b': 4, 'c': 9, 'd': 16}

四、生成器

  • 生成器:就是在自定义迭代,生成器就是迭代器(自己造出来的)
  • 迭代器对象就是同时具有——iter——,和——next——这两个方法
def func():
    return 123

f = func()
print(f)
  • 生成器用到了一个关键字yield

1.yield有三个特性:

  • yield会使一个函数变成生成器对象(自定义的生成器对象),因此函数就具有了__iter__和___next__方法
  • 在函数里面遇到yield可以停止函数的运行,需要在用一次___next___方法运行yield下面的代码
  • 函数里面有几个yield就有几个人元素 就可以用几个next方法,如果多了一次next就会报错,也就是说一个yield对应一个next
def func():
    yield 123
    print(456)
   
f = func()
print(f)
f__iter__ = f.__next__()
f__iter__ = f.__next__()

2.总结

  • yield:

    • 提供一种自定义迭代器的方式

    • yield可以暂停住函数,并提供当前的返回值

  • yield和return:

    • 相同点:两者都是在函数内部使用,都可以返回值,并且返回值没有类型和个数的限制

    • 不同点:return只能返回一次之;yield可以返回多次值

五、生成器表达式

列题:

1.用生成器实现range方法

def range(n):
    i = 0
    while i < n:
        yield
        i += 1    
    
for i in range(10)
print(i)

2.用生成器实现一个带有步长的range方法

def range(*args):
    ls = list(args)
    if len(ls) == 3:
        while ls[0]<ls[1]:
            yield ls[0]
            ls[0] += ls[2]
    elif len(ls) == 1:
        i = 0
        while i < ls[0]:
            yield i
            i += 1

for i in range(10):
    print(i)

推荐阅读