1.
① python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} 。缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。
② 多行语句
Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠(\)来实现多行语句。但在(),[ ]或{}不需要。
③ python数据类型有6个:number数字(有4个类型:int整数、float浮点数、bool布尔、complex复数),string字符串,list列表,tuple元组,set集合,dictionary字典
- 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组)
- 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)
④ 字符串string
(1)单引号与双引号没区别
(2)‘\’ 是转义符
(3)反斜杠可以用来转义,使用r可以让反斜杠不发生转义。 如 r"this is a line with \n" 则\n会显示,并不是换行
(4)字符串可以用 + 运算符直接连在一起,用 * 运算符重复
(5)有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始
(6)Python 没有char类型,一个字符就是长度为 1 的字符串
(7)与 C 字符串不同的是,Python 字符串不能被改变。向一个索引位置赋值,比如word[0] = 'm'会导致错误。
⑤ print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=" "
⑥ Python 中的变量不需要声明,但每个变量在使用前都必须赋值。
在 Python 中,变量就是变量,本身没有类型,我们所说的"类型"是变量所指的内存中对象的类型。
⑦ 一个变量可以通过赋值指向不同类型的对象;
数值的除法包含两个运算符:/ 返回一个浮点数,// 返回一个整数;
在混合计算时,Python会把整型转换成为浮点数。
⑧ 与Python字符串不一样的是,列表中的元素是可以改变的
⑨ 元组
⑩ 字典
2.
① 列表
② 迭代器与生成器
(1)迭代器有两个基本的方法:iter() 和 next()。
迭代器对象可以使用常规for语句进行遍历:
也可以使用 next() 函数:
自定义迭代器 :把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。
__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。
如,创建一个返回数字的迭代器,初始值为 1,逐步递增 1:
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代:
(2)yield 生成器
③ 不定长参数
加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
加了两个星号 ** 的参数会以字典的形式导入。
注:声明函数时,参数中星号 * 可以单独出现,但*后的参数必须用关键字传入。
④ 匿名函数
⑤ 列表推导式
列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。
每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。
可以用 if 子句作为过滤器:
⑥ 遍历
(1)字典遍历,关键字和值可以使用 items() 方法同时解读
(2)序列遍历,索引位置和值可以使用 enumerate() 函数同时得到
当需要同时遍历两个或更多的序列,可以使用 zip() 组合
(3)按顺序或倒序来遍历序列
⑦ 异常
Python 使用 raise 语句抛出一个指定的异常:
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出:
⑧ 类
(1)类对象
类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用,像下面这样:
类定义了 __init__() 方法,类的实例化操作会自动调用 __init__() 方法。如下实例化类 MyClass,对应的 __init__() 方法就会被调用:
当然, __init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上。例如:
self代表类的实例,而非类:类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
从执行结果可以很明显的看出,self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。
self 不是 python 关键字,我们把他随意换成其他也是可以正常执行的:
(2)类方法
类的专属方法如下:
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例。
(3)类继承
单继承:
多继承:
需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法:
(4)类的方法重写
如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法,实例如下:
super()函数是用于调用父类(超类)的一个方法。
(5)类属性与方法
1)类的私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
2)类的方法
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。
self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定使用 self。
3)类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。
例1
例2
(6)类的运算符重载
⑨ 全局变量与局部变量
Python 中变量的查找顺序:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再去内置中找。
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字:
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:
另外有一种特殊情况,假设下面这段代码被运行:
错误信息为局部作用域引用错误,因为 test 函数中的 a 使用的是局部,未定义,所以无法修改。
修改方法如下:
修改 a 为全局变量
或者通过参数传递
Python 中变量的查找顺序:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再去内置中找。
举例
函数 f1() 的作用就是调用函数 f2() 来打印变量int的值。
输出结果为:2
因为 local 中的 int = 2,函数将其打印出来。
现在将函数 f2() 中的 int = 2 删除:
调用函数 f1() 输出结果为:1
因为 local 找不到 int 的值,就去上一层 non-local 寻找,发现 int = 1 并打印。
而进一步删除函数 f1() 中的 int = 1:
调用函数 f1() 输出结果为:0
因为 local 和 non-local 都找不到 int 的值,便去 global 中寻找,发现 int = 0 并打印。
若继续删除 int = 0这一条件:
因为 local、non-local、global 中都没有 int 的值,便去 built-in 中寻找 int 的值, 输出<class 'int'> 。
⑩ python 变量互换
通过创建临时变量:
也可不用临时变量: