目录
组合数据类型
组合数据类型分为序列类型(字符串str、元组tuple、列表list)、集合类型(集合set)和映射类型(字典map)
1.1 序列类型通用操作符和函数
操作符 | 描述 |
x in s | 如果x是s的元素,返回True,否则返回False |
x not in s | 如果x不是s的元素,返回True,否则返回False |
s + t | 连接 s 和 t |
s * n 或 n * s | 将序列 s 复制 n 次 |
s[i] | 索引,返回序列第 i + 1个元素 |
s[i : j] | 切片,不包括第 j 位元素 |
s[i : j : k] | 步骤切片,k表示步长,不写默认为1 |
len(s) | 序列 s 的长度 |
min(s) | 序列 s 的最小元素 |
max(s) | 序列 s 的最大元素 |
sum(s) | 序列 s 的求和(列表只含数字) |
s.index(x) | 序列 s 中从左往右第一次出现 x 的索引 |
s.rindex(x) | 序列 s 中从右往左第一次出现 x 的索引 |
s.count(x) | 序列 s 中出现 x 的总次数 |
注: 序列类型是可迭代对象,可以直接使用for循环操作
a=[1,2,3,4,5]
for i in a:
print(i,end='**') #end是可选参数,不写默认为换行符'\n'
#得到1**2**3**4**5**
1.2 集合类型
类似数学上的集合概念元素具有单一性,集合并没有自动升序排列的性质,可能是元素少的时候碰巧,可以使用sorted()函数来排序。(集合是具有确定性、互异性、无序性的,不要混淆)
一般用于去除列表中的相同元素
list1=[5,1,3,7,9,9,2]
list1=list(set(list1))
print(list1) #得到[1, 2, 3, 5, 7, 9]
# 可以看到这个自动升序了,但仅仅是碰巧。
print(set([1,3,8,-2,99,98,77,1,5,3,77,12])) # 得到{1, 98, 3, 99, 5, 8, 12, 77, -2}
# 可以看到,这个就不会自动给你升序了集合并没有自动升序排列的性质
1.3 映射类型
这个不太重要,只需要了解:
- 怎样增删键值对
- 怎样得到字典中键,值,键值对应的元组
- 一个键只能对应一个值
注:键(key)就是冒号左侧的值。值(value)就是冒号右面的数值。
数值操作
2.1 各种运算符
算数运算符 | 描述 |
x%y | 求得商的余数。例如:5%2结果为1 |
x//y | 求得x除y商的整数位,简称整除。例如5//2结果为2 |
x**y | 求得x的y次幂。例如4**(1/2)结果为2,3**2结果为9 |
比较运算符 | 描述 |
x==y、x!=y | 判断x是否相等或者不相等,符合条件返回True,否则返回False |
x>y、x<y | 判断x是否大于或小于y,符合条件返回True,否则返回False |
x<=y、x>=y | 判断x是否大于等于或小于等于y,同样返回布尔值 |
赋值运算符 | 描述 |
x=y | 将y的值赋值给x,注:当y是复杂数据类型时要使用.copy()的方法 |
x+=1 | 等价于x=x+1 |
x-=1 | 等价于x=x-1 |
x*=2 | 等价于x=x*2 |
x/=2 | 等价于x=x/2 |
逻辑运算符 | 描述 |
and | 布尔运算“与” |
or | 布尔运算“或” |
not | 布尔运算“非” |
优先级关系:or<and<not,同一优先级默认从左往右计算。 |
成员运算符 | 描述 |
a in b | 如果a在b就返回True |
a not in b | 如果a不在b就返回True |
字符串操作
3.1 字符串切片
3.1.1 基本切片
格式:<需要处理的字符串>[M:N]。
M缺失表示至开头,N缺失表示至结尾。
注意:
- 两种索引方式可以混用;
- 切片得到的结果不包含N索引的值。
a='零一二三四五六七八九'
print(a[1:3])#得到 一二
print(a[1:-1])#得到 一二三四五六七八
print(a[-3:-1])#得到 七八
print(a[:3])#得到 零一二
print(a[4:])#得到 四五六七八九
3.1.2 高级切片操作
格式:<需要处理的字符串>[M:N:K]。
根据步长K对字符串切片。不写K时默认为1,与[M:N]等价。
a='零一二三四五六七八九'
print(a[1:8:2])#得到 一三五七
#分析过程:在一~七中,索引从1开始,依次加2,即a[1],a[3],a[5],a[7],将其拼接在一起得到一三五七
print(a[::-1])#得到 九八七六五四三二一零
#得到逆序字符串,格式固定。可简单理解为从右至左操作选定的字符串片段[M:N]。
3.2 操作符、相关函数、相关使用方法
操作符 | 描述 |
x+y | 连接两个字符串 |
x*n | 复制n次字符串x |
x in s | 返回布尔值,如果字符串x在s内,则返回True,否则返回False |
相关函数 | 描述 |
len(x) | 返回字符串的长度。例如:len(‘我爱Python’)结果为8 |
str(x) | 将任意类型数据转为字符串。例如:str(123)结果为字符串"123",str([1,2])结果为字符串"[1,2]" |
chr(x) | 返回Unicode编码的单字符。例如:chr(65)得到字母"A" |
ord(x) | 返回单字符对应的Unicode编码。例如:ord(“a”)得到数字97 |
相关使用方法 | 描述 |
str.lower() 、str.upper() | 返回将字符串全部变成小写或大写的副本。 例:‘abc’.upper()的结果为:‘ABC’ |
str.isalpha() | 返回布尔值,判断字符串str是否全部为字母 |
str.islower()、str.isnumeruic() | 返回布尔值,判断字符串str是否全部为小写或数字 如果记不住函数名。建议用循环和比较大小的方式判断每个字符是否符合标准 |
str.split(sep) | 将字符串按sep进行分割,当sep不填的时候默认以空格分割。 例:‘A,B,C’.split(‘,’)结果为:[‘A’,‘B’,‘C’] |
str.strip() | 将字符串左右两边的空字符去掉,\n,\t,空格等。 例:’ \n我爱Python’.strip()结果为:‘我爱Python‘’ |
str.replace(old,new) | 返回副本,将字符串str中old字符替换为new字符。 例:下面有详细讲解 |
3.3 字符串格式化
类型 | 格式规则 |
f | 格式化为浮点数,默认保留6位小数 |
e | 格式化为指数形式,默认小数点后保留6位有效数字 |
d | 格式化为十进制整数 |
x | 格式化为十六进制整数 |
o | 格式化为八进制整数 |
b | 格式化为二进制整数 |
s | 格式化为字符串 |
3.3.1 format{}格式化
默认左对齐
a=1.666
print('{0:-^20.1f}'.format(a)) # 得到--------1.7---------
0表示索引
:是引导符号
-是填充字符
^表示居中
20是输出总长度
.1表示保留一位小数
3.3.2 %格式化
a=1.555
print('%10.2f'%a) # 得到 1.55
%表示引导符号
10表示宽度
.2表示保留两位小数
f表示转为浮点型
列表
注:前面已经介绍了一些通用函数了,可以上去看一看
函数 | 描述 |
ls[i]=x | 将列表索引为 i 的元素更新为 x |
ls.append(x) | 在列表最后添加 x |
ls.insert(i,x) | 在列表的第 i 位添加元素x |
del ls[i] | 删除列表索引为 i 的元素 |
ls.remove(x) | 删除列表中从左到右第一次出现的元素 x |
ls.copy() | 得到列表的副本,对其操作不会影响原数据 |
ls.sort() | 将列表从小到大排序 |
ls.reverse() | 将列表反转 |
mylist=sorted(ls) | 将列表的副本从小到大排序,不会影响原顺序 |
4.1 一些细节
列表中可以存放任意数据类型,但是不建议将其它数据类型强转为列表,而应该使用ls.append()的方法
print(list('我爱Python')) # 得到['我', '爱', 'P', 'y', 't', 'h', 'o', 'n']
ls=[]
ls.append('我爱Python')
print(ls) # 得到['我爱Python']
将列表排序和反转,实际上是调用了sort()方法和reverse()方法,它们是没有返回值的,如果输入会得到None。
a=[1,3,2,6]
print(a.sort()) # 得到None
a.sort()
print(a) # 得到[1,2,3,6]
# reverse同理
4.2 列表推导式
可以浅浅看一下下面的例子
ls=[i for i in range(11)] # 得到[0,1,2,3,4,5,6,7,8,9,10]
ls=[i for i in range(11) if i%5==0] # 得到[5,10]
ls=[(i , j) for i in range(3) for j in range(11,13)]
# 得到[(0, 11), (0, 12), (1, 11), (1, 12), (2, 11), (2, 12)]
字典
dict1={'Python':'好','c':'也好'}
如上所示,冒号左边的为键,冒号右边的是键所对应的值。例如,Python对应的是好,c对应也好。
注:
- 键的存在是单一的,即一个字典一个键只能出现一次。
- 值的类型可以是任意类型,键不能是字典和集合,其他类型都可,但键和值通常为字符型
- 在字典中添加元素时,键与值出现是成对出现的。
函数 | 描述 |
dict1[key]=value | 在字典中添加元素,如果key存在,则覆盖原来对应的值 |
list(dict1.keys()) | 得到字典所有键的列表 |
list(dict1.values()) | 得到字典所有值的列表 |
list(dict1.items()) | 得到字典所有元组类型键,值的列表 |
dict1.get(key,default) | 如果键存在则返回对应的值,不存在则赋值为default |
del dict1[key] | 删除这个键值对 |
key in dict1 | 如果键在字典中则返回True,否则为False |
5.1 一些细节
字典作为可迭代对象,其实是它的键值可迭代
dict1={'Python':'好','c':'也好'}
for i in dict1:
print(i)
# 得到:Python,c
5.2 统计出现次数并从小到大排序
这是这方面很经典的一种问题
5.2.1 统计出现次数
方法一:
list1=[1,1,1,2,5,3,3,10,5,6,8,9,9,11]
dict1={} #创建一个空字典
for i in list1:
dict1[i]=dict1.get(i,0)+1 # dict1.get(i,0)表示如果有键为i则返回对应的值,否则返回0
print(dict1)
方法二:
list1=[1,1,1,2,5,3,3,10,5,6,8,9,9,11]
dict1={} #创建一个空字典
for i in list1:
if i in dict1: # 如果字典中有键为i
dict1[i]+=1 # 对应的值加一
else: # 如果字典中没有键为i
dict1[i]=1 # 创建键值对,值为1,因为这是第一次出现
print(dict1)
5.2.2 排序
mylist=list(dict1.items())
mylist.sort(key=lambda x:(-x[1],x[0]))
# 当写成mylist.sort(key=lambda x:(x[1],x[0]))是根据值从小到大排序
# 当写成mylist.sort()是根据键从小到大排序
print(mylist) # 在此处可以直接根据需求进行其他操作,而不一定要转为字典
dict1=dict(mylist) # 将列表转为字典
print(dict1)
其实,sort里面有个可选参数reverse,默认为false,可以尝试一下在sort里面添加参数reverse=True看看效果。
当你写成mylist.sort(key=lambda x:(x[1],x[0]),reverse=True)这样也能达到根据次数从大到小输出。
5.2.3 整合
list1=[1,1,1,2,5,3,3,10,5,6,8,9,9,11]
dict1={} #创建一个空字典
for i in list1:
dict1[i]=dict1.get(i,0)+1 # dict1.get(i,0)表示如果有键为i则返回对应的值,否则返回0
mylist=list(dict1.items())
mylist.sort(key=lambda x:(-x[1],x[0]))
dict1=dict(mylist) # 将列表转为字典
print(dict1)
元组、集合
这个东西看具体需求了,简单介绍一下吧
元组: 可以被列表所代替,操作与列表操作相似,唯一不同的是元组不能修改,即不能增删元素,但可以使用切片和加法进行更新。
集合: 常用于清除相同元素,但是不具备自动排序的功能。(但是集合是具有确定性、互异性、无序性的,不要混淆)
选择结构
这个无非就是if-elif-else分支了,这个写一写题目就可以学会,主要比较麻烦的就是判断的东西是个布尔值(true和false),在Python中其实是有一些等价的。
true | false |
数字1 | 数字0 |
非空字符串 | 空字符串 |
非空列表 | 空列表 |
非空元组 | 空元组 |
非空字典(集合) | 空字典(集合) |
None |
循环结构
8.1 continue和break
continue:终止本层循环,继续下一层循环
break:跳出循环
8.2 for循环
一般配合range使用
8.3 while循环
形式为while + 条件判断语句。当条件返回True,则继续循环,否则结束循环。
8.3.1 while-else语句
当while语句执行完没有被中断,则会进入else语句。
如果while语句中途被中断了,则不会进入else语句。
函数
就是把代码封装起来,可以通过return返回计算结果,这里需要理解一下形参和实参的区别就好了。
形参就是在定义函数是括号内的参数,实参就是调用函数的参数。
9.1 global语句
在函数中引入全局变量,可以直接对其进行修改。
全局变量:在主程序中定义的变量,既能在一个函数中使用,也能在其他的函数中使用
局部变量:只能在一部分代码中使用,例如for i in range(3)的 i 就是局部变量
9.2 递归
递归其实就是重复调用函数的过程。最经典的就是斐波那契数列。
#斐波那契
n = int(input())
fib,i=[1,1],2
while True:
if max(fib) < n:
fib.append(fib[i-1] + fib[i-2])
i += 1
else:
print(max(fib))
break
一些常见的库
10.1 math库
常用函数 | 描述 |
abs(x) | 得到x的绝对值 |
pow(x,y) | 得到x的y次幂,返回浮点型 |
sqrt(x) | 将x开平方,也可以直接x**(1/2) |
exp(x) | 得到 |
sin(x) | 得到sin(x) |
pi、e | 得到精确数值π、e |
10.2 random库
常用函数 | 描述 |
seed(x) | 当x确定时,产生随机数的顺序其实已经确定了 |
randint(a,b) | 生成[a,b]之间的随机整数(这里是两个闭区间) |
choice(seq) | 从序列类型seq中随机选取一个元素 |
shuffle(seq) | 将序列类型seq随机打乱 |
random() | 生成[0.0,1.0)之间的随机小数 |
uniform(a,b) | 生成[a,b]之间的随机小数(这里是两个闭区间) |
10.3 jieba库
常用函数 | 描述 |
jieba.lcut(s) | 将字符串分词,返回一个列表 |
jieba.lcut(s , cut_all=True) | 全模式,返回字符串中字可能组成的所有词 |
jieba.add(s) | 在词库中添加词语 s |
10.4 time库
常用函数 | 描述 |
sleep(x) | 程序暂停x秒,常用在循环里 |
txt文件读写
这个有一个要注意的地方就是,记得要用close()方法释放文件的使用权
打开模式 | 描述 |
r | 以只读的方式打开 |
w | 覆盖写,文件不存在则会创建,存在则直接覆盖 |
a | 追加写,文件不存在会创建,存在则在文档末尾追加写 |
读文件的方法 | 描述 |
f.read() | 返回一个字符串,内容是文件全部内容 |
f.readlines() | 返回一个列表,每一行的内容为每个元素 |
写文件的方法 | 描述 |
f.write(x) | 将字符串x写入 |