Python程序的构成
- Python程序由模块组成。一个模块对应Python源文件,一般后缀名为.py。
- 模块由语句组成。运行Python程序时,按照模块中语句的顺序依次执行。
- 语句是Python程序的构造单元,用于创建对象、变量赋值、调用函数、控制语句等。
使用\行连接符
将一行比较长的程序分为多行,使用\行连接符,把它放在行结束的地方。
>>> a = [10, 20, 30, 40,\
>>> 50, 60, 70,\
>>> 80, 90, 100]
对象
Python中,一切皆对象。每个对象由标识(identity)、类型(type)、值(value)组成。
- 标识用于唯一标识对象,通常对应于对象在计算机内存中的地址。使用内置函数id(obj)可返回对象obj的标识。
- 类型用于表示对象存储的数据的类型。类型可以限制对象的取值范围以及可执行的操作。可以使用type(obj)获取对象的所属类型。
- 值表示对象所存储的数据的信息。使用print(obj)可以直接打印出值。
对象的本质就是:一个内存块,拥有特定的值,支持特定类型的相关操作。
>>> a = 3
>>> b = "我爱你"
引用
在Python 中变量也称为对象的引用,因为变量存储的就是对象的地址。
变量通过地址引用了对象。变量位于栈内存,对象位于堆内存。
- Python是动态类型的语言,变量不需要显示声明类型,根据变量引用的对象,Python解释器自动确定数据类型。
- Python是强类型语言,每个对象都有数据类型,只支持该类型支持的操作。
标识符
标识符:用于变量、函数、类、模块等的名称。标识符有如下的规则:
- 区分大小写。
- 第一个字符必须是字母、下划线,其后的字符是:字母、数字、下划线。
- 不能使用关键字。
- 以双下划线开头和结尾的名称通常有特殊含义,尽量避免这种写法。比如:__init__是类的构造函数。
Python标识符命名规则
类型 | 规则 | 例子 |
---|---|---|
模块名和包名 | 全小写字母,多个单词之间用下划线 | math、os、sys |
函数名 | 全小写字母,多个单词之间用下划线 | phone、my_name |
类名 | 首字母大写,采用驼峰原则 | MyPhone、MyClass |
常量名 | 全大写字母,多个单词之间用下划线隔开 | SPEED、MAX_SPEED |
变量的声明和赋值
变量的声明和赋值用于将一个变量绑定到一个对象上,格式如下
变量名 = 表达式
最简单的表达式就是字面量。比如: a = 123。运行过程中,解释器先运行右边的表达式,生成一个代表表达式运算结果的对象;然后,将这个对象地址赋值给左边的变量。
删除变量和垃圾回收机制
使用del语句删除不再使用的变量
>>> a = 123
>>> del a
从栈中删除变量a后,堆中对象a的内存空间将会被垃圾回收机制进行回收。
链式赋值
链式赋值用于同一个对象赋值给多个变量
>>> x = y = 123
// 相当于
>>> x = 123
>>> y = 123
系列解包赋值
系列数据赋值给对应相同个数的变量
>>> a, b ,c = 4, 5, 6
// 相当于
>>> a = 4
>>> b = 5
>>> c = 6
// 变量互换
>>> a, b = b, a
常量
Python不支持常量,没有语法规则限制改变一个常量的值。只能通过约定常量的命名规则,在程序的逻辑上不对常量的值做出修改。
最基本内置数据类型和运算符
Python最基本的内置数据类型:
- 整型
- 浮点型
- 布尔型
- 字符串型
数字
// 整数除法,例如:7 // 2 = 3
% 模,例如:7 % 4 = 3
** 幂,例如:2 ** 3 = 8
使用divmod()函数同时得到商和余数
>>> divmod(13, 3)
(4, 1)
整数
Python中,除10进制,还有其他三种进制
- 0b或0B,二进制
- 0o或0O,八进制
- 0x或0X,十六进制
>>> 0b101
5
int()函数实现类型转化
>>> int("456")
456
自动转型:整数和浮点数混合运算时,表达式结果自动转型成浮点数。
浮点数
3.14表示成314E-2
float()函数将其他类型转化为浮点数
round(value)函数可以返回四舍五入的值.
注:不会改变原有值,而是产生新的值。
时间的表示
Python中可以通过time.time()获取当前时刻,返回值是以秒为单位,带微秒精度的浮点值。例如:1530167364.8566
同一运算符
同一运算符用于比较两个对象的存储单元,实际比较的是对象的地址。
is:判断两个标识符是不是引用同一个对象
is和==区别
- is用于判断两个变量引用对象是否为同一个,比较对象的地址。
- ==用于判断引用变量引用对象的值是否相同,默认调用对象的__eq__()方法。
整数缓存问题
Python仅仅对比较小的整数对象进行缓存([-5, 256])缓存起来,而并非是所有整数对象。仅仅是在命令行中执行,而在PyCharm或者保存为文件执行,结果是不一样的([-5, 任意正整数])
字符串
Python使用Unicode编码。
字符串的本质:字符序列。
Python的字符串是不可变的,无法对原字符串做任何修改。可以将字符串的一部分复制到新创建的字符串,达到看起来修改的效果。
不支持单字符类型,单字符也是作为一个字符串使用的。
使用内置函数ord()可以把字符转换成对应的Unicode编码。
使用内置函数chr()可以把十进制数字转换成对应的字符。
连续三个单引号或三个双引号,可以帮助我们创建多个字符串。
>>> resume = '''name = "贾文兵"
>>> company = "nuc" age = 18
>>> '''
字符串复制
>>> a = 'nuc' * 3
'nucnucnuc'
不换行打印
>>> print("nuc1", end = "#")
>>> print("nuc2", end = "#")
nuc1#nuc2#
从控制台读取字符串
>>> myname = input("请输入名字:")
str()实现数字转型字符串
str(5.20)==>‘5.20’
使用[]提取字符
- 正向搜索
最左侧第一个字符,偏移量为0,第二个偏移量是1,以此类推,直到len(str) - 1为止。 - 反向搜索
最右侧第一个字符,偏移量是-1,倒数第二个偏移量是-2,以此类推,直到-len(str)为止。
replace()实现字符串替换
>>> a = 'abcdefghijklmnopqrstuvwxyz'
>>> a = a.replace('c', '异')
ab异defghijklmnopqrstuvwxyz
整个过程中,实际上我们是创建了新的字符串对象,并指向了变量a,而不是修改了以前的字符串。
字符串切片slice操作
切片slice操作可以让我们快速的提取子字符串,标准格式为:
[起始偏移量start:终止偏移量end:步长step]
split()分割和join()合并
split()基于指定分隔符将字符串分隔成多个子字符串(存储到列表中)。如果不指定分隔符,则默认使用空白字符(换行符、空格、制表符)。
>>> a = "to be or not to be"
>>> a.split()
['to', 'be', 'or', 'not', 'to', 'be']
join()将一系列子字符串连接起来。
>>> a = ['a', 'b', 'c']
>>> '*'.join(a)
'a*b*c'
注:使用字符串拼接符+,会生成新的字符串对象。join()函数在拼接字符串之前会计算所有字符串的长度,然后逐一拷贝,仅新建一次对象。
字符串驻留机制和字符串比较
字符串驻留:仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串驻留池中,Python支持字符串驻留机制,对于符合标识符规则的字符串(仅包含字母、数字、下划线)会启用字符串驻留机制。
>>> a = "abd_33"
>>> b = "abd_33"
>>> a is b
True
>>> c = "dd#"
>>> d = "dd#"
>>> c is d
False
>>> str1 = "aa"
>>> str2 = "bb"
>>> str1+str2 is "aabb"
False
>>> str1+str2 == "aabb"
True
字符串比较和同一性
使用==、!=对字符串进行比较,比较的是value值是否相同。
使用is、not is,判断两个对象是否是同一个对象,比较的是对象的地址,即id(obj1)是否和id(obj2)相等。
成员操作符
in、not in关键字,判断某个字符(子字符串)是否存在于字符串中。
局部变量和全局变量
变量作用域指的是变量的作用范围(变量在哪里可用,在哪里不可用)
主要分为局部变量和全局变量
局部变量:定义在函数体内部的变量,只在函数体内部生效。
局部变量的作用:在函数体内部临时保存数据,函数调用完成后,销毁局部变量。
全局变量:在函数体内外都能生效的变量。
使用global关键字可以在函数内部声明变量为全局变量。