数据类型
除,整除
与其他语言不通,/
是除法,得到的 float 类型,要得到整型需要用//
1 | type(2/2) # float |
二进制,八进制,十六进制
1 | 0b10 # 2进制 |
布尔类型
布尔类型有两个值,True
与False
- 对于整数来说,非 0 可以转为
True
,0 可以转为False
- 对于字符串来说,空字符串可以转为
False
,其他字符串可以转为True
- 对于列表和元组等序列来说,空序列可以转为
False
,序列中有元素可以转为True
- 对集合和字典来说,空字典,空集合可以转为
False
,字典或序列中有元素可以转为True
- None 也可以转为
False
1 | num1 = 1 |
单引号和双引号
- 单引号:单引号可以包含双引号,例如:
'My name is "ljl"'
- 双引号:双引号也可以包含单引号,例如:
"Let's go"
多行文本
多行文本可以用三个双引号表示,也可以用三个单引号表示,例如:
1 | ''' |
- 要显示字符串的格式要使用
print
函数 - idle 会把字符串中的格式变为转义字符,如下:
原始字符
在字符串前加一个 r,字符串中的转义字符不会被解析
1 | print(r'aaa \n aaa') # aaa \n aaa |
字符串的操作
1 | s1 = "Hello" |
模板字符串
1 | name = "Liujinlong" |
Python 中的列表
列表的定义
- 列表中元素的类型是任意的
1 | a = [1, 2, 3] |
列表的操作
1 | l1 = [1, 2, 3, 4] |
元组
- 列表与元组的区别
- 列表时可变的,元组不可变
- 元组可以作为字典的 key,但是列表不行
1 | (1, 2, 3, True) |
序列的总结
- str list tuple 都属于序列
- 每个元素都会分配一个序号
- 都支持切片操作
- 支持包含操作:
1 | print('or' in 'Hello world') # True |
- 长度:
len([1, 2, 3])
- 最大最小:
max([1, 2, 3]), min([1, 2, 3])
集合
- 集合 Set 的特点
- 元素是无序的
- 元素是不重复的
1 | {1, 2, 3, 4, 5} |
字典
- Key 不能重复
- Key 必须是不可变的类型
- 列表是可变的,所以不能作为字典的 key
- int,元组,bool 都是不可变的
1 | empty = {} # 空字典 |
变量和运算符
变量的定义
- Python 中的变量就是一个值的别名
- 原则:变量名要有意义
变量命名规则
- 变量名的首字符不能是数字
- 只能包含字母,数字,下划线
- 系统的关键字不能用作变量名,非系统保留关键字,但是标准库函数的,也不要使用,例如:type
- 变量区分大小写
值类型和引用类型
- 值类型:int, str, tuple
- 引用类型:list, set, dict
id()
: 显示变量内存地址
list 与 tuple
- list 是可改变的
- tuple 是不可改变的
- 使用原则:能用元组尽量用元组,因为元组不可改变,更为安全
1 | a = [1, 2, 3] |
运算符号
- 数学运算符:
+-*/
- 整除:
//
- 余数:
%
- 乘方:
**
例如,2**2 = 4
- 赋值运算符:
=, +=, -=, *=, /=, %=, **=, //=
- 比较运算符:
==, !=, >=, >, <=, <
- 字符串,bool 都可以比较,字符串转为 ascii 码进行比较,bool 则是 True 转为 1,False 转为 0
- 比较返回一个 bool 值
- 列表,元组都可以比较,比较的规则是一个一个元素进行比较,直到比较出结果
- 逻辑运算符:
and, or, not
- 非 Bool 类型也可以进行逻辑运算,规则是将非 Bool 类型先转为 Bool 类型再进行计算
- int, float 转为 bool,0 为 False,非 0 为 True
- 字符串转为 bool,空字符串为 False,非空字符串为 True
- 列表转为 bool,空列表为 False,非空列表为 True
- 元组,set,dict 与列表一样
- 举例:
2 and 1 # 1
1 and 2 # 2
1 or 2 # 1
0 or 1 # 1
- 返回的值符合就近原则,例如
2 and 1
,更具左边的元素 2 无法判断出结果,读取 1 后,可以判断出结构,所有返回 1,1 or 2
根据左边的元素 1 就直接可以判断出表达式的值,所以直接返回 1
- 成员运算符:
in, not in
- 一个元素是否在另外的一组元素中
- 返回 bool 类型
- 可以作用于:列表,字符串,元组,set,dict
- 字典判断的是 key
- 身份运算符:is, not is
- 比较的是两个变量的内存地址是否相等
- 对象的三个特征:值,类型,身份
- 判断类型 type(a):
type(a) == int
- 推荐使用 isinstance()方法进行类型判断,例如:
isinstance(a, int), isinstance(a, (int, float, str))
- 位运算符:&, |, ^, ~, <<, >>
特殊的地方:
- Python 没有自增,自减操作
分支,循环,条件,枚举
什么是表达式
- 表达式是运算符和操作数所构成的序列
表达式优先级
- and 的优先级大于 or,not > and > or
- 解析表达式的顺序:
- 相同优先级从左向右,左结合
- 使用括号改变优先级
- 赋值运算符是右结合
流程控制语句
- if, if-else
- pass 空语句
- while 语句, while-else(循环退出时,执行 else)
- for: 遍历集合,序列,字典,for-else(遍历完成,执行 else)
- break:跳出循环,从 break 退出循环,不会执行 else 语句
- continue: 跳过本次循环
- range 函数,第一个参数为起始位置,第二个参数为序列元素个数,第三个参数为步长
1 | a = 1 |
Comprehension
1 | # List Comprehension |
包,模块,类,函数与变量
包
- 一个文件夹就是一个包,包名就是文件名
- 子包:文件夹里还有一个文件夹
- 文件夹里必须有一个
__init__.py
文件
模块
- 一个文件就是一个模块,模块名就是文件名
- 不同包的相同模块在引用是使用:
包名.模块名
__init__.py
文件也是一个模块
导入另外一个模块
导入一个模块有两种方法,import 和 from-import
import 导入
- 语法:
import package1
- import 导入的是一个模块,使用模块里的变量名时需要带上模块名,例如
package1.a
- 可以使用 as 关键字给模块起一个别名
1 | import test |
from-import 导入
- 语法:
from module import a
- from-input 可以直接导入变量,例如
from package.module import a
- from-input 可以导入模块
from package import module
- 使用引入所有变量:`from test import `
- 指定使用*时模块可导出的变量:使用内置变量
__all__
- 引入多个变量:
from test import a, b, c
1 | from test import a |
__input__.py
文件
- 导入包或者包内的某个模块时,
__init__.py
会被自动执行,可以做一些初始化的工作 __init__.py
的应用场景:- 决定哪些模块可以被导出
- 批量导入某些模块,在使用包是不需要再次导入
- 做一些包的初始化工作
1 | # __init__.py 包名:t |
包和模块的几个常见问题
- 包和模块是不会重复导入的
- 避免循环导入,即 A 模块导入 B 模块,B 模块又导入 A 模块,这样编译器会报错
- 导入模块时就会执行模块里的代码,但只会执行一次
模块里的变量
可以使用 dir()可以打印出模块里的所有变量,dic(module)
打印模块中所有的变量
__name__
: 模块的完整名称,包括包名package.module
__package__
: 模块所属的包名__file__
: 模块文件的完整路径__doc__
: 模块的注释
1 | # module1 |
如果一个模块被当成应用程序执行的入口(直接通过pyton xxx.py
执行),则上面的几个变量就会变。
__name__
变为__main__
__package__
为空__file__
为是执行路径与模块文件名的相对路径,与执行路径有关
1 | print("__name__ :" + (__name__ or "None")) |
__name__
的应用
1 | if __name__ == '__main__': |
上面的语句是标明的 Python 文件既可以作为模块,也可以作为 app 的入口文件
相对导入和绝对导入
- 顶级包和入口文件有关,入口文件所在的文件夹并不是顶级包
- 绝对导入:从顶级包开始导入
import package1.package2.module
或from package1.package2 import module1
- 相对导入:
from .m3 import *
,相对导入只能用于from-import
- 入口文件不能用相对导入,因为
__main__
这个模块是不存在的,除非使用python -m
- .当前文件夹
- ..上一层文件夹
- …上上层文件夹
- 入口文件不能用相对导入,因为
- 注意事项:与入口文件同级目录下不要再有其他模块
示例,如下图目录结构:
要在main.py
中引入其他模块,不能使用相对导入,只能使用绝对导入:
1 | # main.py |
在module1_1_2.py
中导入其他模块可以使用相对导入
1 | from . import module1_1_1 |
上面要注意的一点是,package1
中的模块引用package2
中的模块时,只能用绝对导入,因为package1
和package2
都是和入口文件main.py
同级的
未完待续!