字符串
-
字符串查找
1.find()函数 ,存在返回子串第一次出现的下标,如果不存在返回-1
原字符串.find(‘子串’,开始下标,结束下标)
2.index()函数,存在返回子串第一次出现的位置下标,不存在报异常
原字符串.index(‘子串’,开始下标,结束下标)
3.count()函数,返回子串在原字符串里的出现次数,不存在返回数字0
原字符串.count(‘子串’,开始下标,结束下标)
4.rfind() 和 rindex() 与 find()和index()用法相同,只不过查找方向是从右至左, 但是下标计数还是从左至右
5.len()
注意:以上函数的开始\结束下标可以省略
-
字符串修改
1.replace()函数
原字符串.replace(‘旧子串’,‘新子串’,替换次数)
-
字符串分割
1.split()函数 原字符串.split(‘子串’,分割次数),返回值为一个列表,丢失分割字符,分割次数可以省略
原字符串.split(‘分割字符’,次数)
-
字符串拼接
1.join() 将字符串列表合并成一个字符串,空字符串也可以用来合并
-
字符串大小写转换
-
字符串删除两侧指定字符
1.字符串.lstrip(‘指定字符’) 删除字符串左侧指定字符
2.字符串.rstrip(‘指定字符’) 删除字符串右侧指定字符
3.字符串.strip(‘指定字符’) 删除字符串两侧指定字符
注意:当不输入参数时,默认为’指定字符’为’空格’
-
字符串对齐
1.字符串.ljust(长度,填充字符) 字符串左对齐
2.字符串.rjust(长度,填充字符) 字符串右对齐
3.字符串.center(长度,填充字符) 字符串居中对齐
-
字符串判断
1.字符串.startswith(子串,开始位置,结束位置) 检查字符串是否以指定子串开头,是则返回True,不是则返回False
2.字符串.endswith(子串,开始位置,结束位置) 检查字符串是否以指定子串结尾,是则返回True,不是则返回False
3.字符串.isalpha() 检查字符串仅由字母组成,其不能区分汉字和字母,要区分需要使用encode修改编码形式
例如: 字符.encode(‘utf8’).isalpha()
4.字符串.isdigit() 检查字符串仅由数字组成
5.字符串.isalnum() 检查字符串仅由字母或数字或两者组合组成
6.字符串.isspace() 检查字符串仅由空格组成
列表
-
应用场景
1.一次性存储多个数据,且数据类型可以不相同(但是工作中我们尽可能相同),后面可以修改
-
查找
1.下标查找法, 例如: list[2]
2.index() 同字符串中用法相同
3.count() 用法同字符串相同
4.len() 公共方法
-
判断是否存在
-
in
-
not in
在字符串中一样适用
-
-
添加
1.append() 将增加的数据添加到列表结尾
列表序列.append(数据)
2.extend() 将增加的数据添加到列表结尾,但是如果增加的数据是一个序列,会被拆开并逐一追加到列表结尾
列表序列.extend(数据)
3.insert() ------指定位置添加数据
列表序列.insert(指定位置下标,数据)
-
删除
1.del
del (列表序列) 删除列表
del 列表[0] ,删除指定下标的数据
2.pop(指定位置下标) 删除指定数据,没有指定下标.默认删除最后一个,返回值为被删除的数据
3.clear() 清空列表
4.remove(数据) 删除指定数据
-
修改
列表序列[指定下标] = ‘新数据’ name_list[1] = ‘admin’
-
排序
1.reverse() 逆序
2.sort(key = None,reverse = False)
-
复制
1.切片
2.copy()
元组
-
定义
- 提醒程序员不要去修改里面的内容
- 一个元组可以存储多个数据,但这些数据是不能修改的
- 存储多个数据: tuple1 = (‘a’,‘b’,‘c’)
- 存储一个数据: tuple2 = (‘a’,), 元素后面的逗号不能少.
-
查找
- 下标查找法
- index()函数
- count()函数
- len()函数
-
修改
-
元组本身不支持修改
-
若元组中某元素为可修改的容器类型,例如list类型.我们可以使用相应类型的修改方法去修改元组里的该元素的值.
ex:
t1 = (1, 2, [1, 2])
print(t1)
#打印结果: (1, 2, [1, 2])
t1[2] [0] = 3
print(t1)
#打印结果: (1, 2, [3, 2])
-
-
补充:()的两种作用
1.提升运算等级
字典
-
程序员需要快速存取数据的时候,使用字典
-
创建字典的是时候字典的键或者key,一定是我们自己定义的.字典的是从数据库或者前端获取的.
-
定义
字典里面数据以键值对形式出现.
- 有数据的字典 dict = {‘name’:‘Tom’, ‘age’: 18, ‘gender’: ‘男’}
- 没有数据的字典
- dict = {}
- dict = dict()
-
查找
- dict[key]
- .get(key,‘返回信息’) 查找的key不存在时返回’返回信息’,没有设置’返回信息’默认返回None
- .keys()
- .values()
- .items() 返回可迭代对象,列表. 列表里面的元素是由键和值组成的元组
-
修改
dict[键] = ‘新值’
-
增加
dict[新的键] = ‘值’
-
删除
-
del /del()
del dict[‘key’] key存在时删除相应的键值对,key不存在时报错
-
clear() 清空字典,字典变成空字典
-
pop(‘KEY’)
-
-
使用变量名的时候,不要使用系统默认函数\变量\类名作为变量名
-
遍历字典
-
遍历key:
1.for key in dict.keys()
print(key)
-
for key in dict:
print(key)
注意:字典遍历默认遍历键
-
-
遍历value
for value in dict.avlues()
print(value)
-
-
拆包
容器类型数据都能拆包,字典拆包出来是字典的键
-
组包
当传递多个数据的时候,自动组包成元组类型传递
集合
-
创建集合
- s1 = {}
- s1 = set() 也用来创建空集合
-
特性
- 无序,相对于输入的数据,打印出的数据顺序发生了变化.即顺序不能被编程人员控制,就是无序.
- 去重
-
增加
- .add() 添加单一数据
- .update() 添加数据序列
-
删除
1.remove() 数据不存在,报错
2.discard() 数据不存在,不报错
3.pop() 随机删除一个数据,返回被删除数据
-
查找
-
in
-
not in
s1 = {1, 2, 3}
print(1 in s1)4
print(1 not in s1)
-
公共操作
-
- 集合\字典不支持加法运算
- 加法运算两侧数据类型相同
- 运算结束后生成一个新的数据,不会出现修改原数据现象
-
- 复制
- 字典\集合不支持复制与运算
- *左右两侧一边是容器,一边是数值
- in 和 not in
- len()
- del
- max() \ min()
- range(start,end,step)可迭代对象,是一个连续整数序列
- enumerate()
- 数据类型转换
- 注意:list转换成str是无效的
-
推导式
-
列表推导式
用一个表达式创建一个有规律的列表或控制一个有规律的列表
- 推导式可以简化代码,但是其局限性也很大
- list1 = [i for i in range(10)]
-
多for循环实现列表推导式
- list2 = [(i,j) for i in range(1,3) for j in range(3)]
-
字典推导式
-
dict1 = {i : i ** 2 for i in range(1,5)}
-
ex:两个不一样长的列表合并成一个字典
list1 = [‘name’, ‘age’, ‘gender’, ‘id’]
list2 = [‘tom’, 18,‘nan’]
dict2 = {list1[i]: list2[i] for i in range(len(list2) if len(list1) > len(list2) else len(list2))}
-
-
集合推导式
-
ex:将列表list3转换成集合
-
list3 = [1,1,2]
set1 = {i**2 for i in list3}
因为集合的去重功能,返回结果为结果:{1,4}
-
-
元组使用推导式会产生一个生成器,生成器可以进行遍历.不能达到用推导式产生一个元组的效果
-
函数
-
定义:将一段具有独立功能的代码块整合到一起并命名.
-
定义格式:
def 函数名(参数):
代码1
代码2
…
-
定义函数的时候参数可以没有.函数必须是先定义后调用,因为Python是解释型语言
-
优点:
提高效率,但也不一定完全会提升开发效率,但是方便日后的维护和迭代
提高代码复用性.
逻辑功能的统一管理.
-
函数执行流程:定义函数的时候函数体不会被执行.当调用函数的时候,解释器会回到定义函数名的地方继而执行下方缩进的代码(即函数体),当缩进代码执行完后,返回函数调用的地方继续执行下面的代码.
-
程序在运行到定义函数的位置,将函数名保存到内存中,调用函数的时候再去内存中查找指定的函数名,如果内存中有则调用,没有则报错
-
函数的参数:函数使用参数会使函数变得灵活
-
return:
1.负责函数返回值
2.函数遇到return关键字就会跳出函数体
-
函数的说明文档:
定义函数的同时,在函数体的第一行写多行注释来对函数进行说明即为函数的说明文档.
-
函数的嵌套调用:一个函数体内调用了另外一个函数
注意:在函数体内部也可以以定义一个函数
-
函数名不能被占用
-
变量作用域:
局部变量-------函数体内部定义的变量.
函数外部的循环体内和分支语句内定义的变量都可以在其自身代码块外使用
-
global可以将函数体内的变量声明为全局变量,使用global修饰变量,一定要在变量调用之前。
-
函数作用域:
- l local 函数体内部
- e enclosing 外层函数体内部
- g global 全局
- b builtin 系统预留的内置变量
-
函数有多个返回值
- 默认返回多个值的时候是以元组形式返回
- return 返回多个值的时候,可以以元组、列表、字典的形式返回
- 理论上来说函数没有多个返回值的情况,因为返回多个值时都会自动组包
- 在函数没有写明return时,系统默认返回None
-
位置参数:按照定义形参的顺序进行实参的赋值
-
关键字参数:通过“键=值”的形式加以指定,函数调用的时候,位置参数必须写在关键字参数的前面
-
缺省参数:即默认参数。定义函数时为参数提供默认值。调用函数时没有为缺省参数赋值即使用默认值,为缺省参数赋值了即使有传入的实参。
- 一般是配合关键字参数使用的
- 缺省参数可以使用位置参数赋值,没有赋值的时候缺省参数可以使用默认值
-
不定长参数
-
位置不定长,接收形参中未定义的位置参数
def 函数(*args):
函数体
-
关键字不定长,接收形参中未定义的关键字参数
def 函数(**kwargs):
函数体
-
-
引用
-
变量指向指定内存空间的行为就是引用.
-
引用地址不是内存地址
递归
- 特点
- 函数内部自己调用自己
- 必须有出口
- 代码实现
- 递归时最大一般不要超过1000层
lambda
- lambda 参数列表 :表达式
-
面向对象
- 类
- 一类具有相同特征和行为的事物的统称
- 先有类后有对象
- 类名满足标识符命名规则,同时遵循大驼峰命名习惯
- 对象
- 所有数据类型都是对象
- self是调用这个函数的对象
- 对象名.属性名 即可获取属性的值
- 魔法方法
- 在特定时机自动调用,无需手动调用
- init()在对对象创建成功之后,初始化对象时调用
- 带参数的init
- 在特定时机自动调用,无需手动调用
- ‘——mro——’,类或对象调用方法或属性时的查找顺序
- 多态
- 不同子类调用父类的同一方法,执行效果不同
- 传入不同的对象给调用者执行不同的代码
- 类属性
- 使用场景
- 多个实例对象操作同一个属性,比如说斗地主,三个玩家都操作的同一副扑克.
- 有属性包含或者控制多个对象.比如说学生类里面的一个学生列表属性,用来存储所有的学生信息.
- 个人感觉可以用全局变量的思想来思考
- 类对象所拥有的属性,被该类的所有实例对象共有
- 类属性可以使用类访问,也可以使用实例对象去访问
- 使用场景
- 类方法
- 应用场景
- 一般只需要操作类属性的时候使用
- 类对象所执行的方法
- 用修饰器@classmethod来标识其为类方法.
- 一般以cls作为第一个参数,cls代表当前类本身
- 应用场景
- 静态方法
- 应用场景
- 工具类
- 装饰器@staticmethod来进行修饰
- 静态方法不需要传递对象也不需要传递参数
- 应用场景
异常
-
当检测到一个错误时,解释器不能执行下去,反而会报出错误信息.
-
try:
可能发生错误的代码
except:
如果出现异常,执行的代码
-
Exception所有异常的父类,可以捕获所有异常
-
try:
可能发生错误的代码
except:
如果出现异常,执行的代码
else:
程序没有异常执行的代码
finally:
无论是否异常都要执行的代码
模块和包
- 模块是一个python文件,即.py文件
- 模块导入方式
- import 模块
- from 模块名 import 功能名
- from 模块名 import *
- import 模块名 as 别名
- from 模块名 import 功能名 as 别名
- 调用功能
- 模块名.功能名()