Day1补充部分
模块初识
模块就是由其他人写好的功能,在程序需要的时候进行导入,直接使用,也叫库。
库有标准库和第三方库,所谓标准库,就是不需要安装就可以直接使用的,自带的;第三方库,就是需要进行下载安装才可以使用。
Python之所以强大是因为其中不仅支持标准库和还支持第三方库,目前先了解一下简单的两个库:sys和os。
文件名不能命名为与模块的名相同的名字,import在寻找模块的时会在当前的目录下寻找,所以如果同名的话会报错,但在p3中会出现不报错的情况。
Sys
Sys.path打印出来是一堆路径,全是python的全局环境变量,存python的内部调用的文件或者是模块的路径,如果不在就会出错。
import sys print(sys.path )
标准库库存放在lib目录下,第三方库存放在sit_packages目录下。
argv,打印相对路径,但在pychame中会显示是绝对路径;还可以添加参数。
import sys
print(sys.argv) 输出结果 e:\Private\私人文件\python\day2>py -3 sys_mod.py ['sys_mod.py'] 在输入的时候加入参数: e:\Private\私人文件\python\day2>py -3 sys_mod.py 1 2 3 ['sys_mod.py', '', '', ''] import sys
print(sys.argv[2]) e:\Private\私人文件\python\day2>py -3 sys_mod.py 1 2 3 2
Os
和操作系统进行交互。调用命令,查看文件,查看文件大小等
.System(”dir”)dir是Windows查看当前目录下的文件,如果存入变量中,输出结果会变成0,因为输出是直接输出到屏幕上,输出完就没了,这里的0是代表输出成功,1是输出错误。执行命令不保存结果。
import os
cmd_res = os.system("dir")
print("--->",cmd_res)#执行命令不保存结果 结果返回: ---> 0
.popen(”dir”)同样存入变量,打印出的时候是内存地址,需要把结果读出来的时候需要加入read,加入的原因,可以理解命令存在内存中,需要用read来取出,如果不取就只是地址。
import os cmd_res = os.popen("dir").read() #取结果
print("--->",cmd_res) .mkdir当前目录下创建目录 os.mkdir("new_dir") 创建名字为new_dir的目录
.pyc
PyCodeObject和pyc文件。
我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果。我们先简单知道就可以了,继续向下看。
当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。
当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。
bytes类型
py中文本和二进制分开表示,前者用str表示,后者这bytes表示,p3中两者分的很清晰,不能混合,无法再字节包里面搜索字符串,也不能在字符包里面搜索字节,两者但又可以相互转换(解码decode和编码encode)。
msg = "人工智能" print(msg) print(msg.encode(encoding= "utf-8") ) print(msg.encode(encoding= "utf-8") .decode(encoding= "utf-8") )
在p3中不加入encoding = “utf-8”也不会出错,但最好还是规范点,加上改句。
列表
列表也同样可以进行类似range的步长的输出:
names =["LuFei","SuoLong",["Luo","JiDe"],"XiangJiShi","QiaoBa"]
print(names [0:-1:2])
print(names [::2])
#range (1,10,2) 起始,结束,步长
for i in names :
print(i)
切片
顾首不顾尾,[1:3]第一个代表起始位置,第二个代表结束位置,但不包括在内
在不知道列表多大的情况下,可以用-1代表最后一个列表位置。排序是从左到右,如果需要取末尾的位置可以用负数,需要取到最后一个可以省略如:[-3:]。
names =["LuFei","SuoLong",["Luo","JiDe"],"XiangJiShi","QiaoBa"] print(names[1:3])#切片
print(names[2:-1])
print(names[-2:])
print(names[:3])
追加
变量名前加入.append("”),只能在最末尾的追加
names .append("WuSuoPu")#追加
插入
.insert(1,””)1代表的是需要插入的位置
names.insert(1,"BuLuKe")#插入
names.insert(3,"ShenPing")
更改
N[n]=””,N为列表名,n代表需要更改的位置
names[2] = "LuBing"#替换
print(names)
删除
N.remove("”)直接移除
del N[n],n为删除的位置
N.pop(n)没有输入下标n默认删除最后一个,如果有下标n则删除下标位置的。
#delete
names.remove("QiaoBa")
del names[1] = names.pop(1)
names.pop(1)
查找位置
N.index(“”)
print(names.index("QiaoBa") )#查找下标
print(names[names.index("QiaoBa") ]) #根据下标打印
统计
用法类似:N.count(“”)对某元素的统计。
print(names.count("QiaoBa") )#统计
排序
Sort优先级高到低为:特殊符号,数,大写,小写
names.sort()#排序
倒序
列表的原本的顺序颠倒。
names.reverse()#倒序
扩展
两个列表合并在一起:extend,被合并的还是会存在
names2 = [1,2,3,4]
names.extend(names2)#扩展合并 如果删除后者的话:运行的过程会出错。 del names2
print(names,names2 )
复制
复制中有分两种,一种是深复制,一种是浅复制,前者是会进行完整对修改进行的复制,后者只是复制第一层,如果出现嵌套的情况是对嵌套的内容地址的内容进行修改的也会复制。
import copy #需要完整复制的时候需要加入这句 names2 = copy.deepcopy(names)#深copy,慎用
#names2 = copy.copy(names) #和浅copy一样
#names2 = names .copy() #只是copy第一层,浅层的,内嵌的的时候,内层的列表是指针内容被修改,属于第二层的内容,修改会同步进行复制
print(names)
print(names2)
names[0] = "路飞"#列表里面填写的是下标!!
names[2][0] = "罗"#= name2[2][0] = "罗"
print(names)
print(names2)
元组
一旦创建就不能修改,只读列表,小括号,只有两个用法,count和index。
names = ('JC','jc') print(names.count("JC") ) print(names.index("JC") )
程序练习。
结合列表和判断语句写出
程序:购物车程序
需求:
1.启动程序后,让用户输入工资,然后打印商品列表
2.允许用户根据商品编号购买商品
3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
4.可随时退出,退出时,打印已购买商品和余额
字符串操作
name = 'my name is jc'
print(name.capitalize()) .format()格式输出 .format_map()字典用法格式输出 .isalnum()阿拉伯数字加英文字母,其他的输出都不可以 .isalpha()纯英文字母 .isadecimal()十进制数 .isdigit()是不是整数 .isidentifier()是不是一个合法的标识符(变量名) .isnumeric()是不是一个只有数字在里面 .isspace()是不是空格 .istitle()是不是每个首字母大写 .isprinable()字符串不存在这个,tty file,drive file这类文件不能打印的 .isupper()是不是大写 p = str.maketrans("abcdefen",'123$@456')
print("j chen".translate(p) ) print('My Name Is '.isupper())
print('+'.join( ['','','']) ) print('a 1A'.isidentifier()) #判读是不是一个合法的标识符
print('33A'.isnumeric())
。。。
等等,可以逐个进行试验,一般经常用到的指令都不多,有些指令只可意会不可言传~~
字典
字典一种key - value 的数据类型,和平时学习使用的字典类似
特性:
字典没有顺序(下标),列表有序(下标)
Key是唯一的,如果相同的key会自动覆盖(去重)
# Author: JC info = { 'stu1101': "HaiZeiWang", 'stu1102': "HuoYingRenZhe", 'stu1103': "DaoJian", } print(info['stu1101']) #打印 #add info ['stu1104'] = "小鬼杀手" #如果存在就查找不存在就增加 print(info) #修改 info ['stu1101'] = "海贼王" print(info) #del #info.pop("stu1101") #del info ["stu1103"] info.popitem() #随机删除 print(info) #查找 print(info .get("stu1101"))#没有的话就就会返回none info ["stu1102"]#不存在的情况会报错 print("stu1102" in info) #info.has_key("1102")在py2中存在
三级菜单
程序: 三级菜单
要求:
打印省、市、县三级菜单
可返回上一级
可随时退出程序
Homework:
购物车优化
用户入口
1.商品信息存入文件里
2.已购商品,余额记录
商家入口
1.可以添加商品,修改商品价格