本文共 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))>>> gat 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