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)那么把一个中文劈开了,就会造成乱码)

posted @ 2020-03-13 15:43  buono  阅读(186)  评论(0)    收藏  举报