知识回顾:
为什么区分数据类型?
区分数据类型就是对程序需要处理的数据进行分类,主要是为了区分储存空间(不同类型的数据占存储大小不同)、运行时对数据做不同处理
1.数值型(numbers)
1.1 表现形式
整数(int) | 二进制、八进制、十进制、十六进制 |
浮点数(float) | 整数+小数、科学计数法 |
复数(complex) | 实部 + 虚部 |
1.2 进制概念
n进制:逢n进一
进制 | 组成 | python表达形式 |
二进制 | 0、1 | 0b + 二进制数 |
八进制 | 0 ~ 7 | 0/0o + 八进制数 |
十进制 | 0 ~ 9 | 十进制数 |
十六进制 | 0 ~ 9、a ~ f (a ~ f 表示10 ~ 15) | 0x + 十六进制数 |
1.3 进制转换
1.3.1 其他进制 一一> 十进制
- 以301为例:二进制 一一> 十进制: = 13
八进制 一一> 十进制: = 193
1.3.2 十进制 一一> n进制
- 规律:整数部分:除n取余,逆序排法
小数部分:乘n取整,顺序排法
- 转换函数:
转换函数 | 作用 |
bin() | 将对应数值转化成二进制代码 |
oct() | 将对应数值转化成八进制代码 |
hex() | 将对应数值转化成十六进制代码 |
1.3.3 二进制 <一一> 八进制 / 十六进制
- 八进制:整合三位为一位
例如:二进制 10 110 ,把三位看作一位即后三位110为一组,对应十进制为6;前三位010(前面补一个0)为一组,对应十进制为2,则转化为八进制就是26
- 同理,十六进制:整合四位为一位
- 反之,若八/十六进制 一一> 二进制,则只需将每一位数拆分为三 / 四位
1.4 常用操作(各种函数)
1.4.1 适用于几乎所有的python运算符
(例如:算数运算符 复合运算符 比较运算符 逻辑运算符)
1.4.2 数学函数
分为内建函数(直接使用)和模块函数(需要先导入对应的包)
常用数学函数 | 作用 | 类型 |
---|---|---|
abs() | 返回绝对值 | 内建函数 |
max() / min() | 最大值/最小值 | |
round(x,n) | 四舍五入(n表示四舍五入的位数) | |
pow(x,y) | 返回x的y次幂 即x^y ( 或x**y ) | |
ceil() | 向上取整 3.1取为3 | 模块函数 先导入math包 |
floor() | 向下取整 3.1取为4 | |
sqrt() | 开平方 | |
log(x, base) | 以base为基数(底), x的对数 |
模块函数的使用方法
(1)先导入相应的包
# 导入math模块
import math
(2)使用函数时,应该用 模块名.函数名(参数)
x = math.ceil(3.1)
y = math.floor(3.1)
print(x,y)
1.4.3 随机函数
在使用之前,需要先导入random模块
常用随机函数 | 作用 |
---|---|
random() | [0,1)之间的一个随机小数 |
choice(seq) | 从一个序列seq中随机挑选一个数值 |
uniform(x,y) | [x,y] 之内的一个随机小数 |
randint(x,y) | [x,y] 之内的一个随机整数 |
randrange(start, stop=None, step=1) | 给定区间内的一随机整数 [start, stop) 右边取不到 |
1.4.4 三角函数
在使用之前,需要先导入math模块
弧度 = 角度 / 180 * pi pi 一一> (数学常量)
常用三角函数 | 作用 |
---|---|
sin() cos() tan() | 正弦 余弦 正切(注:需要输入弧度) |
asin() acos() atan() | 反正弦 反余弦 反正切 |
degrees(x) | 弧度 一> 角度 |
radians(x) | 角度 一> 弧度 |
2.布尔型(bool)
- 只有 True 和 False 两种结果
- 是int(整数)类型的子类,二者拥有某种相同的特性
- (可以利用issubclass(bool,int)来判定前者是否是后者的子类)
- 应用场景:
1)当作int类型,参与运算,True代表1,False代表0
2)比较运算结果
3)可用于if判定条件和while循环条件(while True: 可以让程序一直循环)
3.字符串(string)
-
概念:由单个字符组成的一个集合
3.1 形式
字符串形式 | 表达方式 | 备注 |
非原始字符串 | 单引号 ' ' 双引号 “ ” 三个单引号 ‘‘‘ ’’’ 三个双引号 “““ ””” | 可以被转义符或内部的引号影响 |
原始字符串 | r + 非原始字符串 例如:r “abc” | 里面是什么内容就输出什么内容(使转义符失效) |
转义符(补充) | \ (在行尾时) 续行符 | 通过转换某个指定的字符, 使它具备特殊的含义 在使用时应当将转义符放在引号内 例如:print(“12\n” "34") |
print("我是图图\"小淘气\"") # 在非原始字符串中,使用两层引号会引起错误,所以用转义符
print(r"面对世界\"很好奇\"")
- 如何使转义符失效?
1)使用原始字符串 r “ab\c” 2)使用两次转义符 “ab\\c”
- 几点注意事项:
# 注1 单双引号混用不会报错,可以避开使用转义符
print("我有'问题'数不清")
# 注2 跨行书写可以使用\ 或者()连成一个整体
name1 = "咕叽咕叽"\
"冒不停"
name2 = ("咕叽咕叽"
"冒不停")
# 注3 三引号可直接用于跨行书写 或者注释
name3 ="""答对问题亲一下
这就是我的奖励"""
print(name)
3.2 拼接和切片
3.2.1字符串拼接
拼接方法 | 代码 |
str1 + str2 | |
str1 str2 (直接把两个字符串放一起) | |
f " xxx{ }xx " | |
str * n (打印n遍字符串) | |
3.2.2切片
- 概念:获取字符串的某个片段
(1)获取某一个字符:name[对应编号]
name = "joker"
print(name[2])
注:若从头部开始编号,则从0开始,在上例中,j编号0,k编号2
若从尾部开始编号,则从-1开始,在上例中,r编号-1,e编号-2
(2)获取某个片段:name[起始:结束:步长]
name = "batman joker"
print(name[0:len(name):2]) #从左往右
print(name[len(name):0:-2]) #从右往左
print(name[::-1]) #反转字符串
# 空格也要占一个编号
注:步长>0,从左往右取;步长<0,从右往左取;起始和结束的顺序也要做对应调整
特例:反转字符串 name[ : : -1]
3.3 函数操作
- 该部分不用全部掌握,只需记得大概作用即可,现用现查
- 在使用时应该用name. 函数(),其中name为要操作的字符串的名字
3.3.1查找计算类函数
查找计算类函数 | 作用 | 备注 |
len(name) | 计算字符串的字符个数(内建函数) | 空格算一个字符,转义符算一个字符 |
s.find(sub,start=0,end=len(str)) | 查找子串索引位置 | 从左至右索引,找到后直接停止 |
s.rfind() | 同上 | 从右向左索引 |
s.index()及s.rindex() | 获取子串索引位置 | 与find函数区别:若查找不到,find会报-1,而index会报错 |
s.count() | 计算某个子字符串出现的个数 |
3.3.2转换操作类函数
转换操作类函数 | 作用 | 备注 |
replace(old, new, count) | 在原字符串中,用新字符串替换的旧字符串 | count表替换的个数,默认为全部替换 并不会修改原字符串本身(下面也是) |
s.capitallize() | 将整个字符串首字母变为大写 | |
s.title() | 将字符串每个单词的首字母变为大写 | |
s.lower() | 将字符串每个字符都变为小写 | |
s.upper() | 将字符串每个字符都变为大写 |
3.3.3填充压缩类函数
填充压缩类函数 | 作用 | 备注 |
s.ljust(指定长度,“填充字符”) | 根据指定字符(1个), 将原字符串填充够指定长度 | l表示原字符靠左,填充的字符靠右,例如 “abc” 一> “abcxxx” |
s.rjust() | 同上 | r表示原字符靠右 “abc” 一> “xxxabc” |
s.center() | 同上 | 原字符串居中 “abc” 一> “xxabcxx” 不均分:右边多一个 |
s.lstrip() | 移除所有原字符串指定字符 (默认为空白字符) | l表示仅仅只移除最左侧的指定字符 (出现在字符串中间或右侧,则不移除) |
s.rstrip() | 同上 |
3.3.4 分割拼接类函数
分割拼接类函数 | 作用 | 备注 |
---|---|---|
s.spilt(“sep”,maxsplit) | 根据指定的分隔符,将大的字符串分割成几个子字符串 | sep:分割符(在有分隔符的地方分割) maxsplit:最大分割次数 |
s.partition() | 根据指定的分隔符, 返回三部分内容(分隔符左侧;分隔符; 分隔符右侧) | 从左侧开始查找分隔符 |
s.rpartition() | 同上 | 从右侧开始查找分隔符 |
s.splitlines(keepends) | 按照换行符(\r, \n), 将字符串拆成多个元素, 保存到列表中 | keepends:是否保留分隔符(True:保留) |
s.join() | 根据指定字符串, 将给定的可迭代对象, 进行拼接, 得到拼接后的字符串 | 可迭代对象:字符串,元组,列表等 |
3.3.5 判定类函数
判定类函数 | 作用 | 备注 |
---|---|---|
s.isalpha() | 判定字符串中是否所有的字符都是字母 | bool类型 |
s.isdigit() | 判定字符串中是否所有的字符都是数字 | bool类型 |
s.isalnum() | 判定字符串中是否所有的字符都是数字或者字母 | bool类型 |
s.isspace() | 字符串中是否所有的字符都是空白符 包括空格,缩进,换行等不可见转义符 | bool类型 |
s.startwith(“前缀”) | 判定一个字符串是否以某个前缀开头 | bool类型 |
s.endwith(“后缀”) | 判定一个字符串是否以某个后缀结尾 | bool类型,常用于判定文件后缀 |
“A” in “B” | 判定字符串A是否被B包含 | bool类型 |
“A” not in “B” | 判定字符串A是否不被B包含 | bool类型 |
4.列表(list)
- 概念:有序的(有顺序)可变的(可填加 删减 替换)元素集合
- 与字符串的区别:字符串中的元素更像是一个整体,不可替换;而列表中的元素更像是一群独立的个体,可以轻易替换
4.1 定义方式
定义方式 | 代码 | 备注 |
---|---|---|
[ 元素1, 元素2,... ] | | 列表中的元素可以是 数值 字符串 布尔型,也可以是列表 |
列表生成式 range(start,stop,step) | | |
列表推导式 从一个list推出另一个list [表达式 for 变量 in 列表 if 条件] | 例如:选出list中的奇数的平方,组成新的list |
4.2 常用操作(函数)
- 在使用时应该用list. 函数(),其中list为要操作的列表的名字
4.2.1添加元素
函数 | 作用 | 备注 |
---|---|---|
l.append() | 在列表最后, 追加一个新元素 | |
l.insert (index, object) | 在指定索引前,插入一个元素 | index:索引数 object:插入的元素 |
l.extend(可迭代对象) | 在原列表中,追加一个新的可迭代对象 | 可迭代对象:字符串,元组,列表等 若为字符串,则将字符串拆解后挨个加入“abc”一>“a” “b” “c” |
乘法运算 * | list * 2 相当于把list中的元素打印两遍组成一个新list | |
加法运算 | ["a"] + ["b", "c"] = ["a", "b", "c"] | 与extend区别: 1. 会修改原数组 2. 只能列表类和列表类相加 |
(补充)元素修改: names [ 索引数 ] = 修改值 | names【5】= 6 将编号为5的元素换成6 |
4.2.2删除元素
注意:在使用 list.remove() + 循环语句 时,一定要避免踩坑。错误示范:
num = [1,2,2,3,5,1,2,2,2]
for x in num:
if x == 2:
num.remove(2)
print(num)
错误原因:每次移除最左侧2之后,会导致右侧元素编号-1,列表的内部结构发生了变化,这 样就会导致漏删
正确改进如下:可以先将要删除的元素放入另一个list中,再用循环删除
num = [1,2,2,3,5,1,2,2,2]
#将 遍历元素 和 删除元素 分开进行
dellist = []
for x in num:
if x == 2: # 本次筛选出的元素放入dellist中,不进行删除。
dellist.append(x)
for y in dellist:
num.remove(y)
print(num)
4.2.3元素查询
函数 | 作用 | 备注 |
---|---|---|
names[ index ] | 获取单个元素 | index:索引数 从左到右进行查找,找到立刻停止 |
l.index(object , start , stop) | 获取元素索引数 | object:要查找的元素 |
l.count (object) | 获取指定元素个数 | |
names[ start : end : step] | 获取多个元素(切片) | |
遍历操作 | ||
for x in list: | 根据元素进行遍历 | 在利用元素名称进行遍历时,也可能在循环时遇到问题,此时可设置每次都从下一个元素开始遍历 |
for index in range( len(list) ) | 根据索引进行遍历 |
# 目标:输出所有元素及对应的索引数
names = ["a","b","a","d"]
currentindex = 0
for x in names:
print(x,names.index(x,currentindex))
currentindex += 1
# 设置每次都从下一个元素开始遍历
4.2.4 其他操作(排序 乱序 反转)
函数 | 作用 | 备注 |
---|---|---|
元素 in 列表 | 判定元素是否在列表中 | |
sorted (itrearble, key=None, reverse=False) | 对所有可迭代对象进行排序,(输出一个列表) | itrearble:可迭代对象 key:排序关键字,本质是函数(根据第几个元素排序) reverse:T降序 F升序 |
l.sort (key=None , reverse=F) | 与sorted区别: 1. 直接将排序值赋给原列表 2. 仅可对列表进行操作 | |
random.shuffle (list) | 随机打乱列表 | 需要先导入random模块 import random |
l.reverse (list) | 反转列表 | 另:切片反转 names[ : : -1 ] |
# key参数讲解
num = [("abc",12),("abd",10)]
def getkey(x):
return x[0] # 0:根据第一个元素排序 1:根据第二个元素排序
print(sorted(num,key = getkey))
5.元组(tuple)
- 有序的不可变的元素集合
- 列表适合存储在程序运行期间可能变化的数据集,而元组可以看作元素不可修改的列表
- 将列表转换为元组:tuple(seq),其中seq为列表名字
5.1 定义方式
- 一个元素:(666 , ) 一个元素时一定要在后面添加一个逗号,否则会报错
- 多个元素:(1,2,“abc”) ,此时也可以省略括号,默认为元组,但一般不省略
5.2 常用操作
5.2.1查询(与列表类似)
- 获取单个元素:tuple [ index ] tuple为元组名字
- 获取多个元素:tuple [ start : end : step ] ...
- 统计指定元素个数:tuple.count (object) ...
- 获取元素对应索引:tuple.index (object) tuple为元组名字
5.2.2拼接拆包
- 拼接:乘法与加法与列表(4.2.1)中一样,元组和列表不能一起相加
- 拆包:将元组中的元素取出 a , b = (a , b)
6.字典(dictory)
- 无序的, 可变的键--值对的集合
- 键——值对:每个键都和一个值对应
- 意义:通过键来访问相对应的值,使得访问更有意义与效率,例如通过“name”键访问名字
alien = {"name":"people","color":"green"}
# name和color为键,后面为对应的值
# 通过访问键来获取相应的值
print(alien["name"])
6.1 定义方式
- 方式一:{key: value, key: value...}
- 方式二:类调用:fromkeys(S, v=None) , 此处S可以为字符串,列表,元组(不能为字典) v是对应的值
alien = dict.fromkeys("abc",666) print(alien) # 结果为 {'a': 666, 'c': 666, 'b': 666}
- 注意:
- (1)key不能重复,否则会被后者覆盖
- (2)key必须是不可变的值 (可变:列表 字典 可变集合)
(不可变:数值 布尔 字符串 元组)
- 检测是否为可变的值的方法,修改后,看看id()是否会改变,若改变,则为不可变值
6.2 常用操作(函数)
- 在使用时应该用dic. 函数(),其中dic为要操作的字典的名字
6.2.1 增、删、改
函数 | 作用 | 备注 |
---|---|---|
dic [ key ] = value | 新增或修改key对应的值为value | 当key在原字典中不存在时,即为新增操作 |
del dic[key] | 删除指定键值对 | key,必须要存在 若直接del dic,则删除字典 |
dic.pop(key,default) | 删除指定的键值对, 并返回对应的值 | 若key不存在, 则返回给定的default值,不作删除;若未给定defaul值,则报错 |
dic.popitem() 无需参数 | 删除按升序排序后的第一个键值对, 并以元组的形式返回该键值对 | 若字典为空, 则报错 |
dic.clear() 无需参数 | 删除所有键值对,返回None | 字典本身还存在,但内容被清空 |
olddic.update(newdic) | 批量修改键值对 根据新字典, 批量更新旧字典中的键值对 如果旧字典没有对应的key, 则新增键值对 | olddic:旧字典名字 newdic:新字典名字 |
zdold = {"name":"tutu","age":18}
zdnew = {"name":"tutu","age":20,"address":"北京"}
zdold.update(zdnew)
print(zdold)
# 修改后结果为:zdold = {'name': 'tutu', 'age': 20, 'address': '北京'}
6.2.2 查询操作
函数 | 作用 | 备注 |
---|---|---|
dic [ key ] | 获取单个值 | key若不存在,会报错 |
dic.get ( key , default ) | 获取单个值 | key若不存在,返回None或default对应的值 |
dic.setdefault( key , default ) | 获取单个值 | key若不存在,会新增这个key,对应值为default |
dic.values()无需参数 | 获取所有的值 | python3.x版本中这三个函数的输出值是一个view object,好处是你如果修改了原字典,这三个函数输出的值也会跟着改 变 |
dic.keys()无需参数 | 获取所有的键 | |
dic.items()无需参数 | 获取所有键值对,并以元组返回 | |
for key in dic | 遍历所有的key |
7.集合(set)
- 无序的(没有下标), 不可随机访问的(没有key), 不可重复的元素集合,类似数学中的集合
- 集合中元素为不可变类型(数值 布尔 字符串 元组)
- 可以进行交、并、补、差运算
- 分为可变集合(set)和非可变集合(frozenset)(无法增 删 改)
7.1 定义方式
7.1.1 可变集合
- 方式一: s = {1,2,3} 仅仅可变集合有 创建空集合只能用set(),用{ }会识别成字典
- 方式二:函数 s = set(iterable) 当iterable为dict时,只会获取Key作为set的元素
- 方式三:推导式 s = {表达式 for 变量 in xxx if 条件 }与列表定义类似
7.1.2 不可变集合
- 方式一:函数 s = frozenset(iterable)
- 方式二:推导式 s = frozenset(表达式 for 变量 in xxx if 条件)
7.2 常用操作
- 在使用时应该用set. 函数(),其中set为要操作的集合的名字
函数 | 作用 | 备注 |
---|---|---|
set.add(element) | 添加一个元素 | 必须是不可变类型 (数值 布尔 字符串 元组) |
set.remove(element) | 删除一个元素 | |
set.pop( ) | 随机删除并返回一个集合中的元素 | |
A.intersection(B) 或 A & B | 计算集合A和B的交集 | 输出集合是否可变以A为准 |
A.union(B)或 A | B | 计算集合A和B的并集 | |
A.difference(B)或 A - B | 计算集合A减B的差集 | |
A.isdisjoint(B) | 判定两个集合是否不相交 | |
A.issuperset(B) | 判定A是否包含B |
8.时间日历
- 分为time、calendar、datatime三个模块
8.1 time模块
- 提供了处理时间和表示之间转换的功能
- 在使用之前要先导入time模块(import time),time.函数()
函数 | 作用 | 备注 |
---|---|---|
time. time() | 获取时间戳 | 从0时区的1970年1月1日0时0分0秒, 到所给定日期时间的秒数 |
time. localtime(seconds) | 获取时间元组 | seconds:时间戳 默认当前时间戳 |
time. ctime (seconds) | 获取格式化时间 | |
time. strftime(格式字符串, 时间元组) | 自定义格式化时间 | 可以搜索常用格式符 |
time. clock() | 获取当前CPU时间 | 一般用来统计程序运行时间 在代码前后各用一次,做差 |
time.sleep(secs) | 休眠n秒 |
8.2 calendar模块
- 提供与日历相关的功能
- 比如: 为给定的月份或年份打印文本日历的功能
- 使用方法:首先import calendar,然后calendar.month(2017, 9)
8.3 datatime模块
- Python处理日期和时间的标准库。此外里面还有具体的类如datatime,data,time类
- 要先导入datatime模块(import datatime)
- 在使用时,不仅要用库的名字,还要写类的名字,例如:datatime.datatime.now()
函数 作用 备注 datatime.datatime.today() 获取当前时间 还可单独获取年月日... datetime.datetime.today() + datetime.timedelta(days = n) 获取n天后的日期