Python day2
标签: python
[TOC]
1.列表、元组操作
1)列表的基本使用
列表是我们最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作
names = ["zhangsan","lisi","wangwu","taoliu","qiqi","jiujiu"]
print(names[0:-1:2]) #从0到-1,隔2个字符打印1次
print(names[::2]) #0到-1,可以省略
names = ["zhangsan","lisi","wangwu","taoliu"]
#1)查
##方法一:
print(names[1:3]) #从左往右 0 1 2 3…
print(names[3])
print(names[-3:-1]) #从右往左 0 -3 -2 -1
print(names[-3:])
print(names[-1:])
#1:3 1-3 不包括3
#-3: 冒号前面、后面的“0 和 - 1”都可以省略
#输出结果:
['lisi', 'wangwu']
taoliu
['lisi', 'wangwu']
['lisi', 'wangwu', 'taoliu']
['taoliu']
方法二:
print(names.index("lisi")) #查找字符串的下标位置
print(names[names.index("lisi")])
#输出结果:
1
lisi
#2)增
names.append("qiqi") #末尾追加字符串
print(names)
names.insert(1,"emmm") #插入字符串到下标为“ 1 ”的字符串前
print(names)
#输出结果:
['zhangsan', 'lisi', 'wangwu', 'taoliu', 'qiqi']
['zhangsan', 'emmm', 'lisi', 'wangwu', 'taoliu', 'qiqi']
#3)修改(替换)
names[2] = "xiedi"
print(names)
#输出结果:
['zhangsan', 'lisi', 'xiedi', 'taoliu']
#4)删除
print(names)
names.remove("lisi") #删除指定的字符串
print(names)
del names[1] #删除指定下标的字符串,也可以删除变量
print(names)
names.pop(1) #删除指定下标的字符串,如果没有指定则是删除最后一个
print(names)
#输出结果:
['zhangsan', 'lisi', 'wangwu', 'taoliu']
['zhangsan', 'wangwu', 'taoliu']
['zhangsan', 'taoliu']
['zhangsan']
#5)统计字符串有几个(数量)
print(names)
print(names.count("lisi")) #统计列表中字符串“lisi”的数量
输出结果:
['zhangsan', 'lisi', 'wangwu', 'taoliu', 'lisi']
2
#6)反转、排序、扩展:
names = ["zhangsan","lisi","wangwu","taoliu","lisi"]
print(names)
names.reverse() #反转:字符串顺序反转
print(names)
names2 = ["*a","As","9c","iu"]
names2.sort() #排序:特殊字符>数字>大写字母>小写字母
print(names2)
names.extend(names2) #扩展:把变量name2合并到names后
print(names)
#输出结果:
['zhangsan', 'lisi', 'wangwu', 'taoliu', 'lisi']
['lisi', 'taoliu', 'wangwu', 'lisi', 'zhangsan']
['*a', '9c', 'As', 'iu']
['lisi', 'taoliu', 'wangwu', 'lisi', 'zhangsan', '*a', '9c', 'As', 'iu']
#7)复制:
#浅copy:names2把names变量第一层列表复制了一份,修改一个另一个不会变;
#二层列表不会被copy,浅copy只是copy一个内存地址,地址还是指向原变量。等于是一个软连接,修改一个另一个也会改变。
names = ["zhangsan","lisi",["emm","haha"],"wangwu","taoliu","lisi"]
names2 = names.copy()
print(names)
print(names2)
names[1] = "李四"
names[2][0] = "yurisa"
print(names)
print(names2)
#输出结果:
['zhangsan', 'lisi', ['emm', 'haha'], 'wangwu', 'taoliu', 'lisi']
['zhangsan', 'lisi', ['emm', 'haha'], 'wangwu', 'taoliu', 'lisi']
['zhangsan', '李四', ['yurisa', 'haha'], 'wangwu', 'taoliu', 'lisi']
['zhangsan', 'lisi', ['yurisa', 'haha'], 'wangwu', 'taoliu', 'lisi']
##其他浅copy方法:
person = ["len",["nuan"],68]
import copy
print(person)
p1=copy.copy(person)
p2=person[:]
p3=list(person)
print(p1)
print(p2)
print(p3)
#输出结果:
['len', ['nuan'], 68]
['len', ['nuan'], 68]
['len', ['nuan'], 68]
['len', ['nuan'], 68]
#深copy:
names = ["zhangsan","lisi",["emm","haha"],"wangwu","taoliu","lisi"]
import copy
names2 = copy.deepcopy(names) #把所有层的列表完全复制
print(names)
print(names2)
names[1] = "李四"
names[2][0] = "yurisa"
print(names)
print(names2)
#输出结果:修改names,names2没有任何变化
['zhangsan', 'lisi', ['emm', 'haha'], 'wangwu', 'taoliu', 'lisi']
['zhangsan', 'lisi', ['emm', 'haha'], 'wangwu', 'taoliu', 'lisi']
['zhangsan', '李四', ['yurisa', 'haha'], 'wangwu', 'taoliu', 'lisi']
['zhangsan', 'lisi', ['emm', 'haha'], 'wangwu', 'taoliu', 'lisi']
2)元组
1.什么是元组?
元组其实跟列表差不多,也是存一组数,只不过它创建后就不能修改了。又叫只读列表。
元组和列表写法的区别:
元组|names = ("zhangsan","lisi","wangwu")
---|---
列表|names = ["zhangsan","lisi","wangwu"]
- 元组的应用场景
- 写程序时,一些不能被改变的值,可以使用元组
- 同时也可以提醒别人这是不能修改的值
购物车程序练习
需求:
1.启动程序后,让用户输入工资,然后打印商品列表
2.允许用户根据商品编号购买商品
3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
4.可是谁是退出,退出是,打印已购买商品和余额
#Author:byh
product_list = [ #商品列表
("Iphone",5800),
("Mac Pro",9800),
("Bike",700),
("Watch",10060),
("Coffee",31),
("Alex Python",120),
]
salary = input("input your salary:") #输入工资
shopping_list = [] #购物车列表
if salary.isdigit(): #判断工资是不是数字
salary = int(salary) #如果是数字转换为int类型
while True: #进入死循环
for index,item in enumerate(product_list):
print(index,item) #循环打印商品列表,取出下标做商品序号
user_choice = input("choose buy?>>:") #用户选择要买的商品序号
if user_choice.isdigit(): #输入的是不是数字
user_choice = int(user_choice) #如果是数字转换为int类型
if user_choice < len(product_list) and user_choice >=0: #判断商品编号是否存在,len()判断列表长度,会返回一个数字
p_item = product_list[user_choice] #通过下标取出用户选中商品
if p_item[1] <= salary: #对比商品价格工资,买不买得起
shopping_list.append(p_item) #商品添加到一个购物车列表里
salary -= p_item[1] #扣钱,工资减商品价格
print("Added %s in to shopping cart,"
"your current balance is \033[1;31m%s\033[0m" %(p_item,salary)) #显示余额
else:
print("\033[1;41m你的余额只剩[%s]啦,再买你的肾没了\033[0m" % salary) #买不起
else:
print("product code [%s] is not exist!" % user_choice) #输入超过列表长度(商品编号),商品序号不存在
elif user_choice == 'q': #输入q退出
print("--------- shopping list ---------") #打印购物车列表
for p in shopping_list: #如果不使用for循环,直接打印会输出在同一行
print(p)
print("你的余额:",salary) #显示余额,退出
exit()
else:
print('invalid option') #用户输入的不是数字报错
else:
print("\033[4;31m请输入正确的工资数\033[0m")
2.字符串的使用
#Author:byh
name = "my \tname is hui"
print(name.capitalize()) #首字母大写
print(name.count("i")) #统计字符
print(name.center(50,"-")) #一共打印50个字母,如果不够用 - 在前后补上
print(name.endswith("i")) #判断字符串,以什么结尾
print(name.expandtabs(tabsize=30)) #可以把tab转换成多少个空格
print(name.find("name")) #查找字符放回索引,索引是搜索的字符是第几个
print(name[name.find("name"):8]) #打印列表位置4-8的字符
print("alex li".find("l")) #从左边开始查找“alex li”,找到最左边的值
print("alex li".rfind("l")) #从左边开始查找“alex li”,找到最右边的值
name = "my \tname is {name}, and i am {year} years old"
print(name.format(name='hui',year='22'))
print(name.format_map({'name':'hui','year':'22'}))
print('ab23'.isalnum()) #判断是否只包含小数和字母
print('aAF'.isalpha()) #判断是否是纯英文字符
print('12'.isdecimal()) #判断是否是十进制数字
print('12'.isdigit()) #判断是不是一个整数
print('name'.isidentifier()) #判断是不是一个合法的标识符(变量名)
print('+'.join(['1','2','3'])) #把列表合并成字符串
print(name.ljust(50,'-')) #一共打印50个字母,如果不够用 - 在后面补上
print(name.rjust(50,'-')) #一共打印50个字母,如果不够用 - 在前面补上
print('Jack'.lower()) #大写变小写
print('Jack'.upper()) #小写变大写
print(' Jack\n'.strip()) #去除左边和右边的空格和回车
p = str.maketrans("abcdef","123456") #前面的"abcdef"对应"123456"
print("abcdefg".translate(p)) #匹配到对应字符串会转换
print("jack chen".replace('c','z',1)) #字符串替换
print("jack chen em".split()) #把字符串分成列表,默认使用空格做分隔符
print("1+2+3+4+5".split("+")) #可以指定分隔符
print("1+2\n3+4+5".splitlines()) #使用换行符做分隔符
print("Jack Chen".swapcase()) #字符串大小写转换
print("jack chen".title()) #字符串首字母大写
3.字典
1)字典的基本用法:增删改查
#语法 key-value 格式key:value
#特性:字典是无序的,key必须是唯一的
info = {
'stu01':"ying",
'stu02':"jack",
'stu03':"hui",
}
#查找
print(info)
print(info.get("stu04")) #查找key对应的value
print(info["stu01"]) #打印key对应的value
print("stu03" in info) #判断key是否存在,返回True或False
#输出结果:
{'stu01': 'ying', 'stu02': 'jack', 'stu03': 'hui'}
None
ying
True
#修改和增加
print(info)
info['stu02'] ="Jack Chen" #如果key存在就是修改它,如果不存在就是创建它
print(info)
info['stu04'] ="Zidan Zhen"
print(info)
#输出结果
{'stu01': 'ying', 'stu02': 'jack', 'stu03': 'hui'}
{'stu01': 'ying', 'stu02': 'Jack Chen', 'stu03': 'hui'}
{'stu01': 'ying', 'stu02': 'Jack Chen', 'stu03': 'hui', 'stu04': 'Zidan Zhen'}
#删除
print(info)
info.pop("stu03") #删除指定的的key
del info['stu02']
print(info)
#输出结果:
{'stu01': 'ying', 'stu02': 'Jack Chen', 'stu03': 'hui', 'stu04': 'Zidan Zhen'}
{'stu01': 'ying', 'stu04': 'Zidan Zhen'}
2)字典的其他用法
info = {
'stu01':"ying",
'stu02':"jack",
'stu03':"hui",
}
b = {
'stu011':"1",
'stu021':"2",
'stu031':"3",
}
print(info.keys()) #打印所有的key
print(info.values()) #打印所有的value
#输出结果:
dict_keys(['stu01', 'stu02', 'stu03'])
dict_values(['ying', 'jack', 'hui'])
info.setdefault("stu01","emm") #先到info取stu01,取到返回。取不到创建新的。
print(info)
info.setdefault("stu011","emm")
print(info)
#输出结果:
{'stu01': 'ying', 'stu02': 'jack', 'stu03': 'hui'}
{'stu01': 'ying', 'stu02': 'jack', 'stu03': 'hui', 'stu11': 'emm'}
print(info)
info.update(b) #把两个字典合并,已存在的key替换value,不存在的key创建
print(info)
print(info.items()) #把字典转成列表
#输出结果:
{'stu01': 'ying', 'stu02': 'jack', 'stu03': 'hui'}
{'stu01': 'ying', 'stu02': 'jack', 'stu03': 'hui', 'stu011': '1', 'stu021': '2', 'stu031': '3'}
dict_items([('stu01', 'ying'), ('stu02', 'jack'), ('stu03', 'hui'), ('stu011', '1'), ('stu021', '2'), ('stu031', '3')])
#创建一个新的初始化字典
c = dict.fromkeys([6,7,8],"test")
print(c)
c[8] = "zeze"
print(c)
#坑点:创建多层初始化字典,是一个内存地址,修改起一个其他全部变
c = dict.fromkeys([6,7,8],[1,{"name":"jack"},444])
print(c)
c[8][1]["name"] = "haha"
print(c)
#输出结果:
{6: 'test', 7: 'test', 8: 'test'}
{6: 'test', 7: 'test', 8: 'zeze'}
-------------------------------------
{6: [1, {'name': 'jack'}, 444], 7: [1, {'name': 'jack'}, 444], 8: [1, {'name': 'jack'}, 444]}
{6: [1, {'name': 'haha'}, 444], 7: [1, {'name': 'haha'}, 444], 8: [1, {'name': 'haha'}, 444]}
#循环dict
for i in info:
print(i)
for i in info:
print(i, info[i])
#输出结果:
stu01
stu02
stu03
stu01 ying
stu02 jack
stu03 hui
3)多级字典嵌套及操作
#key最好不要用中文
'''
book_catalog = {
"生活类":{
"运动饮食1:9":["10%靠运动","90%靠饮食"],
"硅谷工程师爸爸的超强思维训练课":["憨爸在美国","工科学霸思维训练法"],
"养脾胃就是养命":["脾胃问题是中国人的健康问题","脾气虚,饭后困倦"]
},
"人文社科":{
"乌合之众":["古斯塔夫勒庞","法国著名社会心理学家"],
"心理暗示力":["一本关于治愈、力量","教育与成功的心理学实践书"]
},
"科技":{
"相对论":["爱因斯坦上帝式的思维方式永远都是迷人的","开启全新宇宙观的巨著永远都能满足人类对宇宙的好奇心"],
"图解时间简史":["简单有趣","人人都可以读懂的霍金"]
}
}
book_catalog["生活类"]["运动饮食1:9"][1] += " ,前面10%更重要"
print(book_catalog["生活类"]["运动饮食1:9"])
#输出结果:
['10%靠运动', '90%靠饮食 ,前面10%更重要']
Process finished with exit code 0
4.集合操作
- 集合是一个无需的,不重复的数据组合,它的主要作用如下:
- 去重,把一个列表变成集合,就自动去除重复了
- 关系测试,测试来那个组数据之前的交集、差集、并集等关系
__author__ = "byh"
list_1 = [1,6,8,2,3,4,1,11,11]
list_1 = set(list_1) #集合再赋值
list_2 = set([0,5,12,13,11])
print(list_1,type(list_1)) #集合是无序的
print(list_1,list_2)
print(list_1 & list_2) #交集
print(list_1.intersection(list_2)) #交集:取出两个list中相同的数据
print(list_1 | list_2) #并集
print(list_1.union(list_2)) #并集:合并两个list的数据
#输出结果:
{1, 2, 3, 4, 6, 8, 11} <class 'set'>
{1, 2, 3, 4, 6, 8, 11} {0, 5, 11, 12, 13}
{11}
{11}
{0, 1, 2, 3, 4, 5, 6, 8, 11, 12, 13}
{0, 1, 2, 3, 4, 5, 6, 8, 11, 12, 13}
print(list_2 - list_1) #差集
print(list_1.difference(list_2)) #差集:取出我有的你没有的数据
print(list_2.difference(list_1))
#输出结果:
{0, 13, 12, 5}
{1, 2, 3, 4, 6, 8}
{0, 13, 12, 5}
print(list_1 ^ list_2) #对称差集
print(list_1.symmetric_difference(list_2)) #对称差集:把我有你没有,你有我没有的数据取出来放一起
#输出结果:
{0, 1, 2, 3, 4, 5, 6, 8, 12, 13}
{0, 1, 2, 3, 4, 5, 6, 8, 12, 13}
list_3 = set([1,2,3])
print(list_3 <= list_1) #子集
print(list_3.issubset(list_1)) #子集,list_3的数据,list_1里面都有
print(list_1 >= list_3) #父集
print(list_1.issuperset(list_3)) #父集,list_1的数据包括list_3
#输出结果:
True
True
True
True
list_4 = set([0,4,5])
print(list_3.isdisjoint(list_4)) #关系测试:测试有没有交集,没有True/有False
#输出结果:
True
#基本操作:
print(list_1)
list_1.add("emm") #添加一项数据
list_1.update(["haha","ge","ze"]) #添加多项数据
print(list_1)
list_1.remove("ge") #删除指定一项数据
print(list_1)
print(list_1.pop()) #任意删除一项数据
print(list_1)
print(list_1.discard("ze")) #删除指定的一项数据,数据不存在不会报错
print(list_1)
print(list_1.discard("dd"))
print(list_1)
print(len(list_1)) #打印长度
#输出结果:
{1, 2, 3, 4, 6, 8, 11}
{1, 2, 3, 4, 'emm', 6, 8, 'ze', 11, 'haha', 'ge'}
{1, 2, 3, 4, 'emm', 6, 8, 'ze', 11, 'haha'}
1
{2, 3, 4, 'emm', 6, 8, 'ze', 11, 'haha'}
None
{2, 3, 4, 'emm', 6, 8, 11, 'haha'}
None
{2, 3, 4, 'emm', 6, 8, 11, 'haha'}
10
a = [1,2,3]
b = [4,5,6]
print(1 in a) #判断 1 是否 a的成员
print(1 in b) #判断 1 是否 b的成员
#输出结果:
True
False
5.文件操作
对文件的操作流程:
○ 打开文件,得到文件句柄并赋值给一个变量
○ 通过句柄对文件进行操作
○ 关闭文件
打开文件的模式有:
○ r,只读模式(默认)。
○ w,只写模式。【不可读;不存在则创建;存在则删除内容;】
○ a,追加模式。【不可读;不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
○ r+,可读写文件。【可读;可写;可追加】
○ w+,写读
○ a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
○ rU
○ r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
○ rb,二进制文件读取
○ wb,以人进制编码的方式写入字符
○ ab
__author__ = "byh"
#文件只读模式
f = open("yesterday2","r",encoding="utf-8") #文件句柄(文件内存对象:文件名、文件大小、字符集、硬盘起始位置)
data = f.read() #打开文件时从头开始读,读到哪,“光标”在哪。
print(data)
f.close() #关闭文件
#查看1-5行
f = open("yesterday2","r",encoding="utf-8")
for i in range(5):
print(f.readline())
f.close()
#文件只写模式
f = open("yesterday2","w",encoding="utf-8")
f.write("emm")
f.close()
#文件追加模式
f = open("yesterday2","a",encoding="utf-8")
f.write("\n1\n")
f.write("2\n")
f.write("3")
f.close()
#查看文件内容,在line 9打印---em
f = open("yesterday2","r",encoding="utf-8")
#print(f.readlines()) #以列表的方式打印,只适合读小文件
for index,line in enumerate(f.readlines()):
if index == 9:
print('---em')
continue
print(line.strip())
f.close()
#查看文件内容,在line 9打印---------
f = open("yesterday2","r",encoding="utf-8")
#print(f.readline()) #打印一行
count = 0
for line in f:
# print(line) #效率最高
if count == 9:
print("---------")
count += 1
continue
print(line)
count += 1
f.close()
f = open("yesterday2","r",encoding="utf-8")
print(f.tell()) #打印“ 光标 ”当前位置(字符个数)
f.seek(0) #“ 光标 ”回到哪个地方
print(f.encoding) #打印文件编码格式
print(f.fileno()) #系统IO文件接口编号
print(f.flush()) #强制刷新,在文件打开的强制写入到硬盘
f.close()
f = open("yesterday2","r+",encoding="utf-8") #读写,内容追加到最后
f = open("yesterday2","rb") #二进制文件读取
print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
f.close()
f = open("yesterday2","wb") #二进制文件写入
f.write("emmmmmm\n".encode()) #以二进制编码的方式写入字符
f.close()
f = open("yesterday2", "r", encoding="utf-8")
f_new = open("yesterday2.bak", "w", encoding="utf-8")
for line in f:
if "haha" in line:
line = line.replace("haha", "em")
f_new.write(line)
f.close()
f_new.close()
#with:自动关闭文件,同时打开多个文件
with open ("yesterday","r",encoding="utf-8") as f , \
open("yesterday2","r",encoding="utf-8") as f2:
for i in f:
print(i)
for ii in f2:
print(ii)
#进度条,flush的作用
__author__ = "byh"
import sys,time
for i in range(20):
sys.stdout.write("#") #标准输出
sys.stdout.flush()
time.sleep(0.1)
6.文件编码
1)bytes数据类型
- python数据类型
- bytes(计算机识别的16进制)
- string(人识别的字符串)
bytes和string之间的相互转换
msg = "北京下雪天"
print(msg)
print(msg.encode(encoding="utf-8"))
print(msg.encode(encoding="utf-8").decode(encoding="utf-8"))
输出结果:
北京下雪天
b'\xe5\x8c\x97\xe4\xba\xac\xe4\xb8\x8b\xe9\x9b\xaa\xe5\xa4\xa9'
北京下雪天
Process finished with exit code 0
2)GBK转换为UTF-8格式:
1、首先通过编码【decode】转换为Unicode编码、string类型;
2、然偶后通过解码【encode】转换为UTF-8的编码、bytes类型;
#-*-coding:gbk -*- #声明、修改文件编码
__author__ = "byh"
import sys
print(sys.getdefaultencoding()) #查看默认编码
s = "你好" #python字符串编码默认是unicode
print(s.encode("gbk")) #默认unicode,直接使用encode解码,转换为gbk
print(s.encode("utf-8")) #解码转换为utf-8
print(s.encode("gb2312").decode("gb2312"))