-
数字类型
- 整数类型
- oct
- 八进制
- hex
- 十六进制
- bin
- 二进制
- oct
- 浮点数类型
- isdigit()
- isdecimal()
- 整数类型
-
字符串类型
-
拼接
-
- join
-
-
索引取值
- 正向索引
- 负向索引
-
切片
name = 'dream' # 顾头不顾尾 print(name[0:3]) # [0:end] print(name[:3]) # [0:结尾] print(name[0:]) # [start:end:step] print(name[0:3:2])
-
长度计算
- len()
-
成员运算
- in / not in
-
去除空格
- strip()
- rstrip()
- lstrip()
-
切分
- split('默认是空格或\n')
sentence = 'my age is dream' sentence_one = ''' my age is dream ''' print(sentence.split()) print(sentence_one.split())
- rsplit()
-
遍历
-
重复
-
大小写转换
- upper
- lower
- captalize
- 只能将这句话的收个单词的首字母大写
- title
- 能将句子中的每一个单词的首字母大写
- swapcase
- 将你的单词,大写编小写,小写变大写
-
首尾字符判断
- startswith
- endswith
-
格式化输出
- %s %d
- f + {}
- format
- 按位置传参数
- 按索引传参数
- 按关键字
-
替换
- replace('原来的内容','新的内容')
-
判断类型
- isdigit
-
查找
- find/rfind
- index/rindex
-
计数
- count
-
填充
- center
- ljust
- rjust
- zfill
-
-
列表
- 类型转换
- 按索引取值
- 切片
- 计算长度
- 成员
- 增加
- append()
- extend()
- insert()
- 删除
- del
- pop()
- remove()
- 颠倒元素
- reverse
- 排序
- sort(reverse=False)
- sorted()
- 遍历
- for
- for循环列表
- for循环索引
- while
- for
-
元组类型
name_tuple = ('dream',) name = 'dream'
- 类型转换
- 索引取值
- 切片
- 成员运算
- 计算长度
- 遍历循环
- 拼接
- 将两个元组内的元素合并到一起
-
布尔类型
- 真
- 1 和 大于和小于1 的数字
- 有值的字符串 / 列表/元组/集合
- 假
- 0
- 无值的字符串 / 列表/元组/集合
- 真
-
字典类型
- 取值
- ['key']
- 取不到就会报错
- get('key',default)
- ['key']
- 计算长度
- 成员运算
- 增加
- update(key=value) / update({'key':'value'})
- setdefault()
- 删除
- del dict['key']
- pop('key')
- popitem()
- clear()
- 键对 / 值对 / 键值对
- 遍历循环
- sorted()
- 如果是中文字符,排序的依据就是中文字符对应的ASCII码的位置
- 取值
-
集合
-
两大特性
- 去重
- 无序
-
类型强转
-
添加
- add
- update('类标/元祖')
-
删除元素
- remove('value')
- discard('value')
-
并集
-
交集
-
差集
-
计算长度
-
遍历循环
-
成员运算
-
今日内容概要
-
垃圾回收机制
- 引用计数
- 标记清除
- 分代回收
-
字符编码
-
文件操作
今日内容详细
【一】垃圾回收机制(GC)
-
十二个字
- 引用计数
name = 'dream' # 'dream' 的 引用计数就是 1 a = name # 'dream' 的 引用计数就是 2
- 标记清除
# 一旦你的内存空间装满了,溢出,那此时程序就会停止,然后进行两项工作 # 标记 : 'dream' : 0 # 清除 :
- 分代回收
# 'dream' # 第一阶段 : 新生代 # [] --- 30s扫描一次 # 第二阶段 : 青春代 [] ---- 3 min扫描一次 # 第三阶段 : 老年代 [] ---- 5min扫描一次
【二】字符编码
【1】阶段一:一家独大(ASCII)
(1)ASCII表的诞生
- 现代计算机起源于美国,所以最先考虑仅仅是让计算机识别英文字符,于是诞生了ASCII表
(2)ASCII表的特点
- 只有英文字符与数字的一一对应关系
- 一个英文字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
(3)字母对应ASCII表
- A-Z : 65-90
- a-z : 97-122
- 0-9 : 48-57
- 小写字母对应的数字一定大于大写字母
【2】阶段二:诸侯割据(ASCII/GBK/Shift_JIS)
- 为了让计算机能够识别中文和英文,中国人定制了
GBK
(1)GBK表的特点
- 只有中文字符、英文字符与数字的一一对应关系
- 一个英文字符对应1Bytes 一个中文字符对应2Bytes
- 补充说明
- 1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
- 2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符
(2)各国不同的编码表
- 为了让计算机能够识别日文字符、英文字符与数字的一一对应关系,日本定制了
Shift_JIS
表 - 为了让计算机能够识别韩文字符、英文字符与数字的一一对应关系,韩国定制了
Euc-kr
表 - 美国人用的计算机里使用字符编码标准是ASCII
- 中国人用的计算机里使用字符编码标准是GBK
- 日本人用的计算机里使用字符编码标准是Shift_JIS
【3】阶段三:一统天下(unicode)
- unicode于1990年开始研发,1994年正式公布
(1)unicode的特点
- 存在所有语言中的所有字符与数字的一一对应关系,即兼容万国字符
- 与传统的字符编码的二进制数都有对应关系,详解如下
- 很多地方或老的系统、应用软件仍会采用各种各样传统的编码,这是历史遗留问题。
- 此处需要强调:软件是存放于硬盘的,而运行软件是要将软件加载到内存的,面对硬盘中存放的各种传统编码的软件,想让我们的计算机能够将它们全都正常运行而不出现乱码,内存中必须有一种兼容万国的编码,并且该编码需要与其他编码有相对应的映射/转换关系,这就是unicode的第二大特点产生的缘由
(2)字符的存储
- 文本编辑器输入任何字符都是最新存在于内存中,是unicode编码的
- 存放于硬盘中,则可以转换成任意其他编码,只要该编码可以支持相应的字符
- 英文字符可以被ASCII识别
- 英文字符--->unciode格式的数字--->ASCII格式的数字
- 中文字符、英文字符可以被GBK识别
- 中文字符、英文字符--->unicode格式的数字--->gbk格式的数字
- 日文字符、英文字符可以被shift-JIS识别
- 日文字符、英文字符--->unicode格式的数字--->shift-JIS格式的数字
【三】可变和不可变数据类型
【1】堆
# 堆的操作是先进先出(FIFO)
list_queue = []
for i in range(0, 5):
print(f'{i} 已入堆(队列)')
list_queue.append(i)
print('------入堆完毕--------')
while list_queue:
print(f'{list_queue.pop(0)} 已出堆(队列)')
print('------出堆完毕--------')
0 已入堆(队列)
1 已入堆(队列)
2 已入堆(队列)
3 已入堆(队列)
4 已入堆(队列)
------入堆完毕--------
0 已出堆(队列)
1 已出堆(队列)
2 已出堆(队列)
3 已出堆(队列)
4 已出堆(队列)
------出堆完毕--------
【2】栈
# 栈的操作是先进后出(LIFO)
list_stack = []
for i in range(0, 5):
print(f'{i} 已入栈')
list_stack.append(i)
print('------入栈完毕--------')
while list_stack:
print(f'{list_stack.pop()} 已出栈')
print('------出栈完毕--------')
0 已入栈
1 已入栈
2 已入栈
3 已入栈
4 已入栈
------入栈完毕--------
4 已出栈
3 已出栈
2 已出栈
1 已出栈
0 已出栈
------出栈完毕--------
【四】文本处理引入
- 应用程序运行过程中产生的数据最先都是存放于内存中的
- 若想永久保存下来,必须要保存于硬盘中。应用程序若想操作硬件必须通过操作系统
- 而文件就是操作系统提供给应用程序来操作硬盘的虚拟概念
- 用户或应用程序对文件的操作,就是向操作系统发起调用,然后由操作系统完成对硬盘的具体操作。
【五】文件操作的基本流程
【1】基本流程
- 有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程
# 1. 打开文件,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r
# 2. 调用文件对象下的读/写方法,会被操作系统转换为读/写硬盘的操作
data=f.read()
# 3. 向操作系统发起关闭文件的请求,回收系统资源
f.close()
【2】资源回收与 with
的用法
-
打开一个文件包含两部分资源
- 应用程序的变量f和操作系统打开的文件。
- 在操作完毕一个文件时,必须把与该文件的这两部分资源全部回收
- 回收方法为
f.close() # 回收操作系统打开的文件资源 del f # 回收应用程序级的变量
-
其中del f一定要发生在f.close()之后
- 否则就会导致操作系统打开的文件无法关闭,白白占用资源,
-
而python自动的垃圾回收机制决定了我们无需考虑del f
- 这就要求我们,在操作完毕文件后,一定要记住f.close()
-
虽然我们如此强调,但是大多数读者还是会不由自主地忘记f.close()
-
考虑到这一点,python提供了with关键字来帮我们管理上下文
# 1、在执行完子代码块后,with 会自动执行f.close()
with open('a.txt','w') as f:
pass
# 2、可用用with同时打开多个文件,用逗号分隔开即可
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
data = read_f.read()
write_f.write(data)
【3】指定操作文本文件的字符编码
f = open(...)
是由操作系统打开文件- 如果打开的是文本文件,会涉及到字符编码问题
- 如果没有为open指定编码,那么打开文本文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
- 这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
f = open('a.txt','r',encoding='utf-8')
【六】文件的操作模式
- r(默认的):
- 只读
- w:
- 只写
- a:
- 只追加写
【1】r 模式的使用
# r只读模式: 在文件不存在时则报错,文件存在文件内指针直接跳到文件开头
with open('a.txt',mode='r',encoding='utf-8') as f:
res=f.read() # 会将文件的内容由硬盘全部读入内存,赋值给res
# 小练习:实现用户认证功能
inp_name=input('请输入你的名字: ').strip()
inp_pwd=input('请输入你的密码: ').strip()
with open(r'db.txt',mode='r',encoding='utf-8') as f:
for line in f:
# 把用户输入的名字与密码与读出内容做比对
u,p=line.strip('\n').split(':')
if inp_name == u and inp_pwd == p:
print('登录成功')
break
else:
print('账号名或者密码错误')
- 当路径中可能存在有转移的字符时,字符串前面加上r来解决转义的问题
r'D:\a.txt'
【4】w 模式的使用
- w只写模式: 在文件不存在时会创建空文档,文件存在会清空文件,文件指针跑到文件开头
with open('b.txt',mode='w',encoding='utf-8') as f:
f.write('你好\n')
f.write('我好\n')
f.write('大家好\n')
f.write('111\n222\n333\n')
- 强调
- 在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面
- 如果重新以w模式打开文件,则会清空文件内容
【3】a 模式的应用
- a只追加写模式: 在文件不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾
with open('c.txt',mode='a',encoding='utf-8') as f:
f.write('44444\n')
f.write('55555\n')
# 小练习:实现注册功能:
name=input('username>>>: ').strip()
pwd=input('password>>>: ').strip()
with open('db1.txt',mode='a',encoding='utf-8') as f:
info='%s:%s\n' %(name,pwd)
f.write(info)
- 强调 w 模式与 a 模式的异同
- 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
- 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后