Skip to content

Commit 4225909

Browse files
committed
add chapter [11,12,13,14]
1 parent 8d3a801 commit 4225909

18 files changed

Lines changed: 244 additions & 0 deletions

chapter/11_python_assignment.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# 赋值语句
2+
1.赋值的左侧可以为变量名或者对象元素,右侧为任何表达式
3+
4+
* 赋值总是建立对象的引用值,而不是复制对象
5+
* 变量名会在首次被赋值时创建。此后,每当这个变量名出现在表达式中时,会被它引用的对象所替代
6+
* 变量名必须先赋值后引用,否则报错
7+
* 模块导入、函数定义、类定义、`for`循环、函数参数传递 等过程都会触发隐式赋值,原理、规则同显式赋值
8+
9+
2.赋值语句的形式:
10+
11+
* 基本形式: `x='abcd'`
12+
* 元组赋值: `a,b="ab","cd"`,按照位置一一对应赋值
13+
* 列表赋值: `[a,b]=["ab","cd"]`,按照位置一一对应赋值
14+
* 扩展的序列解包赋值: `a,*b="abcd"`,结果是 `b`等于`['b','c','d']`
15+
* 多目标赋值: `a=b="abcd"`
16+
>注意此时`a`和`b`都引用同一个对象。如果这个对象是个可变对象,则使用`a`或者`b`
17+
对它进行原地修改可能导致陷阱
18+
* 增强赋值: `a+='ef'`,等价于`a=a+`ef`
19+
>若`a`指向的是可变对象,则`+=`很有可能是原地操作
20+
> 所有的二元表达式运算符均有增强赋值语句
21+
![赋值语句](../imgs/python_11_1.JPG)
22+
23+
3.Python3中,元组和列表赋值统一化为序列赋值:`a,b=['ab','cd']`,左侧为任何类型的变量名序列,右侧为任何类型的值序列,只需要变量名序列和值序列长度相等。赋值时根据位置一一对应赋值。
24+
25+
* 若变量名序列和值序列长度不等,则抛出`ValueError`异常
26+
* 支持嵌套的赋值序列,Python会自动根据实际情况分解成其组成部分,然后递归赋值。要求左侧变量名序列的嵌套形状必须符合右侧值序列的嵌套形状。
27+
![序列赋值和嵌套序列赋值](../imgs/python_11_2.JPG)
28+
29+
4.扩展的序列解包赋值:收集右侧值序列中未赋值的项为一个列表,将该列表赋值给带星号`*`的变量
30+
31+
* 左边的变量名序列长度不需要与值序列的长度相等,其中只能有一个变量名带星号`*`
32+
* 若带星号`*`变量名只匹配一项,则也是产生一个列表,列表中只有一个元素,如`a,*b="12"`,`b`为`[2]`
33+
* 若带星号`*`变量名没有匹配项,则也是产生空列表,如`a,*b="1"`,`b`为`[]`
34+
* 带星号`*`的变量名可以出现在变量名序列中的任何位置如`*a,b="1234"``a``[1,2,3]`
35+
* 匹配过程优先考虑不带星号的变量名,剩下的才匹配带星号的变量名
36+
* 以下情况会引发错误:
37+
* 左侧变量名序列有两个星号,如`*a,*b="abcd"`
38+
* 左侧变量名序列无星号但是左右长度不匹配,如`a,b="abcd"`
39+
* 左侧变量名序列星号的名称不在序列中,如`*a='abcd'`
40+
* 可以用手动分片来模拟扩展赋值行为
41+
![扩展的序列解包赋值](../imgs/python_11_3.JPG)
42+
43+
5.增强赋值的优点:
44+
45+
* `X+=Y`中,`X`可以是复杂的对象表达式,只需要求值一次。而`X=X+Y`中,要对`X`求值两次
46+
* 对支持原地修改的对象而言,增强形式的赋值会自动执行原地修改的预算:
47+
* `L=L+[1,2]`会生成新对象
48+
* `L+[1,2]`会执行原地修改
49+
![增强赋值](../imgs/python_11_4.JPG)
50+
51+
52+
53+

chapter/12_python_print.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# 打印
2+
1.打印`print`类似于文件`.write()`方法,它将默认地把对象打印到`stdout`流中。它会自动添加一些自动化的格式。
3+
> 和文件的`.write()`方法不同的是,`print`不需要将对象转换为字符串
4+
5+
2.在Python3中,`print`是一个内置函数,用关键字参数表示特定模式,其语法格式为:
6+
`print(obj1,obj2,sep=' ',end='\n',file=sys.stdout)`,返回值为`None`
7+
8+
* 参数意义依次为:
9+
* 待打印对象作为位置参数依次给出
10+
* `sep`关键字参数指定分隔符,默认为空格
11+
* `end`关键字参数指定结尾字符串,默认为换行符
12+
* `file`指定输出位置,默认为标准输出文件,它必须是一个写打开的文件对象
13+
* 每个被打印的对象依次自动通过内置的`str()`函数取得其文本表示
14+
* 当没有打印对象时,`print()`会把一个换行符(或者由`end`指定的其他字符串)打印到标准输出流中(或者由`file`指定的文件中)
15+
* 关键字参数可以以任何顺序出现,但必须在位置参数之后
16+
* 如果想指定对齐或者位宽,则可以先构建格式化表达式来生成字符串,然后在`print`这个字符串
17+
![print示例](../imgs/python_12_1.JPG)
18+
19+
>Python2中,`print`是语句,有自己的特定语法:`print x,y`,如果想指定结尾字符串(默认为换行),则用`print x,y, '\t'`
20+
21+
3.`print`实际上是向文件对象中写文本字符串,因此对于字符串常量的一对引号实际上是不输出的,它只是输出字符串的内容。而交互式命令中,为了显示指定字符串,输出中带有一对引号。
22+
![print与交互式显示区别](../imgs/python_12_2.JPG)
23+
24+
4.你也可以用`sys.stdout.write(str(x)+' '+str(y)+'\n')`代替`print(x,y)`
25+
26+
5.`file`关键字指定的对象可以是文件对象,也可以是拥有`.write()`方法的其他对象
27+
28+
6.指定了默认的`file`关键字参数时,也可以输出重定向,如
29+
30+
```
31+
temp=sys.stdout #保存旧值
32+
sys.stdout=open('test.txt','a') #重新对stdout赋值,该文件对象必须写打开
33+
print(obj1,obj2)
34+
sys.stdout.close() #此句可以不要,此时文件对象自动回收,文件自动关闭
35+
sys.stdout=temp #恢复旧值
36+
```
37+
7.在Python3中,可以通过`from __future __import print_function`使用Python3中的`print()`函数
38+
39+
8.Python3的`input()`直接把输入的文本作为一个字符串返回,不会求值
40+
(<font color='red'>输入什么,字符串中就是什么</font>)。
41+
>Python2中的`input()`会对字符串求职,就像他们是输入到一个脚本的程序代码一样
42+
43+
![input函数](../imgs/python_12_3.JPG)
44+
45+
46+

chapter/13_python_if.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# `if`语句
2+
1.`if`语句的的通用格式:
3+
4+
```
5+
if test_expr1: #必选
6+
statement1#必选
7+
elif test_expr2: #可选
8+
statement2
9+
else: #可选
10+
statement3
11+
```
12+
13+
* 注意`if``elif``else`的缩进一致
14+
* 除了开头的`if`以及关联的子句外,`elif``else`均可选
15+
16+
2.Python中多路分支必须写成一系列的`if/elif`测试,因为Python中没有`switch-case`语句
17+
>字典也可以执行多路分支的逻辑,如:
18+
>
19+
>```
20+
> mydict={'a':func1,'b':func2}
21+
> choice='a'
22+
> print(mydict[choice])
23+
>```
24+
25+
3.Python中的真值测试:
26+
27+
* 任何非0数字或者非空对象为`True`,数字0、空对象(如空列表,空字典、空元组、空`set`、空字符串)、`None`对象为`False`
28+
* 比较、相等测试会递归地应用在嵌套的数据结构中,他们返回`True`或`False`
29+
* 布尔`and`和`or`运算符会返回真或假的操作对象,而不是`True`或`Flase`,并且它们是短路计算
30+
* `and`:从左到右依次对操作对象求值,停在第一个为假的对象上并返回它,或者当前面所有操作对象为真时返回最后一个操作对象
31+
* `or`:从左到右依次对操作对象求值,停在第一个为真的对象上并返回它,或者当前面所有操作对象为假时返回最后一个操作对象
32+
33+
![Python中的真假测试](../imgs/python_13_1.JPG)
34+
35+
4.Python支持`if|else`三元表达式:`Y if X else Z`:
36+
当`X`为真时,表达式的值为`Y`;当`X`为假时,表达式的值为`Z`。
37+
<font color='red'>注意这里为短路计算,并不会同时对`Y`和`Z`求值</font>。
38+
39+
* 三元表达式`X? Y:Z`也能得到同样的效果
40+
* 还有一种模拟方法:`[Z,Y][bool(X)]`。但是它会同时对`Z`、`Y`求值,可能会有副作用。
41+
> `bool(X)`将`X`转换成对应的1或者0
42+
43+

chapter/14_python_loop.md

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# `while``for`循环
2+
1.`while`语句格式:
3+
4+
```
5+
while test_expr:
6+
statement1
7+
else:#可选
8+
statement2
9+
```
10+
* `while``else`缩进必须一致。
11+
* `else`可选。`else`子句在控制权离开循环且未碰到`break`语句时执行。即在正常离开循环时执行(`break`是非正常离开循环)
12+
*`while`子句中可以使用下列语句:
13+
* `break`:跳出最近所在的循环到循环外部
14+
* `continute`:跳过本次循环后续部分,直接掉转到下一轮循环起始处
15+
* `pass`:占位符,什么都不做
16+
>在Python3中,允许在使用表达式的地方使用`...`代表,
17+
>这是`pass`语句的一种替代方案。它表示代码随后填充,是未确定的内容
18+
19+
![while语句](../imgs/python_14_1.JPG)
20+
21+
2.`for`语句格式:
22+
23+
```
24+
for target_var in iter_obj:
25+
statement1
26+
else:#可选
27+
statement2
28+
```
29+
* `for``else`缩进必须一致。
30+
* `else`可选。`else`子句在控制权离开循环且未碰到`break`语句时执行。即在正常离开循环时执行(`break`是非正常离开循环)
31+
*`for`子句中可以使用`break``continute``pass`语句
32+
* `target_var`是赋值目标,`iter_obj`是任何可迭代对象。每一轮迭代时将迭代获得的值赋值给`target_var`,然后执行`statement1`
33+
>任何赋值目标在语法上均有效,即使是嵌套的结构也能自动解包:
34+
>
35+
```
36+
for ((a,b),c) in [((1,2),3),((4,5),6)]:#自动解包
37+
print(a,b,c)
38+
```
39+
>当然你也可以手动解包:
40+
>
41+
```
42+
for both in [((1,2),3),((4,5),6)]:#自动解包
43+
((a,b),c)=both
44+
print(a,b,c)
45+
```
46+
47+
![for语句](../imgs/python_14_2.JPG)
48+
49+
3.`for`扫描文件时,直接使用文件对象迭代,每次迭代时读取一行,执行速度快,占用内存少:
50+
51+
```
52+
for line in open('test.txt'):
53+
print(line)
54+
```
55+
56+
4.`for`语句通常比对应的`while`语句执行速度快
57+
58+
5.Python3中,`range()`返回一个迭代器对象。用法为:`range(0,10,2)`,其中`0`为起始数,`10`为终止数(不包含),`2`为步长。默认步长为1,起始为0.
59+
>Python2中,`range()`返回一个列表对象
60+
61+
* 要得到列表,用`list(range(0,10,2))`
62+
* 通常`range()`用于`for`循环:
63+
64+
```
65+
S="abcdefg"
66+
for i in range(0,len(S),2):
67+
print(S[i],end=" ")
68+
```
69+
它也等价于下列循环:
70+
71+
```
72+
S="abcdefg"
73+
for c in S[::2]
74+
print(c,end=" ")
75+
```
76+
用range()优点是它并未复制字符串
77+
* 当我们遍历列表且对其进行修改时,要用到`range()``len()`组合。直接用`for`遍历列表不能修改列表,因为`for x in L:`遍历的是列表元素,不是列表中元素的位置。
78+
![range()函数](../imgs/python_14_3.JPG)
79+
80+
6.Python3中,`zip()`函数返回一个迭代器对象。
81+
>Python2中,`zip()`返回一个元组对的列表
82+
83+
* `list(zip(L1,L2))`创建一个列表,列表元素为元组对,元组对的第一个元素来自于`L1`,第二个元素来自于`L2`,列表长度为`L1``L2`的最小值
84+
* `zip()`可以有两个以上的参数,且这些参数可以是任意的可迭代对象
85+
* 可以在循环中用自动列表解包:
86+
87+
```
88+
for x,y,z in zip(iter_obj1,iter_obj2,iter_obj3):
89+
pass
90+
```
91+
![zip()函数](../imgs/python_14_4.JPG)
92+
93+
7.Python3中,`map()`函数生成一个可迭代对象,用法为:`map(func,iter_obj)`。每一次迭代则在迭代得到的元素上应用函数`func`
94+
>Python2中,`map()`执行的是另一种语意
95+
96+
![map()函数](../imgs/python_14_5.JPG)
97+
98+
8.`enumerate()`函数生成一个可迭代对象,用法为:`enumerate(iter_obj)`。每一次迭代生成一个`(index,value)`元组,`index`表示迭代次数,从0开始计数,`value`代表迭代获得的元素值。
99+
100+
![enumerate()函数](../imgs/python_14_6.JPG)
101+
102+

imgs/python_11_1.JPG

35.1 KB
Loading

imgs/python_11_2.JPG

26 KB
Loading

imgs/python_11_3.JPG

50.9 KB
Loading

imgs/python_11_4.JPG

18.6 KB
Loading

imgs/python_12_1.JPG

17.4 KB
Loading

imgs/python_12_2.JPG

15.9 KB
Loading

0 commit comments

Comments
 (0)