Python 核心编程[第八章]
0x00 条件
下边多个 x 表示某个执行语句,单个 x 表示某种条件或某种类型的变量。
一、if 语句
由三部分组成:关键字、条件表达式、执行代码块
1.多重表达式
### 优先级:not > and > or
if x and x:
xxxxxxx
2.单一语句代码块
if x:
xxxxx
二、else 语句
1.语法
if x:
xxxxx
else:
xxxxx
2.避免悬挂 else
Python 用缩进强制代码对其,让程序员决定 else 属于哪一个 if。
3. else 语句的特殊用法
在 Python 中 else 可以在 while 循环和 for 循环中使用,在循环中使用时, else 子句只在循环完成后执行,也就是说 break 语句也会跳过 else 块。所以只要循环正常结束 else 语句就会正常执行。
三、elif 语句
if x:
xxxx
elif x:
xxxxx
else:
xxxxxx
四、条件表达式
x if c else y <=> C: c ? x:y
0x01 循环
一、while 语句
1.一般语法
while x:
xxxxxxx
2.计数循环
while(x<num):
xxxxxxxxx
3.无限循环
while True:
xxxxxxxx
二、for 语句
它可以遍历序列成员,可以在列表解析和生成器表达式中,它会自动地调用迭代器的 next() 方法,捕获 StopIteration 异常并结束循环。
1.一般语法
for i in x:
xxxxx
2.用于序列类型
(1)通过序列项迭代:
for i in x:
xxxxxxxxx
(2)通过序列索引迭代:
for i in range(len(x)):
xxxxxxxxxx
(3)用于项和索引迭代
## 其中 i 表示第几个 y 表示是什么
for i,y in enumerate(x):
xxxxxx
3.用于迭代器类型
用 for 循环访问迭代器和访问序列的方法差不多,唯一的区别就是 for 语句会为你做一些额外的事情。迭代器并不代表循环条目的集合。迭代器对象有一个 next() 方法,调用后返回下一个条目。所有条目迭代完后,迭代器引发一个 SyopIteration 异常告诉程序循环结束。for 语句在内部调用 next() 并捕获异常。使用迭代器做 for 循环的代码与使用序列条目几乎完全相同。事实上在大多数情况下,你无法分辨出你迭代的是一个序列还是迭代器,这就是为什么说要遍历一个迭代器时,实际上可能我们指的是要遍历一个序列、迭代器、或是一个支持迭代的对象。
4.range() 与 xrange()
range(start,end,step) pyhon 2 中它会生成一个列表,python 3 中它会生成一个可迭代对象 range,在python 2 中 xrange() 与 python3 中的 range() 相似甚至相同,python3 中没有 xrange() 函数
5.与序列相关的内建函数
- sorted():返回一个序列
- zip():返回一个序列
- reversed():返回迭代器
- enumerate():返回迭代器
三、break 和 continue 语句
1.break 语句
类似 C 中的传统 break 语句,需要立即从循环(while 、for)退出时用 break 语句。
2.continue 语句
当遇到 continue 语句时,程序会终止当前循环,并忽略剩余语句,然后回到循环的顶端。可以用于 while 循环(条件性的循环)和 for 循环(迭代性的循环),不过在开始下一次循环之前,程序会先判断是否符合循环条件。
0x02 其他
一、迭代器和 iter() 函数
1.迭代器是?
它为类序列对象提供了一个序列接口,他们是一组数据结构,可以利用索引从 0 开始迭代到序列最后一个条目。Python 的迭代无缝地支持序列对象,而且允许序程序员迭代非序列类型,包括用户自定义对象。可以迭代不是序列但表现出序列类型地对象,如字典的键,文件的行,当你使用循环迭代一个对象条目时,你几乎分辨不出它是迭代器还是序列
2.如何迭代
从根本上说,迭代器就是一个有 next() 方法的对象,而不是通过索引来计数。调用 next() 方法获取全部条目,之后会引发 StopIteration 异常告诉外部调用者,迭代完成。不过迭代器有一些限制,例如,你不能向后移动,不能回到开始,不能复制一个迭代器,如果你要在此迭代同一个对象,你只能去创建另一个迭代器对象。
reversed() 内建函数会返回一个反序访问的迭代器。enumerate() 内建函数也返回一个迭代器。any() 和 all() 内建函数是如果某个或所有条目的值为真时,它们返回为真。iter(x),将 x 变为迭代器形式。
3.如何使用迭代器
(1)序列:
for i in x: ## x 为一个序列
xxxxx
## 实际工作方式
f = iter(x)
while True:
try:
i = f.next()
except StopIteration:
break
xxxxx
(2)字典:
for i in x: ## x 为一个字典 i 为键
xxx
## 例
dic1 = {(1,2):(3,4,5)}
for i in dic1:
print("%s %s" %i )
print("%s %s %s "%dic1[i])
## ditc1.iterketys() 通过键迭代
## dict1.itervalues() 通过值迭代
## dict1.iteritems() 通过键-值迭代
(3)文件
x = open('',)
for i in x:
xxxxxx
4.如何创建迭代器
- iter(obj):
- iter(obj,sentinel):一直迭代到下一个值为 sentinel
二、列表解析
1.解析列表语法
[expr for iter_var in iterable]
## 通过 for 循环,迭代 iterable 对象的所有条目。
## 前边的 expr 应用于序列的每一个成员,最后的结果是该表达式产生的列表。
## 迭代变量并不需要表达式的一部分。
2.解析列表的扩展用法
[expr for iner_var in iterable if cond_expr]
## 这个语法在迭代时会过滤或"捕获"满足条件表达式的 cond_expr 成员。
3.矩阵样例
## 3 行 5 列
[(x+1,y+1) for x in range(3) for y in range(5)]
4.其他
[x for a in b for x in a]
## 生成 x 列表,从 b 中选出 a 后再从 a 中选出 x
三、生成器
生成器是列表解析的一个扩展,它是特定的函数,允许它返回一个值,然后"暂停"代码的执行,稍后恢复。列表解析的一个不足就是必须要生成所有数据,用以创建整个列表。这可能对有大量数据的迭代器有负面效用。生成器表达式通过结合列表解析和生成器解决了这个问题。生成器表达式和列表解析非常相似,不过它不真正创建列表,而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目"产生"出来。生成器表达式使用了"延迟计算",所以它在使用内存上更有效。也就是说生成器是一步一步完成解析列表所完成的任务,所以在处理效率上可能会比较高,所以处理大型数据推荐使用生成器而不是解析列表。
1.生成器表达式
(expr for iter_var in iterable)。
// 看11章进行完善