1、Python程序的执行:
2、Python程序文件
1.将编写的Python程序保存至.py文件中称为“模块”。
2.能够直接运行的模块称为脚本(顶层文件)。
Python大版本号之间是互不兼容的,即Python2与Python3之间程序可能不兼容。
3、Python IDE:
PyCharm
IDLE
Eclipse
PyDev
PythonWin
Komodo
Wingware
4、面向过程:
- 以指令为中心,由指令处理数据
5、面向对象:
- 以数据为中心,所有的处理代码都围绕数据展开
Python中一切皆对象,但面向对象、面向过程的方法都支持。
6、变量命名惯例:
1.以单一下划线开头的变量名_x不会被from module import*语句导入
2.前后有双下划线的变量名__x__是系统定义的变量或方法,对python解释器有特殊意义
3.以两个下划线开头但结尾没有下划线的变量名__x是类的本地变量
4.交互式模式下,变量名"_"用于保存最后表达式的结果
7、变量名没有类型,其所引用的对象才有类型
8、续行
1.\
2.’’’
3.;\(交互式命令行中)
9、Python程序的结构
如果某个对象包含其他对象的引用,则称其为容器。
10、Python不允许在函数中直接修改全局变量的值
- 如果试图用赋值语句直接修改全局变量的值,则会在函数内部重新定义一个新的(同名的)局部变量。但可以使用Global关键字声明全局变量从而可以在函数内部修改全局变量。
示例1:
num = 10
def demo1():
num = 99 # 新定义一个局部变量
print("num1==> %d " % num)
def demo2():
print("num2==>%d " % num)`
执行结果:
num1==>99
num2==>10
示例2:修改全局变量
num = 10
def demo1():
Global num # 声明num为全局变量
num = 99
print("num1==> %d " % num)
def demo2():
print("num2==>%d " % num)`
11、Python代码结构
12、可以直接用多个变量接收函数的返回结果
形如:
result1,result2 = fun()
13、Python专有交换两个变量
a,b = b,a # 右端是省略小括号的元组
# 不使用临时变量实现交换
a = a + b
b = a - b
a = a - b
14、调用传入函数的方法会改变全局变量的值
- 对列表使用+=,本质是调用extend方法)
示例:
num_list = [1, 2, 3]
def demo(list):
# list = list + list
list += list # 本质上是执行list.extend(list)
print(list)
print(num_list)
结果:
# [1, 2, 3]
[1, 2, 3, 1, 2, 3]
[1, 2, 3, 1, 2, 3]
15、缺省参数必须放在参数列表的末尾
16、多值参数
- 形参前增加一个*(*)可以接收一个元组
- 形参前增加两个*(**)可以接收一个字典
- 常用参数名:
*args
**kwargs
在类中定义属性
17、在初始化方法__init__(self, paras, …)中定义属性,初始化方法在创建对象时会被自动调用。其中,self是指向当前对象的引用。
18、_del_()方法
- 对象在被销毁前(系统回收,主动删除)会被自动调用。
19、_str_()方法
- 自定义对象的描述信息,可用print(object)函数输出使用
示例:
class Cat:
def __init__(self, new_name):
self.name = new_name
print("小猫%s诞生" % self.name)
def __del__(self, new_name):
print("小猫%逝去" % self.name)
def __str__(self, new_name):
return "我是小猫%s" % self.name
tom = Cat("Tom")
print(tom)
输出:
小猫Tom诞生
我是小猫Tom
小猫Tom逝去
20、定义没有初始值的属性用None:
class demo:
def __init__(self, x):
self.x = None
21、定义类的私有属性和私有方法:
- 在属性名/方法名前加两个下划线即可
class demo:
def __init__(self, para1):
self.para1 = para1
self.__para2 = None # 私有属性
def __fun1(self): # 私有方法
pass
22、继承的语法
class 类名(父类名):
pass
- 在子类中重写(覆盖)父类的方法后,运行时,只会调用子类重写的方法,而不会调用父类的方法。
- 在开发中,如果子类包含父类的方法,但需要再添加一些功能,则可以使用扩展的方式:
(1)重写父类的方法;
(2)在需要的位置,使用super.父类的方法(在Python 2.x早期版本中没有这种方式),来调用父类的方法;
(3)添加子类特有的代码实现。
23、父类的私有属性和方法
- 子类对象不能通过自己内部的方法直接访问父类的私有属性和私有方法。
- 但子类对象可以通过调用父类的共有方法间接访问父类私有属性和私有方法。
24、Python支持多继承
class 子类名(父类名1, 父类名2, ...):
pass
- 在使用多继承时,应尽量避免出现两个父类中出现同名的方法或属性的情况,以免产生混淆(可以使用内置属性__mro__查看方法搜索的顺序)。
- Python 3.x中,如果没有指定父类,会默认以object为基类,而Python 2.x则不会。
25、类属性
- 直接在类中用赋值语句定义即可(实例属性也即对象属性是通过初始化方法__init__()方法定义的)
26、类方法
- 用装饰器@classmethod声明,且第一个参数为cls。
class demo(object):
count = 0 # 类属性,用赋值语句直接在类中定义
@classmethod # 类方法装饰器,声明后面定义的函数是类方法
def fun(cls): # 类方法,第一个参数为cls,与实例方法中的self类似,可
# 通过cls.类属性、cls.类方法的形式调用类属性、类方法
pass
def __init__(self):
pass
27、(类中的)静态方法
- 既不需要访问类属性,也不需要访问实例属性的方法可考虑定义为静态方法。用装饰器@staticmethod声明,且不需要参数(self、cls)。
@staticmethod
def fun():
pass
实例方法: 需要访问实例属性
类方法: 只需要访问类属性
静态方法: 既不访问类属性也不访问实例属性
28、单例设计模式
- 目的:让类创建的对象在系统中只有唯一的一个实例。
- 即每执行一次 类名() 返回的对象,引用的内存地址是相同的。
- Python解释器获得对象的引用后,将引用作为第一个参数传递给 __init__ 方法。
- 可通过 重写 object基类的内置方法 __new__() 来实现单例设计模式。
重写__new__方法的代码非常固定:
- 重写 __new__ 方法一定要
return super().__new__(cls)
- 否则Python的解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法( __init__)
- 注意:__new__ 是一个静态方法,在调用时需要主动传递cls参数
29、使初始化工作只执行一次:
-
在对 __init__ 改造后,每次创建对象都会得到第一次创建对象的引用。但初始化方法还是会被多次调用。
-
解决方法:
- 定义一个 类属性 init_flag 标记是否执行过初始化动作,初始值为False
- 在 __init__ 方法中,判断init_flag,如果为False就执行初始化动作。
- 然后将init_flag设置为True。
- 这样,再次自动调用 __init__ 方法时,初始化动作就不会被再次执行了。
30、捕获异常
try:
# 尝试执行的代码
pass
except 错误类型1:
# 针对错误类型1,对应的处理代码
pass
except (错误类型2, 错误类型3):
# 针对错误类型2、3,对应的处理代码
pass
except Exception as result:
# 打印错误信息
print(result)
else:
# 没有异常才会执行的代码
pass
finally:
# 不论是否有异常都会执行的代码
pass
异常传递:
当函数、方法执行出现异常,会将异常传递给调用方,直到传递到主程序,如果还没有异常处理,程序才会被终止。
- 在程序开发中,可以在主程序添加异常捕获,这样就不必在其他代码中添加大量异常捕获。
主动抛出异常:
- 创建一个
Exception
类的对象; - 用
raise
关键字抛出异常。
ex = Exception("异常描述")
raise ex
31、导入模块
import 模块名
导入整个模块,使用模块名.工具名
的形式调用模块中的工具(变量、函数、类)。from 模块名 import 工具名
导入模块中需要使用的工具,可以直接使用工具名
调用模块中的工具。import 模块名 as 别名
可以为模块指定别名方便使用(别名采用大驼峰命名法)。from 模块名 import 工具名 as 别名
为工具指定别名。
注:
from 模块名 import *
同样可以导入整个模块,但不建议使用,因为如果同时导入多个模块,而不同模块中有同名的工具,则会导致覆盖(不会报错),如果有名字冲突可以使用别名来解决冲突。
- 模块内置属性
__file__
可以显示模块所在的完整路径。 - 内置属性
__name__
:
如果模块被其他文件导入,__name__
就是模块名;
如果模块是被直接运行,__name__
=__main__
。
常见的Python文件代码格式:
# 导入模块
# 定义全局变量
# 定义类
# 定义函数
# 在代码的最下方
def main():
# ...
pass
if __name__ = "__main__":
main()
32、包(Package)
- 包是一个包含多个模块的特殊目录(文件夹);
- 目录下有一个特殊文件
__init__.py
; - 使用包可以一次性导入
__init__.py
模块列表中的所有模块。
在__init__.py
中指定对外界提供的模块列表:
# 从 当前目录 导入 模块列表
from . import module1
from . import module2