Python学习(七)——列表生成式、生成器

python2中:

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

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

xrange():

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

输出:

0
1
2
3
4
xrange(100)

range():

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

print y

输出:

0
1
2
3
4
[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
<generator object <genexpr> at 0x00000000027D6AB0>

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

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

	
2
3
4
5
6
7
8
9

②利用函数创建生成器:
函数中包含关键字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)
<generator object fac at 0x0000000002B59168>

调用:

>>> for k in fac(4):
	print k

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

	
120

这里写图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值