Python—第2周—module,type,list
一.模块知识
模块又可以叫做库,分为两种,标准库和第三方库。
不用安装直接可以使用的叫标准库,比如sys和os。sys属于解释器自带的库,os在python lib目录下。
需要安装才能使用的的叫第三方库。比如django等等。安装完成后,保存在lib/sit_package下
import sys import os print(sys.path) #打印环境变量 print(sys.argv) #打印相对路径 #os直接调用,不可以保存为变量 os.system("free -m") os.system("vmstat 2 5") #如果要保留打印结果 cmd_res = os.popen("free -m") print(cmd_res) #打印内存的地址 #读内存地址获得结果 cmd_res = os.popen("free -m").read() print(cmd_res) #临时的将结果存入内存,用read读出来 os.argv[2] 传参数####暂时不明白。暂时理解是通过输入参数来调用文件执行不同的结果。
例子:简历一个py文件,里面要求输入用户名和密码
然后再建立一个pyt文件调用即可。使用import login
找模块的时候。首先在木目录里面寻找。
二.pyc 是什么鬼
python是解释性语言。但是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行。会生成pyc文件。c=compiled 编译
python hello.py 启动了python的解释器,但是在运行之前要编译。
pyc是python编译后的结果。
运行时pycodeobject在内存中,结束时将pycodeobject写入pyc文件中。第二次运行时,会找pyc文件。如果找到就直接载入。重复上面过程。pyc就是一种持久化保存的方式。
类似于sql执行?软硬解析?
三.python 数据类型
1.int 整型
在不同的位数机器上有不同的存储范围。在python2中如果超过了int的范围,会自动转换为long整型。python3则没有long这样的区别。就是int。
2.float 浮点型
保存的就是带小数的数字。8个字节,52位表示底,11位表示指数。
比如科学计数法。带小数点的数字
3.布尔值
真或假,1或0
a = 2 or 3 b = 3 or 2 c = [] or 3 d = 2 and {} e = [] and {} f = 2 < 3 g = 3 > 2 print(a,b,c,d,e,f,g) 结果: E:\S14\venv\Scripts\python.exe E:/S14/1-hello/hello 2 3 3 {} [] True True
4.三元运算
对值做判断。那个条件成立就存那个。如果符合就存A。不符合就存B
result = 值1 if 条件 else 值2
a = 123456 b = 987654 h = '' h = a+b if a>b else a-b print(h) 如果a>b 就存入a+b 否则就a-b
5.二进制bytes
在python2中认为与字符串是一个玩意。python2中使用系统默认字符,python不用写UTF-8
bytes 在python3中是二进制数据,不隐形的混用字符串和二进制类型拼接,不能互相操作,也不能函数传参
但是字符串可以编码为二进制,二进制可以解码为字符串。
msg = '我爱北京呸,虚伪' print(msg.encode(encoding='utf-8')) print(msg.encode(encoding='utf-8').decode(encoding='utf-8')) 结果: E:\S14\venv\Scripts\python.exe E:/S14/1-hello/hello b'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\x91\xb8\xef\xbc\x8c\xe8\x99\x9a\xe4\xbc\xaa' 我爱北京呸,虚伪 英文结果却不一样。 msg = 'i love my hometown , changchun ' print(msg.encode(encoding='utf-8')) print(msg.encode(encoding='utf-8').decode(encoding='utf-8')) 结果: E:\S14\venv\Scripts\python.exe E:/S14/1-hello/hello b'i love my hometown , changchun ' i love my hometown , changchun
6.字符串(不可以修改)
格式化输出:字符串%s 整数%d 浮点数%f
关于字符串的操作如下 name = 'dustin' name.capitalize() #首字母大写 name.count() #统计字母的数量。比如统计t有几个 name.center(50,"-") #一共打印50个字符,不够的用-补齐 name.endswith("in") #判断字符串以什么结尾 name.expandtabs(tabsize=30) #当字符串里面有\t 时候。这个可以打印30个空格 name.find('name') #找到字符串 name.find(name[name.find("name"):]) #切片的操作。不写6就截取到最后 name="my name is {name} and my old is {yesr}" name.format(name='dustin',yesr=23) #格式化输出 name.isalnum() #包含阿拉伯数字和字母。 name.isalpha() #纯英文字符 name.isdecimal() #十进制 name.isdigit() #判断是否为整数 name.isidentifier() #判断是否为合法标识符,是否为合法的变量名 name.islower() #是否为小写 name.isnumeric() #是否为一个数字,小数不行 name.isspace() #是否为一个空格 name.istitle() #是否为 name.isupper() #是否为大写 name.join() #将列表转成字符串 name.ljust(50,'*') #保证字符串长度50,不够以*补全 name.rjust(50,'-') #保证从右边开始数,不够以-补全 name.lower() #将大写变成小写 name.upper() # 将小写变大写 name.lstrip() #去掉左边的空格和回车 name.strip() #去掉两边的空格和回车 name.rstrip() #去掉右边的空格和回车 name.maketrans() #将前边的转换为后边的 p = str.maketrans()("abcdef","123456") print("alex li".translate(p)) 结果是1l5x li name.replace('l','L',1) #把一个字符替换成其他,将小l替换成大L,如果不写1就全部替换。 name.rfind('u') #从左边开始寻找,找到最右边的u的下标返回 name.split('u') #以u作为分隔符 name.split('+') #加入是1+2+3+4 可以把数字提取出来 name.swapcase() #大写变小写,小写变大写 name.title() #每个字符首字母大写 name.zfill(50) #不够以0填充,前边补0
7..列表
类似于c语言中的数组。
names = ["张三","李四","王五","赵六"] print(names[0]) print(names[1:3]) #切片操作 print(names[-1]) #不知道列表大小,但是取最后的数据 print(names[-3:-1]) #从右往左边数。要先把-3写前边 print(names[-2:]) #取最后边的值。但是不想-1 print(names[:3]) #前边是0也是可以忽略掉的 names.append("雷7") #追加 names.insert(1,"日八") #将数据插入到指定的地方。1为要插入位置的下标 names[2]='天九' #修改下标2的数据。重新赋值 names.remove("日八") #删除 del names[1] #删除 names.pop() #删除,没有下标,则删除最后一个 print(names) print(names.index("王五")) #返回2就是找到了 print(_names[names.index("王五")]) print(names.count("张三")) #统计有多少个张三 names.clear #清空列表 names.reverse() #反转列表顺序 names.sort() #排序,按照字母顺序排序,升序。 names.extend(names2) #合并列表,names2还是存在的
深COPY和浅COPY
names = ["张三","李四","王五",["天天","向上"],"赵六"] names2 = names.copy() #拷贝一份给names2,内容完全一样,只copy第一层列表。嵌套更改不更改,一个列表是一个内存指针,找的是内存地址 print(names) print(names2) names[2] = "zhangwu" #列表也可以套用列表 names[3][0]="tiantian" print(names) print(names2) #补充 浅copy:拷贝第一个列表,第二个的每一个元素都是引用。 三种浅copy,person=[‘name’,[‘saving’],100] p1=copy.copy(person) p2=person[:] p3=list(person) 可以用浅copy这样的方式做一个人力资源的模板.一对夫妻有一个共同的账号 person=['name',['saving',100]] p1=person[:] p2=person[:] print(p1,p2) p1[0]='huangxiaoming' p2[0]='anjiladbaobei' print(p1,p2) p1[1][1]=50 print(p1,p2)
全部复制
不能使用 names=names2 可以调用 import copy 还有一些copy.deepcopy 深度copy。不要瞎用。一般情况下不需要copy一下。 copy.deepcopy(names) for i in names #列表循环 prints(i); 跳着切片 range(1,10,2) print(names[0:-1:2]) 跳着切片,0和-1都可以省略。效果是一样的 names = ["张三","李四","王五",["天天","向上"],"赵六"] names2 = names.copy() #拷贝一份给names2,内容完全一样,只copy第一层列表。嵌套更改不更改,一个列表是一个内存指针,找的是内存地址 print(names) print(names2) names[2] = "zhangwu" #列表也可以套用列表 names[3][0]="tiantian" print(names) print(names2)
8.元组(tuple)
也可以叫做列表,但是是只读的列表,不能更改,只能查。有两个方法 count和index。标志不是[ ] 而是()
例子:
写一个购物车程序:
1.启动程序后要求用户输入工资,然后打印商品列表
2.允许用户使用商品编号购买商品
3.用户选择商品后,检测余额是否足够,够就直接扣款,不够提醒
4.可以随时退出,推出时打印已经购买商品和余额
5.扣款成功有提醒,输入q打印购物车list
_Good_list=[['Iphone',5999], ['Mac pro',9800], ['bike',800], ['Watch',16000], ['coffe',32], ] shopping_list = [] salary = input("please input your salary:") if salary.isdigit(): #判断工资是不是数字,然后int转换 salary = int(salary) while True: '''for item in _Good_list: #print(item) #这样打印出来后没有编号 print(_Good_list.index(item),item) #可以打印出编号''' for index,item in enumerate(_Good_list): #打印出了一组元组,直接取出下标 print(index,item) user_choice = input("please choice good >>>>:") if user_choice.isdigit(): user_choice = int(user_choice) if user_choice < len(_Good_list) and user_choice >=0: #len 获取长度,不能写5.会写死 p_item = _Good_list[user_choice] if p_item[1] <= salary: shopping_list.append(p_item) salary -= p_item[1] print("Add %s into your shopping cart,your current balace is0\%s" %(p_item,salary)) else: print("your slary [%s] is not allows buy it ") else: print("good list is not exist ") elif user_choice == 'q': print("--------shoping list ----------") for p in shopping_list: print(p) print("your current balance:",salary) exit() else: print('input wrong')
9.字典
属于k-values的类型,打印时是无序的,因为字典没有下标,key是唯一的
info = { 'stu1101': "TengLan Wu", 'stu1102': "LongZe Luola", 'stu1103': "XiaoZe Maliya", } print(info) print(info[“stu1101”]) #可以直接取出值 info[“stu1101”] = “武藤兰” #直接修改,如果不存在直接新增 del info[“stu1101”] #删除 info.pop(“stu1101”) #必须指定k值,推荐使用此方式 info.popitem #随机删除 info[‘stu1101’] #获取,但不推荐使用这个 info.get(‘stu1103’) #推荐使用这个来获取,不存在返回none print(‘stud1103 in info) #在就获取,不在创建
info = { 'stu1101': "TengLan Wu", 'stu1102': "LongZe Luola", 'stu1103': "XiaoZe Maliya", } #print(info) #新增 info['stu1104']='苍井空' print(info) #修改 info['stu1101']='武藤兰' print(info) #删除 info.pop("stu1101") print(info) del info['stu1104'] print(info) #随机删除 info.popitem() print(info) #查找,pychram没有结果cpyhon有结果 'stu1102' in info info.get("stu1102") info['stu1102'] #如果一个key不存在就报程序错误,get不会会返回node info["stu1105"]
多级字典嵌套,key 尽量不使用中文
av_catalog = { "欧美":{ "www.youporn.com": ["很多免费的,世界最大的","质量一般"], "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"], "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"], "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"] }, "日韩":{ "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"] }, "大陆":{ "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"] } } #修改 av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来" #打印,将修改的东西追加到‘慢’后边 print(av_catalog["大陆"]["1024"]) #在cpython里面执行以下命令 #打印所有元素 av.values() #打印key,欧美,日韩,大陆 av.keys() 结果: dict_keys(['欧美', '日韩', '大陆']) # av.setdefault('stu1106','alex') 结果:alex info 打印所有文档 #合并 info {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} b = {1:2,3:4, "stu1102":"龙泽萝拉"} info.update(b) info {'stu1102': '龙泽萝拉', 1: 2, 3: 4, 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} b = {'stu':'longzelll',1:3,2:4} print(info) info.update(b) print(info) 结果: E:\S14\venv\Scripts\python.exe E:/S14/1-hello/hello {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex', 'stu': 'longzelll', 1: 3, 2: 4} 将字典转换成列表 info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} print(info) b = info.items() print(b) 通过列表生成字典 #通过一个列表生成默认的字典,很坑,改一个会改所有,是一个内存指针 c = info.fromkeys([6,7,8],'testd') print(c) c = info.fromkeys(c,50) print(c) 结果: {6: 'testd', 7: 'testd', 8: 'testd'} {6: 50, 7: 50, 8: 50} #循环打印字典方法1(推荐使用) for key in info: print(key,info[key]) #循环打印字典方法2(数据量大时不推荐) for k,v in info.items(): # print(k,v)
多级菜单
data = { '北京':{ '朝阳区':{ '女人街':["Gome","Pengrun"], '金融中心':["Alibaba","HujiaLou"] }, '海淀区':{ '中关村':["Xindongfang","XDF"], '西二旗':["Baidu","BaiDubulding"] }, '丰台区':{ '马家堡':["Shenmezhidemai","SMZDM"] } }, '吉林省':{ '长春市':{ '汽车区':["Yiqi","YIQIJQ"], '绿园区':["JinKeAn","XiAnQiao"] }, '吉林市':{ '船营区':["JilinAoD","AoDongzhiyao"], '丰满区':["JiLinBank",'JilinBankBullding'] } } } while True: for i in data: print(i) choice = input("please choice your want") if choice in data: while True: for j in data[choice]: print("\t",j) choice2 = input("please choice your want") if choice2 in data[choice]: while True: for k in data[choice][choice2]: print("\t\t",k) choice3 = input("please choice your want") if choice3 in data[choice][choice2]: for l in data[choice][choice2][choice3]: print("\t\t\t",l) choice4 = input("this is last enter b back") if choice4 == 'b': pass #pass什么都不做,做一个标识,不加会报错 if choice3 == 'b': break if choice2 == 'b': break
包含退出和退到上一层 exit_flag = False while not exit_flag: for i in data: print(i) choice = input("please choice your want on 1:") if choice in data: while not exit_flag: for j in data[choice]: print("\t",j) choice2 = input("please choice your want on 2:") if choice2 in data[choice]: while not exit_flag: for k in data[choice][choice2]: print("\t\t",k) choice3 = input("please choice your want on 3:") if choice3 in data[choice][choice2]: for l in data[choice][choice2][choice3]: print("\t\t\t", l) choice4 = input("this is last enter b back") if choice4 == 'b': break elif choice4 == 'q': exit_flag = True if choice3 == 'b': break elif choice3 == 'q': exit_flag = True if choice2 == 'b': break elif choice2 == 'q': exit_flag = True
作业
作业: 购物车优化 用户入口: 1.商品信息存在文件里 2.已购商品,余额记录。都已经记录。下一次进入不需要输入工资 3. 商家入口: 2.可以添加,修改商品价格,

浙公网安备 33010602011771号