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