执行Python命令的两种方式
1. 交互式模式下执行
安装好了Python程序以后,在windows的命令行或linux、mac的终端界面输入python命令即可进入python的交互模式,在这个模式里输入python语句,按回车即可返回执行结果。一般用于调试。
2. 脚本执行
在.py文件中写好python语句,然后使用python script.py这样的格式来执行python脚本,或者在linux平台上给脚本添加可执行权限,使用绝对路径或相对路径的方式来执行脚本。
Python程序的执行流程
我们编写的.py文件称为python脚本,在我们使用python命令执行python脚本的时候,python解释器首先将python脚本中的语句翻译成一组字节码命令,保存在脚本相同目录下的__pycache__目录下,以.pyc结尾的文件中,然后再将python字节码发送到PVM(Python virtual machine,python虚拟机)中,由PVM执行并返回最终的结果。PVM是Python程序的一部分。
Python程序的基本概念:
1. 程序由模块构成
2. 模块包含语句
3. 语句包含表达式
4. 表达式建立并处理对象
一. 内置对象
数字、字符串、列表、字典、元组、文件、集合、其他类型(type,None、bool)、编程单元类型(函数、模块、类)、与实现相关的类型(编译的代码堆栈跟踪traceback)。
内置对象的特点:
- 内置对象使程序更容易编写,对于简单的任务,使用内置类型就可以完成工作。
- 内置对象是扩展的组件,可以使用内置数据类型来组合出更复杂的数据类型。
- 内置对象比自定义的数据结构更有效率,内置对象一般用C语言实现,效率更高。
- 内置对象是语言标准的一部分,因此对不同平台的兼容性更好。
常见的内置对象:
1. 数字
Python支持的数字类型有整数、浮点数、复数、八进制数、固定精度的十进制数、十六进制数、带分子和分母的有理分数等。某些特定的数字可能需要特定的模块或第三方库的支持。
数字里的常用模块math、random,前者用来提供数字里常见的常量例如pi、e等,后者用于提供随机数生成器和随机数选择器。
2. 字符串
用来记录文本信息,再Python中作为序列的一个子集,支持序列的常见操作,例如len()函数、索引、分片等。
字符串的一个重要特性——不可变性,创建后就不能就地改变。
字符串自带的一些常见方法:find()、replace()、split()、rstrip()、格式化操作等。
r开头的字符串表示字符串自身,没有特殊含义,转义字符在这样的字符串中不起作用。
u开头的字符串表示unicode字符串,Python3.x默认支持Unicode字符串,不需要加u。
re模块用于处理字符串的模式匹配。
3. 列表
列表是这个语言提供的最通用的序列,是一个任意类型的对象的位置相关的有序集合,没用固定大小,大小可变,可根据索引对元素复制,支持各种列表的方法进行调用。
支持常见序列操作,例如索引、分片等。
列表自带方法append()、sort()、reverse()、pop()等。
4. 字典
字典不是序列,而是一种映射,通过键来进行存储,将键映射到值。字典的键具有唯一性,而键对应的值可以是多种的对象,例如字符串、数字、列表、集合,甚至是字典本身。
5. 元组
相当于不可变列表,也是一种序列,但是具有不可变性。也支持混合和嵌套多种元素。
6. 文件
在Python中,文件被当作对象来处理。文件对象是Python代码对电脑上外部文件的主要接口。没有特定的常量语法创建文件。要创建一个文件对象,需要调用处理文件对象的open函数并传给它一个文件名和文件处理模式字符串。
文件对象支持的方法read、readline、readlines、write、writelines、seek、close等。
额外的类文件工具:管道(PIPE)、先进先出队列(FIFO)、套接字(socket)、通过键访问文件、对象持久、基于描述符的文件、关系数据库和面向对象数据库接口。
7. 集合
不是映射也不是序列,是唯一的不可变的对象的无序集合。通过调用内置函数set函数创建,或者使用Python3.0中新的集合常量和表达式创建,支持一般的数学集合操作,集合更像是一个无值的字典的键。
X = set(‘spam‘)
Y = {‘h‘, ‘a‘, ‘m‘}
上面是两种创建集合的方式。
这些对象很多都支持对象特有的方法,具体内容会在单独介绍对象时讲解。在python命令行界面中,有几个命令可以用来查看对象的帮助信息,分别时:
- dir(obj) 方法可以看到对象的所有属性
- ord(obj)方法查看对象的ASCII编码
- help(obj)或 help(obj.fn) 查看对象的帮助信息或者对象方法的帮助信息。
上面介绍的都是Python核心对象类型,以及可以对它们进行的一些简单操作。
二、动态类型
1. 常量/变量
- 字面常量
- 变量,是一个指针,指向一块分配好的内存。
- 变量的创建,给变量赋值时即创建了该对象
- 变量的类型(type),变量没有类型,类型是和变量相关联的对象的属性。变量的指针指向不同的对象时,就关联到不同类型的对象上。
- 变量的命名规则
-
- 只能包含字母、数字和下划线
- 只能以字母或者下划线开头
- 不能是Python解释器的保留字
对象的垃圾收集:当没有指针指向一个对象时,对象的引用计数器就会置零,此时对象所占用的内存空间就会放入到自由内存空间,等待后面的对象使用。这个机制的好处是不用考虑释放内存空间。
对象的引用:将一个不可变对象,如数字、字符串赋值给一个变量时,改变对象,比如说将数字+1,或者将字符串加上一个新的字符串,此时实际执行的是生成一个新的数字对象或字符串对象,然后将变量的指针重新指向新的对象。
共享引用:将一个可变对象赋值给变量时,改变可变对象时,并不会改变这个变量的指针指向。因此当两个相同的变量指向同一个可变对象时,其中一个变量进行了修改对象的操作,另一个变量的值也会发生改变。例如:
>>>L1=[1,2,3]
>>>L2=L1
>>>L2[0]=24
>>>L2
[24,2,3]
>>>L1
[24,2,3]
此时如果不想因为L2改变了列表的值而导致L1也发生改变,应该使用拷贝(copy和deepcopy方法)。在列表中讲到该知识点。
is和 ‘==‘,只有两个变量的指针指向同一块内存时,两个变量才是is关系,没有指向同一块内存,但是两个变量指向的对象完全相同,此时两个变量才是 ‘==‘ 关系。
补充内容:变量与对象之间的关系
- 变量是一个系统表元素,拥有指向对象的连接的空间,即保存指针的空间。
- 对象是系统分配的一块内存,有足够的空间去表示它们所代表的值,一个对象都有两个标准的头部信息,一个类型标识符去标识这个对象的类型,一个引用计数器,来决定是不是可以回收这个对象
- 引用是自动形成的从变量到对象的指针s
2. 运算符/表达式
算术运算符:+、-、*、/(py2和py3中意义不一样)、//、%、**;
比较运算符:>,<,=,!=,>=,<=,==;
逻辑运算符:and、or、not
- 参与运算的成员只能是bool类型,或者可以隐式转换为bool类型的类型(0,1);
- and两正得正,两负得负,一正一负均为负
- or 两正得正,两负得负,一正一负均为负
- not 正得负,负得正
- 短路操作:总是从左到右的计算,一旦能够决定表达式最终的值,将立刻停止计算并返回。即当使用and操作符时,左边的值为负则立即结束运算,使用or操作符时,当左边为正时,立即结束运算。当这种情况下需要运算操作符两边的表达式时,可以将运算符两边的表达式用临时变量代替。
位运算符:
- bin(num) 返回num的二进制表示
- &(按位与)、|(按位或)、^(按位异或,同为1或同为0时为0,不同时为1)、~(按位取反~x=-(x+1))
- >>,<<(左移和右移操作符)
其他运算符:
- 赋值运算符=
- 成员运算符in(内置数据结构的内容)
- 身份运算符is、is not(面向对象的内容)
运算符的优先级:运算符根据优先级来计算。
- 算术运算符高于比较运算符
- 比较运算符高于逻辑运算符
表示式是由常量/变量和运算符组成的公式。
3. 程序控制结构
顺序结构:自上而下执行的表达式组合;
分支结构:
- 单分支:if condition: block
- 双分支:if....else....
- 多分支:if...elif...else
分支结构里永远只有一个分支会被执行
循环结构:
- for element in iterator: block
- while condition: block
- break、continue,break用于提前结束循环,continue用于跳过当前循环剩下的部分。
* 循环体中绝对不要修改可迭代对象。
for _ in range(0,3) #表示不使用 _ 这个变量,只是进行三次循环。
嵌套结构:if、for、while等多种结构结合的结构。
0、空的内置结构、None bool的结构都是False,非0、非空的内置结构都是True
本节知识点:
1. 知道Python中常见的内置类型和这些内置类型常用的方法(len、索引、分片等)。
2. 掌握Python中创建变量的规则,变量引用不同对象时,变量和对象之间的关系。包括以下几点:
- 变量命名规则
- 变量引用不可变对象时,更改对象之后,变量指针的变化
- 变量引用可变对象时,更改对象之后,变量和对象的关系。
3. 熟悉简单的运算符操作。
4. 熟悉Python中基本的控制结构。