安装包(清华镜像)
- 例如 jieba :
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jieba
其他包同理,更换后面的名词即可 - 安装完成之后可以输入
import xxx
如果没有报错,则说明安装成功
运算符
// 代表除取商
for else结构
- else 会在 for 循环正常结束后执行,如果 break 退出,则不执行
字符串
- 字符串 * num = 字符串重复num次连起来
‘hello’ * 3 = ‘hellohellohello’
- 下标从左到右从 0 开始,从右到左从 -1 开始
find(substr, start, end) & rfind() 找不到返回 -1
index() & rindex() 找不到直接报错
count(substr) 统计 substr 的出现次数
replace(old_str, new_str, count)
替换指定串中的 old_str 成 new_str, 默认全部替换my_str.split(sub_str, count)
按照 sub_str 进行切割,如果都不写默认切割 空格和Tab- join 方法需要每个可迭代对象每个都是字符串
切片
- 字符串、元组、集合都有切片
- 格式:
str[start: end: step]
左闭右开 start、end 和 step 都可以省略,但是至少要有一个冒号 str[:]
得到和原来一样的字符串str1[::-1]
表示字符串翻转
列表
- 定义:
list1 = [] & list2 = list() 定义空列表
,列表中可以存放不同数据类型的数据 append() 结尾添加列表元素 insert(下标, 元素) extend(可迭代对象) 将可迭代元素的每个元素逐个添加到末尾
pop(下标)
根据下标删除,默认删最后一个,返回删除值;remove(值)
根据值删除,返回删除值 ;del 列表[下标]
与pop类似index(值)
根据值查找下标;count(值)
根据值查找出现次数;xxx in / not in list
判断是否存在- 排序: 必须要列表是全部是同一数据类型才能排序
列表.sort(reverse = True)
直接在原列表中进行排序(从大到小)sorted(列表, reverse = True)
得到一个新的排序后的列表,不改变原列表列表.reverse()
直接在原列表逆置
列表推导器
list = [生成数据的规则 for 临时变量 in xxx (for 临时变量2 in xxx)]
list = [i for i in range(5)]
# list = [0, 1, 2, 3, 4]
- 加上第二个循环类似于循环嵌套
- 字典中也有推导器,语法类似 如
dict = {f'name{i}':i for i in range(5)}
不过字典中要注意 key 值的相同引起的数据覆盖,所以要使 key 的生成也是随变量改变
元组
- 不能修改,其他和列表一样
- 定义元组使用
()
- 定义单个数据的元组使用
(3,)
要记得加逗号
函数
返回值
- 如果返回多个返回值,那么将以元组的形式返回
参数传递
- 位置传参:按照实参的位置顺序将实参的值传递给形参
- 关键字传参:指定实参给到哪个形参(关键字必须是函数的形参名)
- 混合使用:先写位置传参再写关键字传参
缺省参数(默认参数)
- 在函数定义时,给参数一个默认值,这个参数就是缺省参数
- 缺省参数必须定义在实参后面
- 不给缺省参数值就默认,修改了就按修改的值
不定长参数
*args
:不定长元组形参,可以接收所有的位置实参,类型是元组**kwargs
:不定长字典形参,可以接收所有的关键字实参,类型是字典- 不定长参数可以不填
- 约定俗称叫 args 和 kwargs,其他标识符名称也可以,只需要加上
*
或者**
函数形参的完整格式
- 普通形参 不定长元组形参 缺省形参 不定长字典形参
print中的 sep 参数
- 规定 print 中的变量之间的分隔符,默认
sep = ' '
拆包和组包
- 拆包:将容器(元组 / 字典 / 列表)的数据分给多个变量,数据的个数必须要和容器中变量的个数一致,字典拆包拆出来的是 key 值
- 组包:将多个数据值,组成元组,给到一个变量
a, b = b, a
巧妙使用拆包和组包进行变量值 的交换*list
拆包 相当于list[0], list[1], list[2], list[3] ...
类型的可变和不可变
- 可变类型:不修改引用的情况下,修改变量值。如:
int,float,tuple,str,bool
- 不可变类型:修改引用才能修改变量值。如:
list, dict
匿名函数
lambda [arg1], [arg2]... : 函数体
冒号前面是要传入的参数,冒号后面是函数内容- 不能使用 for while if 等结构
自定义排序器
- 类似于 Java 中的自定义排序器,只需要在 sort 函数中添加 key 参数,给与 key 一个匿名函数即可
list.sort(key = lambda 形参 : (排序规则1, 排序规则2...))
- 形参 代表列表中的每一个参数
- 如对列表中的每个字典排序
list1 = [{'name':'shjdas'},
{'name':'a'},
{'name':'m'}]
list1.sort(key = lambda x : x['name'])
print(list1)
面向对象
封装
类属性
- self:作为类中的第一个形参,在通过类调用方法的时候,不需要手动的传递实参值, python 解释器自动的将调用该方法的对象传递给 self ,所以 self 这个形参代表的是对象
class Dog():
def play(self):
...
dog = Dog()
dog.play() # python 自动将 dog 对象传递给 self 参数,然后调用 play 方法
魔法方法
__init__
- 类似于 Java 中的 构造函数,用于对对象进行初始化
class Human(object):
def __init__(self, name, age):
self.name = name
self.age = age
human = Human(”张三“, 18)
__str__
- 类似于 Java 中的 toString() 函数,用于字符串形式输出对象
class Human(object):
def __str__(self):
return f“姓名{self.name}, 年龄{self.age}”
human = Human(”张三“, 18)
- 注意:
- 返回值必须是 str
- 一般没有形参
__repr__
- 与
__str__
十分类似,也是返回字符串,不过更加准确 - 将对象放到容器里输出,调用的是
__repr__
。如:
class Dog(object):
...
def __str__(self):
return f"{self.name}, {self.age}"
def __repr__(self):
return f"{self.name}"
list = [Dog("大黄", 1), Dog("大白", 2), Dog("大红", 3)]
print(list) # ["大黄", "大白", "大红"]
- 如果没有重写str方法,但重写了repr方法时,所有调用str的时机都会调用repr方法。
__del__
析构函数
- 引用计数:python 的一种内存管理机制,是指一块内存,有多少个变量在引用
- 当一个变量引用一个内存时,引用计数加 1
- 当删除一个变量 或 这个变量不再引用这块内存,引用计数减 1
- 当内存的引用计数为 0 时,这块内存被删除,内存中的数据被销毁
- 调用时机:对象在内存中被销毁删除的时候(引用计数为 0 )会自动调用
__del__
方法, - 程序代码结束,运行过程中创建的所有对象和变量都会被销毁,即调用
__del__
方法 - 使用
del 变量
,将这个对象的引用计数变为 0 ,会自动调用__del__
方法
魔法属性
__mro__
- 获得类的继承关系链
__dict__
- 获得类的所有属性的一个字典,key 代表 属性名,value 代表属性值
__all__
- 可以在每个代码文件(模块中)定义,类型是 元组 / 列表
- 作用:只影响
from ... import *
导入行为 - 如果没有定义
__all__
变量,模块中的所有功能,都可以被导入 - 如果定义了,只能导入
__all__
变量中定义的内容 - 元组/列表中必须是字符串
__all__ = ("num", 'func', 'Dog')
__name__
- 可以显示一个模块的某功能是被自己执行还是被别的文件调用执行
- 假设模块A、B,模块A自己定义了功能C,模块B调用模块A,现在功能C被执行了:
- 如果C被A自己执行,也就是说模块执行了自己定义的功能,那么
__name__
=='__main__'
- 如果C被B调用执行,也就是说当前模块调用执行了别的模块的功能,那么
__name__
==’A’(被调用模块的名字) 其实换一种说法也就是表示当前程序运行在哪一个模块中 - 常用
__name__
=='__main__'
来表示整个工程开始运行的入口
继承
子类调用父类中的被重写的方法
- 方法 1 :
父类.方法名(self)
- 方法 2 :
super(子类, self).方法名(参数)
- 方法 3 :
super().方法名(参数)
(是方法 2 的简写)
class Dog(object):
def bark(self):
print("汪汪汪")
class XTQ(Dog):
def bark(self):
print("嘤嘤嘤")
def see_master(self):
# Dog.bark(self) 方法 1
# super(XTQ, self).bark() 方法 2
super().bark() # 方法 3
xtq = XTQ()
xtq.see_master()
多继承
class A(B, C, ...)
- 如果调用的方法父类 B C 中都有,那么会优先调用 前一个父类 B 中的方法
- 如果想要在子类中调用继承链中其他的方法,可以通过
父类名.方法名(self)
来调用,或super(要调用的类的子类名,self).方法()
私有权限
- 格式:
__属性名
在属性或方法的前面加上__
即可 - python 中的私有属性的本质是修改属性的名字,在创建对象的时候,会自动的修改属性名 在属性名的前面加上
_类名
如:class People
self.__name
实际上是属性名是_People__name
类对象 / 类属性
- 类对象:一个类就是一个类对象 作用:定义实例对象; 存储类属性
- 类属性:类中的属性,只有一份,类似于 Java 中的 static 定义的变量 格式:定义在类中,方法外
- 类属性可以通过对象修改,但是如果 实例对象 有重名的属性,那么用对象修改不了类属性,只会修改对象中的属性
类方法
- 格式:使用
@classmethod
定义的方法
class xxx():
...
@classmethod
def xxx(cls):
return cls.xxx
- 默认第一个参数是 cls ,指类对象自身
- 前提:如果一个方法不需要使用实例属性,而使用类属性,那么就需要定义类方法
静态方法
- 使用
staticmethod
定义的方法,对参数没有要求,可以有,可以无 - 前提:不需要使用实例属性,同时也不需要使用类属性,此时可以定义静态方法
异常
- 格式:
异常类型名:异常描述
raise 异常名
抛出异常
捕获异常
- 方式 1
try:
可能发生异常的代码
except 异常类型 1 :
发生异常 1 ,执行的代码
except 异常类型 2 :
发生异常 2 ,执行的代码
...
- 方式 2
try:
可能发生异常的代码
except (异常类型 1, 异常类型 2,...)
发生异常执行的代码
打印异常
- except (异常类型 1, 异常类型 2,…)后面添加
as 异常变量名
然后再print一下即可
打印所有异常
try:
...
except Exception as e:
print(e)
异常的完整结构
try:
...
except Exception as e:
发生了异常执行
else:
没有发生异常执行的代码
finally:
不管发不发生都要执行的代码
模块
- 模块就是一个 python 文件
- 导入模块
import 模块名
form 模块名 import 功能1, 功能2,...
form 模块名 import *
注意:这种方式容易使同名变量或方法发生覆盖as
重命名模块/功能名,不过重命名之后就不能用原始的名字
嵌套目录导入模块报红
- Mark Directory as -> sources root
包
__init__.py
文件每个包都有from 包名 import *
导入的是__init__.py
中的内容
注意
- python 中没有自增(++)自减(–)运算符
- python 中有三目运算符,但是与 C 和 Java 中的语法不一样
- 错误使用:
判断条件 ? 正确结果 : 错误结果
- 正确使用:
正确结果 if 判断条件 else 错误结果
- 例如斐波那契数列
def fun(): return n if n < 2 else fun(n - 1) + fun(n - 2)
- 或者使用 numpy 中的 np.where()
- 元组 tuple, 列表 list, 集合 set 之间可以相互转换
- 在函数中使用 = 修改全局变量,需要先使用 global 声明全局变量,而 insert 、append 等不需要声明