python笔记
- 第三章列表的增、删、改、查
#conding=utf-8
#列表的操作:增删改查
#2020年3月16日 23:48:13
list1 = ['dyne','来宾']
#列表增加年龄元素,INT型
list1.append(38)
print("1列表追加年龄:",list1)
#指定位置插入元素如下标为0,一般不用,因为数据大时
#插入后,后面的数据的下标就得全部改,就会慢
list1.insert(0,'gxlb120')
print("2指定位置插入元素:",list1)
#另外一种合并,两个LIST相加赋值给第三变量
list2 = [123,'abc']
list3 = list1 + list2
print("3两个列表相加为:",list3)
#两个列表合并,不需要第三变量,直接合并赋值给变量1
list1.extend(list2)
print('4两个列表的合并:',list1)
#查看三个列表的内存空间地址
print(id(list1))
print(id(list2))
print(id(list3))
#删除列表末尾的元素-1
list1.pop()
print("5删除列表最后一个元素:",list1)
list1.pop(-2)
print("6删除指定下标的一个元素:",list1)
#不知道下标,知道元素内容,删除指定内容
list1.remove('gxlb120')
print("7删除指定元素内容:",list1)
#list1.remove('abc') 如果指完元素list不存就在就报错
#del 按下标删除元素内容
del list1[1]
print("8del按下标删除元素:",list1)
#整个列表删除 DEL,列表不带参数
del list3
#列表元素的修改
list1[-1] = 38
print("9列表元素的修改:",list1)
#统计列表里元素的个数
list1.append("dyne")
print(list1)
print("10统计列表dyne个数:",list1.count('dyne'))
#按元素内容查找其在LIST里的左住右第一个下标值
print("11元素dyne在列表第一个的下标为:",list1.index("dyne"))
#list元素顺序倒序两种方法:切片和REVERSE
list1[0] = 'gxlb120'
print(list1)
print("12列表切片倒序显示:",list1[::-1])
print("切片的话再次打印列表,下标不变其顺序又恢复:",list1)
list1.reverse()
print("13真正意义的倒序下标会变:",list1)
**代码运行效果:
**
DAYS6 集合
- 集合set 容器型的数据类型,它要求它里面的元素是不可变的数据,但它本身是可变的数据类型。集合是无序的,符号为:{}
- 集合的作用:
- 列表的去重
- 关系测试:交集、差集、并集 等
- 集合的创建: set1 = {5,4,3,“中国”,‘达因’}
- 不可变的数据类型有:数字(int float、bool、复数);字符串、元组。
- 可变的数据类类型有:list列表、集合set 、字典dict
- 集合的增删改查操作
`
#增的方法如下:
set1 = {'dyne','age','guangxi'}
set1.add('gxlb120')
print(set1)
#结果显示如下:
{'dyne','age','guangxi','gxlb120'}
#第二种增加方法
set1.update('abced')
print(set1)
#结果显示如下:
{'dyne','a','c','age','guangxi','b','e','gxlb120','d'}
#集合的删除方法如下:
set1.remove('age') #把集合set1里的AGE这个元素给删除。
#集合随机删除pop()
set1.pop()#随机把集合SET1里的元素进行删除一个。
#集合的清空操作:
set1.clear() #把集合set1给清空。
#集合的删除
del set1 #删除集合set1.
#集合的值是不可改的,按理是不可以进行修改的,所以只能变相的进行修改,先删除,再增加新的如:
set1.remove('dyne')
set1.add('小吴')
print(set1)
- 集合的交集(&或intersection)
• set1 = {1,2,3,4,5}
• set2 = {4,5,6,7,8}
• print(set1&set2)
- 结果显示:{4、5} 为两个集合公共大家都共有的部分。
- 集合的并集(|或union)
- print(set1|set2)
- 结果显示 :{1,2,3,4,5,6,7,8} 把两者都有的全列出来。
- 集合的差集(-或difference)
- 差集就是谁和谁比较,它自己独有的元数如:
- print(set1-set2)
- 结果显示:{1,2,3}因为45和set2一样,只有123在SET2是没有的。
- 如果print(set2-set1) 则显示set2独有的{6,7,8}
- 子集和超集:谁包含 了谁,谁就是超集,谁在谁的里面谁就是子集
- set1 = {1,2,3}
- set2 = {1,2,3,4,5,6}
- print(set1<set2)
- 结果显示true set1小于set2 ,set1是set2的子集
- print(set2>set1)
- 结果显示true set2包含了set1,set2是set1的超集。
- 列表的去重操作如下:
list1 = [1,1,1,3,5,6,8,8,9]
set1 = set(list1) #把列表转成集合,得到去重列表的元素放到集合set1里
print(set1)
list1= list(set1)#再把集合转成列表,就得到去重的列表了。
总结
- id is == 三个方法要会用,知道是做什么的
- 回答的时候一定要分清楚: 同一个代码块下适用一个缓存机制。不同一个代码块下,使用另外一套机制(小数据池),缓存机制目的是提升性能,节省内存。
- 小数据池:数字的范围是-5~256
- 集合:列表去重、关系测试。
- 深浅COPY,理解。
'''
@Project :02python test
@File :01文件读取操作.py
@IDE :PyCharm
@Author :gxlb120
@Date :2020/12/19 12:26
'''
f = open("name_write", "a") # f=open("文件名",参数不写默认为R只读,W为写入)打开文件. W会删除旧的,重新更新, A 为追加
f.write("gxlb150\n") # 往文件里写入内容
# 如果为f.read()为读操作,读写不能同时存在会报错。
f.write("gxlb110\n")
f.write("djxhc888\n")
f.write("djxhc150\n")
f.write("djxhc120\n")
f.close() # 保存并并闭
# 文件打开模式(文本模式)
# r :只读模式;
# w :创建模式,若文件已存在,则覆盖旧文件和内容
# a : 追加模式,新数据会写到文件末尾。
# print(f.read()):读出文件所有内容
# print( f.readline() )读一行
# 在打开一个文件,为A追加模式时,也只能f.write(),而不能有写又有读f.read(),会报错。
``'''
@Project :02python test
@File :02循环文件.py
@IDE :PyCharm
@Author :gxlb120
@Date :2020/12/19 14:28
'''
f = open("name_write")
for line1 in f:
line1 = line1.split()#把读出的内容转为列表
# print(line1)
height =int(line1[1])#把列表的第二个元素转为整形,赋值给身高变量。
weight = int(line1[2])
if height <= 170 and weight <= 80:
print(line1)
# print(f.readlines()) 把所有内容一行读出显示
DAY4 进制操作文本
f = open(“name_list”,encoding=gbk) #这里指字文件的编码模式是GBK,
如果不指定,解释器默认是使用utf-8来解释,然后这个文档的编码却是
GBK的,这样会报错。
*如何处理图片、视频文件呢?
可以用二进制模式打开文件:
- rb: 二进制只读模式
- wb: 二进制创建模式,若文件已存在,则覆盖旧文件
- ab:二进制追加模式,新数据会写到文件末尾
- 这样读出来的数据,就是bytes字节类型了,当然写进去的也是字节类型
f = open("201811.jpg",‘rb’)#表示以二进制字节模式打开这张图片
例2:写入二进制内容
f = open("wb_file","wb")# 创建二进制文件名为we_file
s = 'dyne110' # 定义一个变量S,为str类型
f.write(s.encode("utf-8"))#告诉解释器软件,使用UTF-8编码把2017写到文件里。decode为解码。
day4-8 跳到任意位置修改文件
f = open("name_list") #默认打开文件读
f.seek(6) #.seek为移动光标位置,是按字节来移动,如果是GBK编码一个汉字两个字节,如果是utf-8一个汉字就三个字节,所以6表示移动光标两个汉字后位置停留。
print(f.readline())#打印光标所在位置一行内容
程序:判断用户登录,密码输入三次出错,锁定账号
ccounts ={} #定义一个空字典,用于存文件里的内容,方便查询
f = open("accounts.db","r")#打开文件
for i in f:
i = i.strip().split(",")
accounts[i[0]] = i
print(accounts)
while True:
user = input("username:").strip()
if user not in accounts:#判断用户是否在数据文件里,不在则提示要注册
print("该用户未注册。。。")
continue
count = 0 #初始变量值为0,用于计数登录次数
while count < 3:#控制密码输入三次出错就锁定
passwd = input("passwd:").strip()
#去账号字典里判断密码对不对
if passwd == accounts[user][1]:
print(f"welcome {user} ...登录成功。")
exit("bye...") #登录成功退出
else:
print("密码不对,请重新输入")
count += 1
if count ==3:
print(f"输入错了{count} 次密码,账号{user}被锁定")
accounts[user][2] = "1" #把锁定状态标识改成1,0为未锁定,1为锁定
f2 = open("accounts.db","w")#再次打开文件,写的模式
for user,val in accounts.items():
i = ",".join(val) + "\n" # 把列表转成字符串
f2.write(i)
f2.close()
exit("程序退出。。。")