列表推导式:
通过列表y得到列表x:
y = [1,2,3,4,5,6,7,8]
x = [1,4,9,16,25,36,49,64]一般我们会这么做:
x = []
for i in y: x.append(i*i)print(x)列表推导式:
y = [1,2,3,4,5,6,7,8]
x = [i*i for i in y]
print(x)再看一个例子:
range(100)
x2 = [i/2 for i in range(100)]print(x2)生成器表达式:
x = [i*i for i in y]print(x)g = (i*i for i in y) print(g) print(list(g)) for i in g: print(i)
老母鸡的例子:
#老男孩由于峰哥的强势加盟很快走上了上市之路,alex思来想去决定下几个鸡蛋来报答峰哥egg_list=['鸡蛋%s' %i for i in range(10)] #列表解析#峰哥瞅着alex下的一筐鸡蛋,捂住了鼻子,说了句:哥,你还是给我只母鸡吧,我自己回家下laomuji=('鸡蛋%s' %i for i in range(10))#生成器表达式print(laomuji)print(next(laomuji)) #next本质就是调用__next__print(laomuji.__next__())print(next(laomuji))
l = ['鸡蛋%s'%i for i in range(10)]
# print(l)laomuji = ('鸡蛋%s'%i for i in range(10))for egg in laomuji: print(egg)各种推导式:
new_l = []
for i in range(30): if i%3 == 0: new_l.append(i)print(new_l)
# print(list(range(0,30,3)))
# print([i for i in range(30) if i%3 == 0])# [i*i for i in range(30) if i%3 == 0]# def square(x):# return x*x# [square(i) for i in range(30) if i%3 == 0]
# names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
# ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]# ret = (name for name_lst in names for name in name_lst if name.count('e') >= 2)# print(ret)# 不利于代码可读,但是代码简洁
# mcase = {'a': 10, 'b': 34} # mcase_frequency = {mcase[k]:k for k in mcase} # print(mcase_frequency)
# mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3} # mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase} # print(mcase_frequency)
squared = {x**2 for x in [1, -1, 2]} #{1,4} print(squared) # Output: set([1, 4])
面试题:
def demo(): for i in range(4): yield ig=demo() # 生成器g1=(i for i in g) #生成器g2=(i for i in g1) #g2 生成器# print(list(g1)) #[0,1,2,3]print(list(g2))
总结:
1.把列表解析的[]换成()得到的就是生成器表达式
2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存
3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和: