- 关键字:
if else elif while for break continue pass - 悬挂
else问题:在C中else与最近的if搭配,就会容易产生问题,而python中因为强制缩进,不会有这问题 elif过多时可以用序列和成员关系符进行简化(利用字典实现更优雅)- 使用映射对象的一个最大好处是它的搜索操作比类似
if-elif-else语句或for循环这样的序列查询要快得多 - 三元操作符:
<value1> if <cond> else <value2> - 通过序列索引迭代(速度不如直接迭代快):
for index in range(len(listA)) - 使用枚举(同时有索引和值):
for idx, val in enumerate() continue终止当前循环,回到循环顶端(如果满足先决条件)break跳出循环;若在if中使用,后面的else也会被跳过在for中用xrange()性能要优于range(),它不会在内存里创建列表的完整拷贝(不生成整个列表),类型为xrange易混点:,sorted()、zip()返回的是列表reversed()、enumerate()返回的是一个迭代器range()的完整参数:range(start, end, step),默认情况step为1- 迭代器相关:
next()方法返回下一个条目,当迭代完成会引发一个StopIteration异常并被捕获 - 迭代器: 可用
iter()创建,为类序列对象提供了一个类序列的接口,还可以迭代不是序列但表现出序列行为的对象(例如字典的键,文件的行) - 通过使用迭代器可以拓展接口,迭代非序列集合时可以创建更简洁的代码;但是不能向后移动、不能复制(只能创建新对象)
- 文件对象生成的迭代器会自动调用
readline()方法 - 如果在迭代时改变了元素(因为迭代器是与实际对象绑定在一起的),会报
RuntimeError - 如果传递两个参数给
iter(func, sentinel),它会重复调用第一个参数func,直至迭代器下一个值是第二个参数sentinel - 列表解析可以简化类似
lambda、map的函数(减少了函数调用次数),支持多重for嵌套和多个if子句,常用于矩阵、生成三维坐标 - 列表解析的不足: 必须生成所有数据,用以创建整个列表;可以使用生成器可以解决
- 生成器: 语法和列表解析基本相同(
[]换为()),但不真正创建数字列表,返回一个生成器(边计算边出值,关键字yield,相当于惰性列表解析)
温故知新,高级复读机