python学习笔记
今日内容概要
- 作业讲解
- 垃圾回收机制(理论)
- 字符编码概述(理论)
- 字符编码相关操作
- 代码操作文件
今日内容详细
作业讲解
先学会走路(基本功能),再想着跑步(优化操作)
1.利用列表编写一个员工管理系统
输入1执行添加用户名功能
输入2执行查看所有用户名功能
输入3执行删除指定用户名功能
ps:思考如何让程序循环起来并且可以根据不同指令执行不同操作
提示: 循环结构 + 分支结构
name_list = [] # 5.定义列表模拟数据库储存用户名
while True: # 3.添加循环
print("""
1.添加用户名功能
2.查看所有用户名功能
3.执行删除指定用户名功能
""") # 添加功能提示
choice = input('please input your command:').strip() # 1.获取用户输入的指令
if choice == '1': # 2.判断用户输入的指令,利用print模拟功能
username = input('please input your username:').strip() # 6.获取用户输入的用户名
if username in name_list: # 7.判断当前用户名是否已存在
print('用户名已存在')
else:
name_list.append(username)
print(f'用户:{username}添加成功')
elif choice == '2':
for name in name_list:
print(f"""
---------------info--------------
username:{name}
---------------------------------
""") # 8.查看所有用户,本质就是打印列表,但是我们可以稍微美化一下
elif choice == '3':
target_name = input('please input target_name to delete:').strip() # 9.获取想要删除的用户名
if target_name not in name_list:
print('此用户不存在')
continue
name_list.remove(target_name)
print(f'用户名{target_name}删除成功')
else:
print('请按要求输入指令')
2.去重下列列表并保留数据值原来的顺序
eg: [1,2,3,2,1] 去重之后 [1,2,3]
l1 = [2,3,2,1,2,3,2,3,4,3,4,3,2,3,5,6,5]
提示:避免惯性思维
l1 = [2, 3, 2, 1, 2, 3, 2, 3, 4, 3, 4, 3, 2, 3, 5, 6, 5]
new_1 = [] # 1.定义一个空列表
for i in l1: # 2.循环含有重复数据值的列表
if i not in new_l: # 3.判断当前数据值是否存在于新列表中
new_l.append(i) # 4.如果不在则追加到新列表
print(new_l) # [2, 3, 1, 4, 5, 6]
3.有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
pythons={'jason','oscar','kevin','ricky','gangdan','biubiu'}
linuxs={'kermit','tony','gangdan'}
1.求出即报名python又报名linux课程的学员名字集合
print(pythons & linuxs)
2.求出所有报名的学生名字集合
print(pythons | linuxs)
3.求出只报名python课程的学员名字
print(pythons - linuxs)
4.求出没有同时这两门课程的学员名字集合
print(pythons ^ linuxs)
垃圾回收机制
1.定义
垃圾回收机制是python解释器自带一种机制,专门用来回收不可用的变量值所占用的内存空间
1.1为什么要用垃圾回收机制?
程序运行过程中会审请大量的内存空间,对一些无用的内存空间不及时清理的话会导致内存溢出,进而导致程序崩溃,系统宕机
1.2垃圾回收机制原理分析
2.引用计数
引用计数就是变量值被变量名关联的次数
当数据值身上的引用计数不为0表示该数据值还有用,不会被删
当数据值身上的引用计数为0则会被垃圾回收机制回收
name = 'jason' # 数据值jason身上的引用计数就是1
name1 = name # 数据值jason身上的引用计数就是2
del name1 # 数据值jason身上的引用计数变为1
引用计数存在一个坑:循环引用
循环引用会导致值不在被任何名字关联,但是值的引用计数并不会为0,应该被回收但不能被回收
3.标记清除
专门用于解决循环引用的问题,将内存中程序产生的所有数据值全部检查一遍,是否存在循环引用打上标记,之后一次性清除
# 循环引用
l1 = ['jason',] # 引用计数为1
l2 = ['kevin',] # 引用计数为1
l1.append(l2) # 引用计数为2
l2.append(l1) # 引用计数为2
del l1 # 解除变量名l1与列表的绑定关系,列表引用计数减1
del l2 # 解除变量名l2与列表的绑定关系,列表引用计数减1
此时只剩下两个列表的相互作用,两个列表引用计数都不为0,但两个列表不在关联任何对象,所以它两占用内存空间应该被回收,但由于相互作用,每一个引用计数都不为0,所以这些对象占的内存空间永远不会被释放。循环引用是致命的
3.分代回收
标记清除每隔一段时间就需要将所有的数据排查一遍,资源消耗过大,为了减轻垃圾回收机制的资源消耗,开发了三代管理
分代回收的核心思想是:在历经多次扫描的情况下,都没有被回收的变量,该机制就会认为,该变量是常用变量,该机制对其扫描的频率会降低
字符编码简介
1.只有文本文件才有字符编码的概念
2.计算机内部存取数据的本质:二进制
计算机其实只认0和1
3.为什么我们在使用计算机的时候可以随意敲出各国文字
肯定存在一个人类字符与数字的转换关系
4.转换关系不能随便更改,应该有统一的标准
字符编码表:记录了人类的字符与数字的对应关系
字符编码发展史
1.一家独大
计算机是由美国人发明的,美国人需要让计算机识别英文字符
ps:英文所有的字符加起来不超过127个(2的七次方)但是美国人考虑到后续可能出现新的字符所以加了一位以备不时之需(2的八次方)
ASCII码:内部只记录了英文字符与数字的对应关系
1bytes来存储字符
A-Z: 65-90
a-z: 97-122
ps:此时的计算机只能识别英文,不识别其他文字
2.群雄割据
中国需要让计算机识别中文,需要开发一套中文的编码表
GBK码:内部记录了中文字符,英文字符与数字的对应关系
2bytes起步存储中文(遇到生僻字使用更多字节)
1bytes存储英文
韩国需要让计算机识别韩文 需要开发一套韩文的编码表
Euc_kr码:内部记录了韩文字符、英文字符与数字的对应关系
日本需要让计算机识别日文 需要开发一套日文的编码表
shift_JIS码:内部记录了日文字符、英文字符与数字的对应关系
ps:此时的各国计算机文本文件无法直接交互 会出现乱码的情况
3.天下一统
万国码(unicode):兼容万国字符
所有的字符全部使用2bytes起步存储
utf家族(针对unicode的优化版本):utf8
英文还是采用1bytes
其他统一采用3bytes
ps:内存使用unicode,硬盘使用utf8
字符编码实操
只有字符串可以参与编码解码,其他数据类型需要先转成字符串才可以
1.解决乱码的措施
当初以什么编码存的就以什么编码解
2.编码与解码
编码(人类的字符翻译成计算机得到字符)
将人类的字符按照指定的编码转换成计算机可以识别的数字
解码(计算机的字符翻译成人类的字符)
将计算机能够识别的数字按照指定的编码转成人类可以读懂的字符
s1 = '学无止境'
# 编码(encode)
res = s1.encode('gbk')
print(res, type(res))
"""
在python中bytes类型的数据可以直接看成是二进制数据
"""
# 解码(decode)
res1 = res.decode('gbk')
print(res1, type(res1))
3.解释器层面
python2默认的编码是ASCII码
1.文件头
# coding:utf8
2.定义字符串
需要在字符串的前面加u
ps:为什么要这么做,因为没有办法,是补救措施
python3默认的编码是utf8码
文件操作简介
1.文件操作
通过编写代码自动操作文件读写
2.什么是文件
双击文件图标是从硬盘加载数据到内存
写文件之后保存其实就是将内存中的数据刷到硬盘
文件其实是操作系统暴露给用户操作计算机硬盘的快捷方式之一
3.如何代码操作文件
open(文件路径,读写模式,字符编码)
方式1:
f = open()
f.close()
方式2:
with open() as 变量名:
子代码运行结束之后自动调用close()方法
4.针对文件路径需要注意,可能存在特殊含义(字母与撬棍组合)
在字符串的前面加字母r即可取消特殊含义
作业
1.统计列表中每个数据值出现的次数并组织成字典战士
eg: l1 = ['jason','jason','kevin','oscar']
结果:{'jason':2,'kevin':1,'oscar':1}
真实数据
l1=['jason','jason','kevin','oscar','kevin','tony','kevin']
l1 = ['jason', 'jason', 'kevin', 'oscar', 'kevin', 'tony', 'kevin']
dict = {} # 1.创建一个空字典保存数据值
for i in l1: # 2.循环从列表l1拿出数据值
if i in dict: # 3.判断拿出的数据值在不在字典中
dict[i] += 1 # 4.在字典中则次数加一
else:
dict[i] = 1 # 5.不在字典中则建立新值然后等于一
print(dict)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了