Python基础的复习
2019年学习了python的一点皮毛,后来忙雅思就没有再继续深入了。 这次趁着疫情不出门,想好好学习一下python和mysql。 用一周过了一遍基础,把去年的记忆给回想起来,以下是记的一些笔记。
Python复习
编码
十六进制数: 逢16进1, 10过后用A - F 来表示, 例如 \xe6 ,其中\x在编程中表示十六进制,
bit : 二进制数,0和1组成。 例如00000045 就是8bit 二进制数会以0b开头,如0b11100110 为一个字节
Byte: 每8bit可以表达256中状态, 成为1byte (ASCII编码就是把每种状态规范成一个英文字母或者标点等,从而让计算机识别)
ASCII : 最初使用的英文编码
GB2312 : 大陆发布的中文编码
Big5 : 繁体地区的中文编码
GBK: 兼容GB2312和Big5 的升级版汉字编码
Unicode : 国际通用编码规则,给每个字一个ID
Utf- 8 : Unicode 的一种解决方式,可变长度,例如UTF - 8 的英文字母 和ASCII一样一个字节表示一个, UTF -8 的中文就是3个字节组成一个。 从而节约资源
字符串
对字符串可以进行变化,例如:
value = "hao ran"
new_value = value.upper()
.upper()将字符串转化为大写
.lower()把字符串转化为小写
.isdigit()检测输入的是否是int(数字),并返回布尔值(True or False)
.strip()去掉两头空格,.lstrip 、.rstrip 去掉左或右的空格
.replace替换指定的str(游戏中脏话识别系统)
.split根据指定元素对字符进行切割,生成列表
len()计算字符长度(unicode编码下,所有字符都占2个字节/byte)
对字符串索引:ran[0] 可以取到第一个值r
.format可以格式化字符串,通过{0}这样的方式占位
name = "我叫{0}, 年龄{1}"
new_name = name.format('haoran', '23')
print(new_name)
.encode可以转化编码(utf-8 、gbk等)
字符串的索引
通过对变量进行[0:0:0] 来提取信息,其中第1、2个数字为开始结束位置(算前不算后)留空默认为从第一到最后一个。第三个数字为步长,步长为负数时从右往左循环,到位置结束,不跨越循环。
name = 'haoran'
# 取第0个字符
name[0]
# 取第0到倒数第2个字符,n为倒数第1个字符
print(name[0:-1])
# 第三个数字为步长(默认为1)依次取第0、2、4个字符
print(name[0::2])
#步长为负时,从右往左走(到尾部结束,不循环)
print(name[3::-1])
【练习】检测输入值中数字的数量
value = input('请输入检测数值:')
count = 0
num = 0
length = len(value)
while count < length:
status = value[count].isdigit()
if status:
num += 1
count += 1
print(num)
elif 和if的区别
一个if + 一个else
当if的条件为True,就会执行下方代码,否则执行else的代码
N个if + 最后一个else
依次判断每个代码,若为True就会执行。 但是只有第N个if判断为False,才会执行最后一个else代码
一个if + N个elif + 一个else
挨个判断,只要有一个为True,就不再执行
for循环
name = 'hao ran'
for i in name:
print(name)
for循环就是把变量name中的字符依次循环,每次都赋值给变量i
有穷尽的优先选择for循环,无穷尽选择while
列表
list = ['ran','hao',99]
#数字不用加引号
len(list) 计算长度
list[1] 索引第1个元素
list[0:2] 取第0到2个元素
list[0:2:1] 可以设置步长,参考“字符串的索引“
.split () 可以通过指定元素对字符串进行分割,分割出的元素组成列表
range(0,5) 生成0-5的列表 (新版本中需要 list() 才能输出列表)
增
.append() 增加内容
.insert(0,"ran") 在第0个元素前面加上指定内容
删
.remove("ran") 删除列表中的第一个”ran“ 元素
.pop(0) 删除第0个元素,不加数字就删除最后一个元素
.clear()删除所有
del ran[0] 删除第0项元素
改
ran[2] = ' new' 直接把列表中第二个元素改成新值
查
索引/切片
元组tuple
元组的书写
users = [11,22,33,'ran'] #列表 可变
users = (11,22,33,"ran") #元组 不可变
元组中的元素不可被修改或删除
字典
字典格式
info = {'name':'haoran', 'age':18, 'hobby':'game'} #name为键(key), haoran为值(value)
字典功能
info.keys() #获取字典所有的键
info.values() #获取字典所有的值
info.items() #获取字典所有的键值对(item)
for v1,v2 in info.items()
print(v1,v2) #这样可以同时赋值一对
改
info['age'] = 23 #改值
#键一般不会改,需要动的话删除后在增加
删
del info['name'] #键值对为整体,无法单独删除其中一项
增
info['添加的新键'] = 'asdkhas'
info.update{'age':'0228', 'hobby':'game','ass':5465} #存在的更新,不存在的添加
查
索引:只能通过[] 输入key来取值,字典内没有顺序无法用数字取值
info.get('age') #取age的值,如果没有就返回None
info.get('age',111) #取age的值,如果没有就返回111
集合set
v = {1,2,3,4,5}
集合是无序,不重复的
V.add() 增加
V.update
result = V.intersection({11,22,33}) 取交集,赋值到result
V.difference({11,22}) 取差集
嵌套问题
列表、字典、集合 是可变的,所以不能嵌套在集合中,也不能作为字典的Key
哈希hash
把信息进行哈希运算, 生成哈希值存储在内存中, 那么进行索引可以直接找到对应值,而不用遍历。 【列表因为可变,所以不是哈希存储的】
哈希与网站密码
网站只需要存储用户的密码的哈希值即可。 用户的明文密码相当于一个物体, 哈希值相当于这个物体在太阳下的阴影。 所以一个阴影可能对应多个物体(哈希过程中是有信息流失的)
假如用户的密码是A, 对应的哈希值是B, 但是C对应的哈希值也是B。 那么是可以输入C来通过哈希碰撞的, 但是找到的可能性是10的256次方,没有现实意义。
深浅拷贝的概念
str、int、bool 的深浅拷贝没区别
list 、set、dic 的有区别 浅拷贝只是添加了一层映射关系 。 深拷贝只是拷贝了可变的元素【嵌套等】,其他的任然是建立映射关系。
文件操作
文件的读写和追加
#打开当前目录下的log.txt,
object_file = open('log.txt', mode='r', encoding='utf - 8')
# r,read(只读,文件不存在报错) 、w,write(只写,打开直接清空文件来重写,文件不存在则新键,一般用于新键文件) 、 a,append(在文件尾部追加)、 r+ (读写模式)、w+(写读模式,打开还是会清空,然后再写) 、 a+(可读可写,但是追加模式的光标默认在最后,所以读不到东西)
#读取\写入\追加
content = object_file.read() #读取所有类容到内存
content = object_file.read(2) #读取光标后2个字符
content = object_file.readlines() #读取所有,按照每一行进行分割放进一个列表
#如果读一个超大文件:
for line in object_file
#可以一行一行的读
content = object_file.write()
content = object_file.append()
print(content)
#关闭文件,关闭之前的数据都在内存上
object_file.close()
mode模式补充
wb模式为写入二进制, 适用于编码规则不同的文件的写入(如图片、音频等你不需要知道编码的文件,同理还有rb,ab模式)
a = '123 haoran 浩然'
b = a.encode('utf - 8') #把a按照utf - 8 的规则转化成二进制
print(b)
#输出:b'123 haoran \xe6\xb5\xa9\xe7\x84\xb6'
-------------------------------------------------------------
a = b'123 haoran \xe6\xb5\xa9\xe7\x84\xb6'
b = a.decode('utf- 8') #按照utf-8 的规则解码二进制数
print(b)
#输出: 123 haoran 浩然
文件写入的光标
读取的时候从最左边开始,如果是追加则是从最右边开始。 写入会从光标开始的地方进行改写
object_file.seek(3) 表示把光标移动到第三个字节那里 (UTF-8 编码中一个汉字是三个字节,如果seek(2)那么把一个中文劈开了,就会造成乱码)

浙公网安备 33010602011771号