- 参考书《Python基础教程(第三版)》—— Magnus Lie Hetland
文章目录
- 一、再看print和import
- 1. print()函数
- 2. import
- 二、特殊赋值方法
- 1. 序列解包
- 2. 链式赋值
- 3. 增强赋值
- 三、条件和条件语句 if-elif-else
- 1. 布尔值
- 2. 条件语句
- 3. 布尔表达式
- 4. 断言
- 四、循环语句
- 1. while循环
- 2. for循环
- 3. 迭代工具
- (1)并行迭代 zip()
- (2)迭代时获取索引
- (3)反向迭代和排序后再迭代
- 4. 跳出循环
- 五、简单推导和字典推导
- 六、其他语句del/pass/exec/eval
- 1. pass语句
- 2. exec语句
- 3. eval语句
- 4. del语句
一、再看print和import
1. print()函数
- 原型
print( para,para,..,(sep = para),(end = para) ):none
- print()可以打印一个表达式,这个表达式要么是字符串,要么自动转为字符串形式打印
- print()中可以填任意多个参数,关键字实参
sep
和end
可以缺省
-
sep
指定打印的两个参数间的间隔符,缺省为空格' '
-
end
指定打印的字符串的后缀,缺省为换行符'\n'
2. import
- 从模块导入
- 导入一个模块:
import 模块名
- 调用方法/函数:
模块名.方法/函数名()
,这里是方法/函数的引用 - 访问属性:
模块名.属性名
,这里是原属性的引用
- 导入一个模块中的所有属性和方法/函数:
from 模块名 import *
- 调用方法/函数:
方法/函数名()
,这里是方法/函数的引用 - 访问属性:
属性名
,这里是原属性的拷贝
- 导入某个方法:
from 模块名 import 方法名
- 导入某几个方法:
from 模块名 import 方法名1,方法名2,方法名3
- 如果有两个模块包含一样的方法名(如open)
- 给模块起别名:
improt 模块名 as 别名
- 给方法起别名:
from 模块名 import 方法名 as 别名
二、特殊赋值方法
1. 序列解包
- 序列解包:将一个序列或任何可迭代对象解包,并将得到的值存储到一系列变量中
- 序列解包在使用返回元组(或其他数列、可迭代对象啊)的函数/方法时很有用
- 收集参数
- 使用序列解包时,要确保左边给出的目标数目和被解包序列元素个数相同,否则出错
- 用 “带*变量” 收集多余的序列元素,这样带*变量得到一个列表
- 这种方法可以用到函数参数列表中
2. 链式赋值
3. 增强赋值
- 可以使用
+=
和-=
,类似C++
三、条件和条件语句 if-elif-else
1. 布尔值
- 标准真值是
True/False
,它们是1和0的别名
- 用作布尔表达式时
- 以下被解释为False:
False
/ None
/ 0
/ ''
/ ()
/ []
/ {}
- 其他被解释为True
- bool和list一样,可以用来转换其他值构造bool类型
2. 条件语句
-
if-elif-else
结构
3. 布尔表达式
- 比较运算符
符号 | 说明 | |
传统比较运算符 | | 类似C/C++中的比较符号 |
链式比较 | | 等价于 |
对象比较 | | 比较两个对象是否为同一个对象;而 |
成员资格检查 | | 如 |
- 字符串和序列的比较
- 字符串是根据字符的字母排序进行比较的
- 本质上比较的是unicode编码,字符是按码点排列的
- 可以用ord(char)返回字符的Unicode值
- 可以用chr(int)将Unicode值转为字符返回
- 序列的比较方式也是这样的
- 逻辑运算符
- 逻辑运算符用来连接多个布尔表达式,构成复合条件表达式
- python中的逻辑运算符:
and / or / not
- python的符合条件语句也有短路特性
运算符 | 操作 | 说明 |
| 与运算 | 类似C中 |
| 或运算 | 类似C中 |
| 非运算 | 类似C中 |
4. 断言
- 断言是if的“亲戚”,伪代码类似如下:
- 断言的目的在于在程序出错时立刻崩溃,而不是错误隐藏到之后再崩溃
- 基本上,可以用断言要求某些条件得到满足,比如判断参数合法
- 断言的形式
assert 条件表达式 (,'报错字符串')
四、循环语句
1. while循环
2. for循环
- 基本上,可迭代对象是可以用for循环遍历的对象。(后面再介绍迭代器,目前把可迭代对象视为序列即可)
- 为了方便遍历特定范围的数据,python提供内置函数
range(begin,end)
- 还可以加上步进长度参数
range(begin,end,step)
- 可以用类似序列的方法用for循环遍历字典,但是字典内部是没有顺序的,所有这样for循环打印的顺序是不一定的,只能保证所有值都被处理。如果顺序很重要,可以把键或值存入一个列表,对列表进行排序,再迭代
3. 迭代工具
- python提供了一系列可以帮助迭代的函数,其中一些位于
itertools
模块中,另外还有一些内置函数
(1)并行迭代 zip()
- 有时候可能想并行迭代两个序列,可以用
zip(a,b,c...)
把任意多个序列"缝合"起来,并返回一个由元组组成的序列。可以把它转换为列表查看 - 当被缝合的序列长度不同时,zip将只缝合并返回最短序列长度个元素
- zip配合序列解包,可以方便地进行多序列并行迭代
(2)迭代时获取索引
- 利用
enumerate(可迭代对象)
函数:返回一个由元组组成的序列,每个元组是由索引和元素值组成,用list()可以把这个序列转为元组列表。
(3)反向迭代和排序后再迭代
- python提供了两个内置函数
reversed(可迭代对象):list_reverseiterator object
和sorted(可迭代对象):list
,它们不修改原对象,而是返回反转后的“列表反向迭代对象”和“排序后的列表”
- 注意:
sorted()
返回一个列表,而reversed()
返回一个类似zip的更神秘的可迭代对象,我们不必关心这个到底意味着什么,在for循环或join等方法中使用完全没问题。但是不能对它进行索引或切片操作,也不能对它调用列表方法。要想当作列表一样用的话,可以用list()对返回对象进行转换
4. 跳出循环
- break(跳出循环)
- continue(跳过本次循环)
五、简单推导和字典推导
-
推到
不是语句,而是表达式 - 列表推导是一种从其他列表创建列表的方法,类似集合推导,工作原理类似for循环
- 将上面的
[]
换成()
不能实现元组推导,这样做将创建生成器 - 可以用
{}
进行字典推导
六、其他语句del/pass/exec/eval
1. pass语句
- pass语句不做任何事
- pass可以用作占位符,因为python中的代码块不能为空,用pass填充代码块,可以让程序运行并测试已经写好的部分
- 也可以插入一个字符串用作占位符,这种做法尤其适合未完成的函数和类,因为这种字符串将充当文档字符串
2. exec语句
- exec将字符串作为代码执行
- 大多数情况下,还应该向它传递一个命名空间——用于存放变量的地方,否则将污染命名空间(同名时覆盖原本代码中的变量或函数)
- exec是一个过程,无返回值
- 注意
exec
可能引入不安全的代码
3. eval语句
- eval计算用字符串表示的Python表达式值,并返回结果
- 类似exec,也可以像eval提供命名空间
4. del语句
- python中带有垃圾回收机制,如果一个对象没有任何人引用,将会被自动回收
-
del
语句也可以做到这一点,它不仅删除变量到对象的引用关系,还删除变量名称。但是del语句不会删除对象(事实上,python中无法手动释放对象,python的垃圾回收机制会自动释放不用的对象)