【5】python核心编程 第八章-条件和循环

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)

 

posted @ 2015-10-13 14:44  jakey.chen  阅读(199)  评论(0编辑  收藏  举报