1、=== range() 的完整语法===
1 Python 提供了两种不同的方法来调用 range() . 完整语法要求提供两个或三个整数参数:
2 range(start, end, step =1)
3 range() 会返回一个包含所有 k 的列表, 这里 start <= k < end , 从 start 到 end , k 每
4 次
5 递增 step . step 不可以为零,否则将发生错误.
6 >>> range(2, 19, 3)
7 [2, 5, 8, 11, 14, 17]
8 如果只给定两个参数,而省略 step, step 就使用默认值 1 .
9 >>> range(3, 7)
10 [3, 4, 5, 6]
2、xrange() 内建函数
1 xrange() 类似 range() , 不过当你有一个很大的范围列表时, xrange() 可能更为适合, 因为
2 它不会在内存里创建列表的完整拷贝. 它只被用在 for 循环中, 在 for 循环外使用它没有意义。
3 同样地, 你可以想到, 它的性能远高出 range(), 因为它不生成整个列表。在 Python 的将来版本
4 中, range() 可能会像 xrange() 一样, 返回一个可迭代对象(不是列表也不是一个迭代器)
3、for else: 只要for 循环是正常结束的(不是通过 break ), else 子句就会执行
4、可变对象和迭代器
1 记住,在迭代可变对象的时候修改它们并不是个好主意. 这在迭代器出现之前就是一个问题.
2 一个流行的例子就是循环列表的时候删除满足(或不满足)特定条件的项:
3 for eachURL in allURLs:
4 if not eachURL.startswith('http://'):
5 allURLs.remove(eachURL) # YIKES!!
6 除列表外的其他序列都是不可变的, 所以危险就发生在这里. 一个序列的迭代器只是记录你
7 当前到达第多少个元素, 所以如果你在迭代时改变了元素, 更新会立即反映到你所迭代的条目上.
8 在迭代字典的 key 时, 你绝对不能改变这个字典. 使用字典的 keys() 方法是可以的, 因为
9 keys() 返回一个独立于字典的列表. 而迭代器是与实际对象绑定在一起的, 它将不会继续执行下
10 去:
11 >>> myDict = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
12 >>> for eachKey in myDict:
13 ... print eachKey, myDict[eachKey]
14 ... del myDict[eachKey]
15 ... a 1
16 Traceback (most recent call last):
17 File "", line 1, in ?
18 RuntimeError: dictionary changed size during iteration
5、生成器表达式
1 列表解析:
2 [expr for iter_var in iterable if cond_expr]
3 生成器表达式:
4 (expr for iter_var in iterable if cond_expr)