Python的对象模型
对象是python语言中最基本的概念,在python中处理的一切都是对象。
python中有许多内置对象可供编程者使用,内置对象可直接使用,如数字、字符串、列表、del等;非内置对象需要导入模块才能使用,如正弦函数sin(x),随机数产生函数random( )等。
对象类型 | 类型名称 | 示例 | 简要说明 |
---|---|---|---|
数字 | int, float, complex | 1234, 3.14, 1.3e5, 3+4j | 数字大小没有限制,内置支持复数及其运算 |
字符串 | str | 'swfu', "I'm student", '''Python ''', r'abc', R'bcd' | 不可变,使用单引号、双引号、三引号作为定界符,以字母r或R引导的表示原始字符串 |
字节串 | bytes | b’hello world’ | 以字母b引导,可以使用单引号、双引号、三引号作为定界符 |
列表 | list | [1, 2, 3],['a', 'b', ['c', 2]] | 所有元素放在一对方括号中,元素之间使用逗号分隔,其中的元素可以是任意类型 |
字典 | dict | {1:'food' ,2:'taste', 3:'import'} | 所有元素放在一对大括号中,元素之间使用逗号分隔,元素形式为“键:值” |
元组 | tuple | (2, -5, 6), (3,) | 不可变,所有元素放在一对圆括号中,元素之间使用逗号分隔 如果元组中只有一个元素的话,后面的逗号不能省略 |
集合 | set、frozenset | {'a', 'b', 'c'} | 所有元素放在一对大括号中,元素之间使用逗号分隔,元素不允许重复 另外,set是可变的,而frozenset是不可变的 |
布尔型 | bool | True、False | 逻辑值,关系运算符、成员测试运算符、同一性测试运算符组成的表达式的值一般为True或False |
空类型 | NoneType | None | 空值 |
异常 | Exception、ValueError、TypeError | Python内置大量异常类,分别对应不同类型的异常 | |
文件 | f = open('data.dat', 'rb') | open是Python内置函数,使用指定的模式打开文件,返回文件对象 | |
其他可迭代对象 | 生成器对象、range对象、zip对象、enumerate对象、map对象、filter对象等等 | 具有惰性求值的特点,除range对象之外,其他对象中的元素只能看一次 | |
编程单元 | 函数(使用def定义) 类(使用class定义) 模块(类型为module) | 类和函数都属于可调用对象,模块用来集中存放函数、类、常量或其他对象 |
Python变量
变量类型
在Python中,不需要事先声明变量名及其类型,直接赋值即可创建各种类型的对象变量。这一点适用于Python任意类型的对象。
Python属于强类型编程语言,Python解释器会根据赋值或运算来自动推断变量类型。
Python还是一种动态类型语言,变量的类型也是可以随时变化的。
如果变量出现在赋值运算符或复合赋值运算符(例如+=、*=等等)的左边则表示创建变量或修改变量的值,否则表示引用该变量的值。
变量名
在定义变量名的时候,需要注意以下问题:
- 变量名必须以字母、汉字或下划线开头,但以下划线开头的变量在Python中有特殊含义;
- 变量名中不能有空格以及标点符号(括号、引号、逗号、斜线、反斜线、冒号、句号、问号等等);
- 不能使用关键字作变量名,可以导入keyword模块后使用print(keyword.kwlist)查看所有Python关键字;
- 不建议使用系统内置的模块名、类型名或函数名以及已导入的模块名及其成员名作变量名,这将会改变其类型和含义,可以通过dir(builtins)查看所有内置模块、类型和函数;
- 变量名对英文字母的大小写敏感,例如student和Student是不同的变量。
不可变变量
字符串和元组属于不可变序列,不能通过下标的方式来修改其中的元素值,试图修改元组中元素的值时会抛出异常。
Python变量的引用与内存管理
变量引用
在Python中,允许多个变量指向同一个值,然而,当为其中一个变量修改值以后,其内存地址将会变化,但这并不影响另一个变量。
赋值语句的执行过程是:首先把等号右侧表达式的值计算出来,然后在内存中寻找一个位置把值存放进去,最后创建变量并指向这个内存地址。
Python中的变量并不直接存储值,而是存储了值的内存地址或者引用,这也是变量类型随时可以改变的原因。
内存管理
Python采用基于值的内存管理方式,如果为不同变量赋值为相同值,这个值在内存中只保存一份,多个变量指向同一个值的内存空间首地址,这样可以减少内存空间的占用,提高内存利用率。
Python启动时,会对[-5, 256]区间的整数进行缓存。也就是说,如果多个变量的值相等且介于[-5, 256]区间内,那么这些变量共用同一个值的内存空间。
对于区间[-5, 256]区间之外的整数,同一个程序中或交互模式下同一个语句中的同值不同名变量会共用同一个内存空间,不同程序或交互模式下不同语句不遵守这个约定。
Python不会对实数进行缓存,交互模式下同值不同名的变量不共用同一个内存空间,同一个程序中的同值不同名变量会共用同一个内存空间。
Python具有自动管理内存的功能,会跟踪所有的值,并自动删除不再使用或者引用次数为0的值。如果确定某个变量不再使用,可以使用del命令显式删除该变量,值的引用次数减1,当某个值的引用次数变为0时,将会被Python的垃圾回收机制自动删除并释放内存空间。
Python数字
Python可以表示任意大小的数值。
Python中的整数类型可以分为:
- 十进制整数,如,0、-1、9、123
- 十六进制整数,需要16个数字0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f来表示整数,必须以0x开头,如0x10、0xfa、0xabcdef
- 八进制整数,只需要8个数字0、1、2、3、4、5、6、7来表示整数,必须以0o开头,如0o35、0o11
- 二进制整数,只需要2个数字0、1来表示整数,必须以0b开头,如,0b101、0b100
Python内置支持复数类型。
Python 3.6.x开始支持在数字中间位置使用单个下划线作为分隔来提高数字的可读性,类似于数学上使用逗号作为千位分隔符。
Python字符串
用单引号、双引号或三引号界定的符号系列称为字符串。
字符串属于不可变序列。
单引号、双引号、三单引号、三双引号可以互相嵌套,用来表示复杂字符串。
空字符串表示为''或 "" 。
三引号'''或"""表示的字符串可以换行,支持排版较为复杂的字符串;三引号还可以在程序中表示较长的注释。
常用转义字符
转义字符 | 含义 | 转义字符 | 含义 |
---|---|---|---|
\b | 退格,把光标移动到前一列位置 | \\ | 一个斜线\ |
\f | 换页符 | \’ | 单引号’ |
\n | 换行符 | \” | 双引号” |
\r | 回车 | \ooo | 3位八进制数对应的字符 |
\t | 水平制表符 | \xhh | 2位十六进制数对应的字符 |
\v | 垂直制表符 | \uhhhh | 4位十六进制数表示的Unicode字符 |
字符串界定符前面加字母r或R表示原始字符串,其中的特殊字符不进行转义,但字符串的最后一个字符不能是\。原始字符串主要用于正则表达式、文件路径或者URL的场合。
Python运算符和表达式
运算符
运算符 | 功能说明 |
---|---|
+ | 算术加法,列表、元组、字符串合并与连接,正号 |
- | 算术减法,集合差集,相反数 |
* | 算术乘法,序列重复 |
/ | 真除法 |
// | 求整商,但如果操作数中有实数的话,结果为实数形式的整数 |
% | 求余数,字符串格式化 |
** | 幂运算 |
<、<=、>、>=、==、!= | 大小比较,集合的包含关系比较 |
or | 逻辑或 |
and | 逻辑与 |
not | 逻辑非 |
in | 成员测试 |
is | 对象同一性测试,即测试是否为同一个对象或内存地址是否相同 |
|、^、&、<<、>>、~ | 位或、位异或、位与、左移位、右移位、位求反 |
&、|、^ | 集合交集、并集、对称差集 |
表达式
在Python中,单个任何类型的对象或常数属于合法表达式,使用运算符连接的变量和常量以及函数调用的任意组合也属于合法的表达式。
运算符和表达式的优先级
优先级从低到高:
运算符 | 描述 |
---|---|
:= | 赋值表达式,Python 3.8新增 |
lambda | lambda 表达式 |
if -- else | 条件表达式 |
or | 逻辑或运算 |
and | 逻辑与运算 |
not | 逻辑非运算 |
in, not in, is, is not, <, <=, >, >=, !=, == | 测试、比较 |
| | 位或运算 |
^ | 位异或运算 |
& | 位与运算 |
<<, >> | 左移位,右移位 |
+, - | 加,减 |
*, @, /, //, % | 乘,矩阵乘,除,整除,取余 |
+x, -x, ~x | 正,负,位求反 |
** | 幂运算,具有右结合性 |
await x | await表达式 |
x[index], x[index:index], x(arguments...), x.attribute | 抽取,切片,调用,属性引用 |
(expressions...), [expressions...], {key: value...}, {expressions...} | 绑定或加圆括号的表达式,列表显示,字典显示,集合显示 |
部分运算符的特殊用法
"+"运算符除了用于算术加法以外,还可以用于列表、元组、字符串的连接,但不支持不同类型的对象之间相加或连接。
"*"运算符不仅可以用于数值乘法,还可以用于列表、字符串、元组等类型,当列表、字符串或元组等类型变量与整数进行“*”运算时,表示对内容进行重复并返回重复后的新对象。
Python中的除法有两种,“/”和“//”分别表示除法和整除运算。
"%"运算符除去可以用于字符串格式化之外,还可以对整数和浮点数计算余数。但是由于浮点数的精确度影响,计算结果可能略有误差。
关系运算符可以连用,一般用于同类型对象之间值的大小比较,或者测试集合之间的包含关系。
成员测试运算符"in"用于成员测试,即测试一个对象是否为另一个对象的元素。
同一性测试运算符(identity comparison)"is"用来测试两个对象是否是同一个,如果是则返回True,否则返回False。如果两个对象是同一个,二者具有相同的内存地址。
位运算符只能用于整数,其内部执行过程为:首先将整数转换为二进制数,然后右对齐,必要的时候左侧补0,按位进行运算,最后再把计算结果转换为十进制数字返回。
集合的交集、并集、对称差集等运算借助于位运算符来实现,而差集则使用减号运算符实现(注意,并集运算符不是加号,而是"|")。
and和or具有惰性求值特点,只计算必须计算的表达式。
逗号并不是运算符,只是一个普通分隔符。
Python不支持++和--运算符,只是两个连续的加号和减号。
>>> i++ #Python不支持++运算符,语法错误
SyntaxError: invalid syntax
>>> --i #负负得正
3
Python基本输入输出
输入
用Python进行程序设计,输入是通过input( )函数来实现的,input( )的一般格式为:
x = input('提示:')
该函数返回输入的对象。可输入数字、字符串和其它任意类型对象。
在Python 3.x中,input()函数用来接收用户的键盘输入,不论用户输入数据时使用什么界定符,input()函数的返回结果都是字符串,需要将其转换为相应的类型再处理。
>>> x = input('Please input:')
Please input:3
>>> print(type(x))
<class 'str'>
>>> x = input('Please input:')
Please input:'1'
>>> print(type(x))
<class 'str'>
>>> x = input('Please input:')
Please input:[1,2,3]
>>> print(type(x))
<class 'str'>
输出
Python 3.x中使用print()函数进行输出。
>>> print(3, 5, 7)
3 5 7
>>> print(3, 5, 7, sep=',') #指定分隔符
3,5,7
>>> print(3, 5, 7, sep=':')
3:5:7
>>> for i in range(10,20):
print(i, end=' ') #不换行
10 11 12 13 14 15 16 17 18 19