# 5.1 print 和 import 的更多信息
## 5.1.1 使用逗号输出
![](https://box.kancloud.cn/d71a7ae20f461854cf1b5b12f2102605_399x233.png)
## 5.1.2 把某件事作为另一件事导入
![](https://box.kancloud.cn/f821720a7be620a7071bbb0cbfd9d6d3_321x108.png)
# 5.2 赋值魔法
## 5.2.1 序列解包
![](https://box.kancloud.cn/94174468c8e5846b0328334ef5db41c8_182x90.png)
![](https://box.kancloud.cn/2116db6be6ed8221a07f62e079ceb069_469x178.png)
![](https://box.kancloud.cn/c38770a331b712888b8fa05ce8874402_386x114.png)
## 5.5.2 链式赋值
链式赋值(chained assignment)是将同一个值赋给多个变量的捷径。
~~~
x = y = somefunction()
x = somefunction()
x = y
x = somefunction()
y = somefunction()
# 注上下两个赋值不一定是等价的
~~~
## 5.2.3 增量赋值
![](https://box.kancloud.cn/e8c9fad7babf6980a17d9f1c6931215b_139x81.png)
# 5.3 语句块:缩排的乐趣
![](https://box.kancloud.cn/70151bcf944893632bc647a7cd0ab98d_235x174.png)
# 5.4 条件和条件语句
## 5.4.1 这就是布尔变量的作用
![](https://box.kancloud.cn/31958655e9cc548126d543a08da655bb_331x262.png)
## 5.4.2 条件执行和if语句
![](https://box.kancloud.cn/8c20abd37b569fb1302e72090957b24e_353x96.png)
## 5.4.3 else子句
![](https://box.kancloud.cn/59800572b6bfebd85af72f42392154f1_365x116.png)
## 5.4.4 elif子句
![](https://box.kancloud.cn/6a3799e1a895a2d664b9ac208f68a849_304x139.png)
## 5.4.5 嵌套代码块
![](https://box.kancloud.cn/e53c5e07bc9d3f4ffdd83c55f068d883_383x178.png)
## 5.4.6 更复杂的条件
1.比较运算符
x == y
x < y
x > y
x >= y
x <= y
x != y
x is y x 和 y 是同一个对象
x is not y x 和 y 是不同的对象
x in y x 是 y 容器(例如,序列)的成员
x not in y x 不是 y 容器(例如,序列)的成员
2.相等运算符
![](https://box.kancloud.cn/0b2fd4f82954d6eff194a24523412d17_319x121.png)
3.is:同一性运算符
![](https://box.kancloud.cn/e82ff8cc4d3045ba5e5868ec0eff296e_211x138.png)
![](https://box.kancloud.cn/060fb52d667d6e98eff9876b3bc90836_161x157.png)
4.in:成员资格运算符
![](https://box.kancloud.cn/bba95e8bb07d7aed971a37535c4d5913_456x120.png)
5.字符串和序列比较
![](https://box.kancloud.cn/de8c27f41294c0324387cbbc6e87018a_326x119.png)
6.布尔运算符
![](https://box.kancloud.cn/9b7d3f516519c17953dd805bf80d4d47_467x281.png)
## 5.4.7 断言(assert)
![](https://box.kancloud.cn/fe7042c574abad3ee1acd631e3a16f76_452x183.png)
# 5.5 循环
## 5.5.1 while循环
![](https://box.kancloud.cn/16aa31285dab0a626c4ac2a9e7e720ba_259x135.png)
## 5.5.2 for循环
![](https://box.kancloud.cn/1b62586753738453efd01b9cd1ae0af6_430x422.png)
## 5.5.3 循环遍历字典元素
![](https://box.kancloud.cn/bc3f9e4f2da3ca8bcf977b8e53bd0f10_369x205.png)
## 5.5.4 一些迭代工具
1.并行迭代
![](https://box.kancloud.cn/aea466cf7f5ceb4a6e1459bbc29b39ed_497x326.png)
2.编号迭代
enumerate(strings):这个函数可以在提供索引的地方迭代索引-值对。
3.翻转和排序迭代
reversed 和 sorted。它们同列表 reverse 和 sort 方法类似。
![](https://box.kancloud.cn/4b99f31f49b3bbee29ef2a7a15c89809_546x123.png)
## 5.5.5 跳出循环
1.break
![](https://box.kancloud.cn/2dd46c76fa9d4c4868080bd286013c45_295x205.png)
2.continue
3. while True/break 习语
## 5.5.6 循环中else子句
当在循环内使用break 语句时,通常是因为‘找到’了某物或者因为某事“发生”了。在跳出时做一些事情是很简单的(比如print n),但是有些时候想要在没有跳出之前做些事情。那么怎么判断呢?可以使用布尔变量,在循环前设定为False,跳出后设定为True。然后再使用if语句查看 循环是否跳出了:
~~~
borke_out = False
for x in seq:
do_somthing(x)
if condition(x):
broke_out = True
break
do_something_else(x)
if not broke_out:
print "I didn't break out!"
~~~
上面方法太复杂了,换成:
![](https://box.kancloud.cn/600417ecd2be53ed70b4905e30b40cda_289x147.png)
# 5.6 列表推导式----轻量级循环
列表推导式(list comprehension)是利用其它列表创建新列表。
![](https://box.kancloud.cn/386213e22574a7b00bcca9275d35ac80_775x203.png)
# 5.7 三人行
pass、del 和 exec
## 5.71 什么都没发生
有的时候,程序什么事情都不用做。这种情况不多,但是一旦出现,就应该让 pass 语句出马。
![](https://box.kancloud.cn/345ef7b612bf57e3096fd4e0f1652c6d_289x101.png)
## 5.7.2 使用 del 删除
![](https://box.kancloud.cn/7fad53df9a58e400cc4c305def514ce9_600x385.png)
## 5.7.3 使用 exec 和 eval 执行和求值字符串
有些时候可能会需要动态地创造Python代码,然后将其作为语句执行或作为表达式计算,这可能近似于“黑暗魔法”----在此之前,一定要慎之又慎,仔细考虑。
1.exec
执行一个字符串的语句
![](https://box.kancloud.cn/1b24878e51ce1b6c2aba880733d8c07d_592x534.png)
![](https://box.kancloud.cn/87b379e0468969daa7b2b60da0e915ef_596x586.png)
潜在的破坏性代码并不会覆盖sqrt函数,原来的函数能正常工作,而通过exec赋值的变量sqrt只在它的作用域内有效。
![](https://box.kancloud.cn/46fc17bb5fb614f93f43584af61586d7_596x283.png)
注意,如果需要将scope 打印出来的话,会看到其中包含很多东西,因为内建的 __builtins__ 字典自动包含所有的内建函数和值。
2.eval
eval(用于“求值”)是类似于exec的内建函数。exec 语句会执行一系列 Python 语句,而 eval 会计算 Python 表达式(以字符串形式书写),并且返回结果值,(exec 语句并不返回任何对象,因为它本身就是语句)
![](https://box.kancloud.cn/9d939fd2ffcc4132bae9573e07ad207e_479x195.png)
![](https://box.kancloud.cn/8b96aba62b2d212251abbbccb15af890_407x215.png)
eval(raw_input) 《===》 input()
# 5.8 总结
* chr(n):当传入序号n时,返回n所代表的包含一个字符的字符串,(0=< n < 256)
* eval(source[, globals[, locals]]):将字符串作为表达式计算,并且返回值
* enumerate(seq):产生用于迭代的(索引,值)对
* ord(c):返回单字符字符串的int值
* range([start,] stop[, step]):创建整数的列表
* reversed(seq):产生seq中值的反向版本,用于迭代
* sorted(seq[, cmp][, key][, reverse]):返回seq中值排序后的列表
* xrange([start,] stop[, step]):创造xrange对象用于迭代
* zip(seq1, seq2...):创造用于并行迭代的新序列