博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python学习(七)——列表生成式、生成器
阅读量:154 次
发布时间:2019-02-27

本文共 2399 字,大约阅读时间需要 7 分钟。

python2中:

异同 range() xrange()
语法 一样 一样
返回 列表 生成器
生成 真实列表 用多少生成多少

因此与xrange()相比range()更加节省内存.(之前写反了,经weixin_41462437朋友纠正,改回来了)

xrange():

x = xrange(100)for i in x:    if i < 5:        print iprint x

输出:

01234xrange(100)

range():

y = range(100)for j in y:    if j < 5:        print jprint y

输出:

01234[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

列表生成式

形式:[for循环]
①单层for循环:

>>> [a for a in range(10)][0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> [2*a+5 for a in range(10)][5, 7, 9, 11, 13, 15, 17, 19, 21, 23]>>> [a*a for a in range(1,11)][1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

②多层for循环:

>>> [3*a+b for a in range(3) for b in range(1,4)][1, 2, 3, 4, 5, 6, 7, 8, 9]>>> [a+b for a in 'ABC' for b in '123']['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']>>> [a+b+c for a in 'ABC' for b in '123' for c in ('o','p','q')]['A1o', 'A1p', 'A1q', 'A2o', 'A2p', 'A2q', 'A3o', 'A3p', 'A3q', 'B1o', 'B1p', 'B1q', 'B2o', 'B2p', 'B2q', 'B3o', 'B3p', 'B3q', 'C1o', 'C1p', 'C1q', 'C2o', 'C2p', 'C2q', 'C3o', 'C3p', 'C3q']

③for循环后加if条件:

>>> [3*a+b for a in range(3) for b in range(1,4) if (3*a+b)>4][5, 6, 7, 8, 9]

④利用dict的iteritems()可以使用两个变量生成列表:

>>> d={'name1':'Ann','name2':'Tom','name3':'Bob'}>>> [k+' is '+v for k,v in d.iteritems()]['name2 is Tom', 'name3 is Bob', 'name1 is Ann']

⑤列表中字符串大小写转换:

>>> STR=['HELLO','WORLD','HELLO','PYTHON']>>> [s.lower() for s in STR]['hello', 'world', 'hello', 'python']
>>> str=['hello', 'world', 'hello', 'python']>>> [S.upper() for S in str]['HELLO', 'WORLD', 'HELLO', 'PYTHON']

生成器

利用生成器(generator)可以一边循环一边计算,而不必创建完整的list,节省了内存空间。
①利用for循环创建生成器:

>>> g=(x for x in range(10))>>> g
at 0x00000000027D6AB0>

利用next()方法或for循环迭代对象:

>>> g.next()0>>> g.next()1
>>> for i in g:	print i	23456789

②利用函数创建生成器:

函数中包含关键字yield时,则函数是一个生成器。
普通函数:

>>> def fac(n):	s=1	if(n==1):		print s	else:		while(n>1):			s=s*n			n=n-1		print s		>>> fac(5)120>>> fac(4)24

将print改为yield,原函数变成生成器:

>>> def fac(n):	s=1	if(n==1):		yield s	else:		while(n>1):			s=s*n			n=n-1		yield s		>>> fac(5)

调用:

>>> for k in fac(4):	print k	24>>> for k in fac(5):	print k	120

这里写图片描述

你可能感兴趣的文章