Step2 - Python基础2 列表、字典、集合
一、sys模块
导入模块使用import命令
命令1:sys.path
1 import sys 2 print(sys.path)
打印出的路径为Python寻找模块路径,即你要导入的模块必须存在于以下路径中:
'D:\\Python实战\\Day2'
'D:\\Python实战'
'C:\\ProgramData\\Anaconda3\\python36.zip'
'C:\\ProgramData\\Anaconda3\\DLLs'
'C:\\ProgramData\\Anaconda3\\lib', 'C:\\ProgramData\\Anaconda3'
'C:\\ProgramData\\Anaconda3\\lib\\site-packages'
'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\Sphinx-1.5.6-py3.6.egg'
'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\win32'
'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\win32\\lib'
'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\Pythonwin'
'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\setuptools-27.2.0-py3.6.egg'
如若不存在,则提示模块未找到,若存在,则直接加载模块
默认先从当前目录下找,找不到再去全局变量中找
Python标准库一般都会存在于'C:\\ProgramData\\Anaconda3\\lib\\site-packages'中
命令2:sys.argv
1 import sys 2 print(sys.argv) #打印当前脚本的绝对路径
在PyCharm中打印的是绝对路径,在cmd中打印相对路径
注:绝对路径为从盘符开始的路径,如C:\windows\system32\cmd.exe
相对路径为从当前路径开始的路径
二、os模块
os模块就是和操作系统进行交互的模块
命令1:os.system
1 import os 2 os.system("dir") #显示当前磁盘目录下的所有文件
接下来尝试将该命令返回的结果存入一个变量中
1 import os 2 cmd_res = os.system("dir") #显示当前磁盘目录下的所有文件 3 print("-->",cmd_res)
得到的结果为:

打印出的结果为0
其原因为os.system命令直接输出到屏幕上,直执行命令,不保存结果,无法存入变量中,结果0为该命令执行成功与否的状态码,0表示执行成功,非0值表示执行失败
命令2:os.popen
1 cmd_res = os.popen("dir") #显示当前磁盘目录下的所有文件,执行命令且保存结果 2 print("-->",cmd_res)
但是得到的结果为

是一个内存地址,如果想要读取结果,需再加一行代码
1 cmd_res = os.popen("dir").read() 2 print("-->",cmd_res)
得到的结果为

可见,不仅读取了结果,乱码也没有了
加read()命令是因为,os.popen命令将结果存入了内存中,需要read()命令进行调取
命令3:os.mkdir
在当前目录下创建新目录
1 os.mkdir("new!") #在当前目录下创建新目录
三、数据类型
1. 数字
int(整型)
在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647
在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807
long(长整型)
跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。
注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。
float(浮点型)
浮点数用来处理实数,即带有小数的数字。类似于C语言中的double类型,占8个字节(64位),其中52位表示底,11位表示指数,剩下的一位表示符号。
complex(复数)
复数由实数部分和虚数部分组成,一般形式为x+yj,其中的x是复数的实数部分,y是复数的虚数部分,这里的x和y都是实数。
注:Python中存在小数字池:-5 ~ 257
2、布尔值
真或假
1 或 0
"hello world"
万恶的字符串拼接:python中的字符串在C语言中体现为是一个字符数组,每次创建字符串时候需要在内存中开辟一块连续的空,并且一旦需要修改字符串的话,就需要再次开辟空间,万恶的+号每出现一次就会在内从中重新开辟一块空间。
字符串格式化输出
1 name = "Nick" 2 print("I am %s" % name) 3 #输出I am Nick
PS: 字符串是 %s;整数 %d;浮点数%f
字符串常用功能:
-
移除空白
-
分割
-
长度
-
索引
-
切片
四、列表、元组操作
定义列表,并访问列表中的元素
1 names = ['Nick','Peggy','Samantha'] 2 print(names) 3 print(names[0]) #下标从0开始计数 4 print(names[1]) 5 print(names[2]) 6 print(names[-1]) #也可以倒着取值 7 print(names[-2])
切片:取多个元素
1 names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] 2 names[1:4] #取下标1至下标4之间的数字,包括1,不包括4 3 ['Tenglan', 'Eric', 'Rain'] 4 names[1:-1] #取下标1至-1的值,不包括-1 5 ['Tenglan', 'Eric', 'Rain', 'Tom'] 6 names[0:3] 7 ['Alex', 'Tenglan', 'Eric'] 8 names[:3] #如果是从头开始取,0可以忽略,跟上句效果一样 9 ['Alex', 'Tenglan', 'Eric'] 10 names[3:] #如果想取最后一个,必须不能写-1,只能这么写 11 ['Rain', 'Tom', 'Amy'] 12 names[3:-1] #这样-1就不会被包含了 13 ['Rain', 'Tom'] 14 names[0::2] #后面的2是代表,每隔一个元素,就取一个 15 ['Alex', 'Eric', 'Tom'] 16 names[::2] #和上句效果一样 17 ['Alex', 'Eric', 'Tom']
追加:
1 names = ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy'] 2 names.append('我是新来的') 3 print(names) 4 -->['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
插入:
1 names = ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy'] 2 names.insert(3,'插到Rain前面') 3 print(names) 4 -->['Alex', 'Tenglan', 'Eric', '插到Rain前面', 'Rain', 'Tom', 'Amy']
修改:
1 names['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的'] 2 names[2] = "该换人了" 3 names 4 -->['Alex', 'Tenglan', '该换人了', 'Rain', 'Tom', 'Amy', '我是新来的']
删除:
1 names = ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy'] 2 print(names) 3 -->['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy'] 4 names.remove("Alex") #直接指定元素删除 5 print(names) 6 -->['Tenglan', 'Eric', 'Rain', 'Tom', 'Amy'] 7 del names[3] #通过下标删除 8 print(names) 9 -->['Tenglan', 'Eric', 'Rain', 'Amy'] 10 names.pop() #默认删除最后一个元素,输入下标即删除指定下标元素 11 print(names) 12 -->['Tenglan', 'Eric', 'Rain']
扩展:
1 a = [1,2,3,4] 2 b = [33,45,2] 3 a.extend(b) 4 print(a) 5 -->[1, 2, 3, 4, 33, 45, 2]
获取下标:
1 names = ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy'] 2 print(names) 3 print(names.index("Eric")) #只返回找到的第一个下标
统计:
1 names = ['Alex', 'Amy','Tenglan', 'Eric', 'Rain', 'Tom', 'Amy'] 2 print(names.count('Amy'))
拷贝:
1 >>> names['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3] 2 >>> name_copy = names.copy() 3 >>> name_copy['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
注意,copy命令是浅copy,第一层元素独立拷贝,如果列表中还有子列表,则拷贝的是该子列表的内存地址,所以在原列表中修改子列表的元素,拷贝的列表的子列表元素也会相应变化
要想完整copy需引用copy模块使用copy.deepcopy命令
程序练习:购物车程序
要求:
1. 启动程序后,让用户输入工资,然后打印商品列表
2. 允许用户根据商品编号购买商品
3. 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
4. 可随时退出,退出时,打印已购买商品和余额
代码:
1 goods_list = [["towel",20],["tissue",10],["food",25],["water",5]] 2 salary = int(input("Please input your salary:")) #输入工资,强制转换格式为整型 3 balance = salary 4 cart = [] 5 for i in range(1,5): 6 print("item %d :" % i,goods_list[i-1][0]," ","price:",goods_list[i-1][1]) #打印商品编号及价格 7 while True: 8 x = int(input("Please type item number:")) #输入想要购买的商品编号 9 if balance >= goods_list[x-1][1]: #判断余额是否大于商品价格 10 balance = balance - goods_list[x-1][1] 11 print("balance:",balance) 12 cart.append(goods_list[x-1][0]) #将购买的商品名称插入到cart列表中 13 else: 14 print("Insufficient balance!") #若余额不足,则提醒 15 continue_res = input("Do you want to buy more item? Y/N:") 16 if continue_res == "N": #判断是否继续购物 17 break 18 print(cart,"\n","balance:",balance) #打印商品购买清单和余额
优化后代码:
1 goods_list = [["towel",20],["tissue",10],["food",25],["water",5]] 2 salary = int(input("Please input your salary:")) #输入工资,强制转换格式为整型 3 balance = salary 4 cart = [] 5 while True: 6 for index,item in enumerate(goods_list): 7 print(index,item) #打印商品编号及价格 8 x = int(input("Please type item number:")) #输入想要购买的商品编号 9 if balance >= goods_list[x][1]: #判断余额是否大于商品价格 10 balance = balance - goods_list[x][1] 11 print("\033[31;1mbalance\033[0m:",balance) #\033[31;1m%s\033[0m 高亮显示31表示红色,32表示绿色 12 cart.append(goods_list[x][0]) #将购买的商品名称插入到cart列表中 13 else: 14 print("Insufficient balance!") #若余额不足,则提醒 15 continue_res = input("Do you want to buy more item? Y/N:") 16 if continue_res == "N": #判断是否继续购物 17 break 18 print(cart,"\n","\033[32;1mbalance\033[0m:",balance) #打印商品购买清单和余额
视频教程代码太过繁琐,现在先不考虑这些
五、字符串操作
1 name.capitalize() #首字母大写 2 name.casefold() #大写全部变小写 3 name.center(50,"-") #输出 '---------------------Alex Li----------------------' 4 name.count('lex') #统计 lex出现次数 5 name.encode() #将字符串编码成bytes格式 6 name.endswith("Li") #判断字符串是否以 Li结尾 7 "Alex\tLi".expandtabs(10) #输出'Alex Li', 将\t转换成多长的空格 8 name.find('A') #查找A,找到返回其索引, 找不到返回-1 9 10 format : 11 >>> msg = "my name is {}, and age is {}" 12 >>> msg.format("alex",22) 13 'my name is alex, and age is 22' 14 >>> msg = "my name is {1}, and age is {0}" 15 >>> msg.format("alex",22) 16 'my name is 22, and age is alex' 17 >>> msg = "my name is {name}, and age is {age}" 18 >>> msg.format(age=22,name="ale") 19 'my name is ale, and age is 22' 20 format_map 21 >>> msg.format_map({'name':'alex','age':22}) 22 'my name is alex, and age is 22' 23 24 25 msg.index('a') #返回a所在字符串的索引 26 '9aA'.isalnum() True 27 28 '9'.isdigit() #是否整数 29 name.isnumeric #是否为数字 30 name.isprintable #是否能打印,对于字符串不存在此问题 31 name.isspace #是否为空格 32 name.istitle #是否单词首字母均为大写 33 name.isupper #是否全大写 34 "|".join(['alex','jack','rain']) #可以将列表变为字符串 35 'alex|jack|rain' 36 37 38 maketrans 39 >>> intab = "aeiou" #This is the string having actual characters. 40 >>> outtab = "12345" #This is the string having corresponding mapping character 41 >>> trantab = str.maketrans(intab, outtab) 42 >>> 43 >>> str = "this is string example....wow!!!" 44 >>> str.translate(trantab) 45 'th3s 3s str3ng 2x1mpl2....w4w!!!' 46 47 msg.partition('is') #输出 ('my name ', 'is', ' {name}, and age is {age}') 48 49 >>> "alex li, chinese name is lijie".replace("li","LI",1) 50 'alex LI, chinese name is lijie' 51 52 msg.swapcase #大小写互换 53 54 55 >>> msg.zfill(40) 56 '00000my name is {name}, and age is {age}' 57 58 59 60 >>> n4.ljust(40,"-") 61 'Hello 2orld-----------------------------' 62 >>> n4.rjust(40,"-") 63 '-----------------------------Hello 2orld' 64 65 66 >>> b="ddefdsdff_哈哈" 67 >>> b.isidentifier() #检测一段字符串可否被当作标志符,即是否符合变量命名规则 68 True 69 70 .split(" ") #以括号内的内容将字符串分成列表
六、字典操作
字典是一种特殊的key-value数据类型
语法:
1 info = { 2 "stu0001":"Nick", 3 "stu0002":"Peggy", 4 "stu0003":"Daye", 5 "stu0004":"Hange", 6 }
字典的特性:1.字典是无序的;2.key必须唯一
增加修改命令很直接
删除:
>>> info {'stu1102': 'Nick', 'stu1103': 'Peggy', 'stu1101': 'Daye'} >>> info.pop("stu1101") #标准删除 'Daye' >>> info {'stu1102': 'Nick', 'stu1103': 'Peggy'} >>> del info["stu1103"] #换个删除方式 >>> info {'stu1102': 'Nick'} >>> >>> >>> >>> info = {'stu1102': 'Nick', 'stu1103': 'Peggy'} >>> info {'stu1102': 'Nick', 'stu1103': 'Peggy'} #随机删除 >>> info.popitem()
('stu1102', 'Nick') >>> info {'stu1103': 'Peggy'}
查找:
1 info = { 2 "stu0001":"Nick", 3 "stu0002":"Peggy", 4 "stu0003":"Daye", 5 "stu0004":"Hange", 6 } 7 print(info.get("stu0005")) 8 None #存在则返回值,不存在则返回none,更合理 9 10 print("stu0003" in info) #判断是否字典中是否存在 11 True
字典循环:
1 #方法1 2 for key in info: 3 print(key,info[key]) 4 5 #方法2 6 for k,v in info.items(): #会先把dict转成list,数据里大时莫用 7 print(k,v)
程序练习:三级菜单
要求:
1. 打印省、市、县三级菜单
2. 可返回上一级
3. 可随时退出程序
代码:
data = {
"重庆":{
"渝北区":{
"水晶郦城":["一组团","二组团"],
"紫都城":["一单元","二单元"]
},
"江北区":{
"围城国际公寓":["2801","2802"],
"无专厂":["流星花园","锦瑟年华"]
}
},
"北京":{
"海淀区":["北京交通大学","中央民族大学"],
"朝阳区":["蓝色港湾","三里屯"]
},
"香港":{
"九龙":["港科大","坑口"],
"香港岛":["中环","紫荆广场"]
}
}
while True: #建立死循环
for i in data:
print(i) #打印第一级菜单
choice = input("请选择1,或输入任意键退出:")
if choice in data:
while True:
for j in data[choice]:
print("\t", j) #打印第二级菜单
choice2 = input("请选择2,或输入b返回上一级菜单:")
if choice2 in data[choice]:
while True:
for k in data[choice][choice2]:
print("\t\t", k) #打印第三级菜单
choice3 = input("请选择3,或输入b返回上一级菜单:")
if choice3 in data[choice][choice2]:
for z in data[choice][choice2][choice3]:
print("\t\t\t",z) #打印第三级菜单具体内容
print("这是最后一级菜单了,即将返回上一级菜单") #不用break,循环自动返回至上一级菜单
if choice3 == "b":
break #跳出循环,返回第二级菜单
if choice2 == "b":
break #跳出循环,返回第一级菜单
else:
break #结束程序
print("感谢使用小戴版三级菜单")
七、集合操作
集合是一个无序的,不重复的数据组合,作用如下:
1. 去重,将列表变为集合,自动去重
2. 关系测试,测试两组数据之间的交集、差集、并集等关系
常用操作:
1 list_1 = [1,4,5,5,2,3,5] 2 list_1 = set(list_1) 3 list_2 = set([2,5,3,1,2,3,5,6]) 4 print(list_1,list_2) 5 6 print(list_1.intersection(list_2)) 7 print(list_1 & list_2) #交集 8 9 print(list_1.union(list_2)) 10 print(list_1 | list_2) #并集 11 12 print(list_1.difference(list_2)) 13 print(list_1 - list_2) #差集 14 15 print(list_1.symmetric_difference(list_2)) 16 print(list_1 ^ list_2) #对称差集 17 18 list_3 = set([1,4,5]) 19 print(list_3.issubset(list_1)) #判断是否为其子集 20 print(list_1.issuperset(list_3)) #判断是否为其父集 21 22 list_3.remove(4) #删除一项元素,如果该元素不在集合中,报错 23 print(list_3) 24 25 list_3.discard(1) #删除一项元素,如果该元素不在集合中,不作任何处理 26 print(list_3)
八、文件操作
对文件操作流程:
1. 打开文件,得到文件句柄并赋值给一个变量
2. 通过句柄对文件进行操作
3. 关闭文件
基本操作:
1 f = open("yesterday",encoding="utf-8") #得到文件句柄,即文件的内存对象,可以对文件进行操作 2 data = f.read() #读第一遍时从最头开始读 3 data2 = f.read() #读第二遍时从末尾开始读 4 print(data) 5 print("------------data2------------","\n",data2) #data2什么都没有 6 7 f.close()
打开文件的模式有:
r,只读模式(默认)
w,只写模式,不存在则创建文件,存在则覆盖原文件
a,追加模式,可读,不存在则创建文件,存在只能追加内容
“+”表示可以同时读写某文件
r+,可读写模式,只读模式的特性,再加上可写
w+,写读模式,只写模式的特性,再加上可读
a+,同a
小文件读取前N行内容:
1 for index,line in enumerate(f.readlines()): #预先将文件内容一行行转成列表,并读下标和内容 2 print(line.strip()) #去除空格和换行 3 if index ==9: 4 break #读前十行
大文件一行行读,并一行行保存提取:
1 count = 0 2 for line in f: 3 print(line.strip()) 4 count += 1 5 if count == 10: 6 break
其他操作:
read,readline,tell,seek,buffer,flush。truncate
*代码:进度条
import sys,time
for i in range(100):
sys.stdout.write("#") #一个个输出#号
sys.stdout.flush() #刷新内存
time.sleep(0.5) #延迟处理
对文件要进行修改操作,只能将文件内容存进内存中修改
f = open("yesterday","r",encoding="utf-8")
f_new = open("yesterday.bak","w",encoding="utf-8")
for line in f:
if "那么多甜美的曲儿" in line:
line = line.replace("那么多甜美的曲儿","那么少")
f_new.write(line)
f.close()
f_new.close()
浙公网安备 33010602011771号