一 模块初识
标准库和第三方库,标准库是python自带的不需要安装可以直接导入的,使用python常用的功能;第三方库 必须要安装的,列入web框架
import sys 模块
import sys
print(sys.path) #打印环境变量
# C:\\Python36\\lib\\site-packages py 第三方库一般都安装在这个文件夹
# C:\\Python36\\lib py 标准库一般都安装在这个文件夹
import sys
print(sys.argv) # 打印脚本的绝对路径
import os
cmd_res=os.system("dir")
print("--------",cmd_res) # os.system 只要调用就执行了,但是他输出是输出到屏幕上,输出完毕之后就没了。 执行命令,不保存结果
import os
cmd_res=os.popen("dir").read()
print("--------",cmd_res) # 取出这个值并且打印出来
import os
os.mkdir("new_dir") # 新建一个目录
import shopping # 默认在当前目录下找这个目录,如果没有就去全局的环境变量下去找,如果想导入的模块不在环境变量里面,就把想导入的模块放进环境变量里面,
例如放进C:\Python36\Lib\site-packages,这样再执行就ok了!
二 pyc是什么?
1. Python是一门解释型语言?
我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在。如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled的缩写才对啊!
为了防止其他学习Python的人也被这句话误解,那么我们就在文中来澄清下这个问题,并且把一些基础概念给理清。
2. 解释型语言和编译型语言
计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。这个过程分成两类,第一种是编译,第二种是解释。
编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言。
解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby。
通过以上的例子,我们可以来总结一下解释型语言和编译型语言的优缺点,因为编译型语言在程序运行之前就已经对程序做出了“翻译”,所以在运行时就少掉了“翻译”的过程,所以效率比较高。但是我们也不能一概而论,一些解释型语言也可以通过解释器的优化来在对程序做出翻译时对整个程序做出优化,从而在效率上超过编译型语言。
此外,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。
用Java来举例,Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。
3. Python到底是什么
其实Python和Java/C#一样,也是一门基于虚拟机的语言,我们先来从表面上简单地了解一下Python程序的运行过程吧。
当我们在命令行中输入python hello.py时,其实是**了Python的“解释器”,告诉“解释器”:你要开始工作了。可是在“解释”之前,其实执行的第一项工作和Java一样,是编译。
熟悉Java的同学可以想一下我们在命令行中如何执行一个Java的程序:
javac hello.java
java hello
只是我们在用Eclipse之类的IDE时,将这两部给融合成了一部而已。其实Python也一样,当我们执行python hello.py时,他也一样执行了这么一个过程,所以我们应该这样来描述Python,Python是一门先编译后解释的语言。
4. 简述Python的运行过程
在说这个问题之前,我们先来说两个概念,PyCodeObject和pyc文件。
我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果。我们先简单知道就可以了,继续向下看。
当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。
当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式[1]。既然运行的时候会先找pyc文件, 如果源文件改动了怎么办?python 还会再去找pyc文件吗?python显然想到了这个问题,编写python的 JAVA是这样描述的(先对比pyc和源文件的更新时间,如果源文件的时间是比较新的,那么说明源文件改动过,源文件就需要重新编译成pyc文件)
#[1][引用,原文”http://www.cnblogs.com/alex3714/articles/5465198.html“]
三 Python数据类型
1数字
int (整型)
long (长整型)
float(浮点型)
complex(复数)
2 布尔值
a =0
if a : print("a")
a =1
if a :print("a")
四 数据运算
1 位运算
按位运算符
a = 60 # 60 = 0011 1100
b = 13 # 13 = 0000 1101
c = 0
c = a & b; # 12 = 0000 1100
print(c)#与运算
c = a | b; # 61 = 0011 1101
print(c)#或运算
c = a ^ b; # 49 = 0011 0001 #相同为0,不同为1
print(c)#异或运算
c = ~a; # -61= 1100 0011
print(c)#按位取反
c = a << 2; # 240 = 1111 0000
print(c)#左移运算,把二进制往左移两个单位
c = a >> 2; # 15 = 0000 1111
print(c)#右移运算,把二进制右移两个单位
五 列表的使用
scg_name= ["ezreal","david","shell","summer","sunny","candy","janet","sandy"]
print(scg_name)
print(scg_name[0],scg_name[3])
print(scg_name[0:3]) #切片:顾头不顾尾,取0和1和2,不包括3
print(scg_name[-1]) #在不知道列表长度的情况下,取出最后一个值
print(scg_name[-1]) #在不知道列表长度的情况下,取出最后一个值
print(scg_name[-3:-1]) #在从左往右的 切片
print(scg_name[-3:]) #省略-1
print(scg_name[:3]) #0可以省略
scg_name.append("celina") #追加到列表的最后
print(scg_name)
scg_name.insert(3,"celina") #插入到列表制定的位置
print(scg_name)
scg_name[1]="pony" #修改列表中的某个元素
print(scg_name)
scg_name.remove("celina") #直接删除字符串
del scg_name[0] #删除下标的那个值
scg_name.pop() # 不输入下标的话默认删除列表中的最后一个值;如果输入下标的话,就是想删除谁就删除谁
print(scg_name.index("shell")) #把值的位置找出来
print(scg_name[scg_name.index("shell")]) #通过位置打印列表的值
print(scg_name)
print(scg_name.count("shell")) #统计值的数量
print(scg_name.clear()) #清空列表
scg_name= ["ezreal","david","shell","summer","sunny","candy","janet","sandy",]
scg_name.reverse() #将列表里面的值反转
#scg_name.sort() #排序
shidao_name = ["小戈","小孙"]
scg_name.extend(shidao_name) #合并另一个列表
scg_name= ["ezreal","david","shell","summer","sunny","candy","janet","sandy",["wangming","liuyang"]]
name =scg_name.copy()
scg_name[1]="大王" #修改了变量scg_name 下标1的值,这时候name copy没有copy到
scg_name[8][0]="猴子" #这时候name copy 到了 列表里面嵌套的列表,我认为列表嵌套列表能被深copy,单单的是浅copy
print(name)
print(scg_name)
for i in scg_name :
print(i)
print(scg_name[0:-1:2]) #跳着切片
print(scg_name[::2]) #同上切片
print(scg_name[:]) #不常切片
六 元组与购物车程序练习
copy #讨论
import copy
person = ["name",["a",100]]
p1= copy.copy(person)
p2 = person [:]
p3 = list(person)
import copy
person = ["name",["saving",10000]]
p1 = person [:]
p2 = person [:]
print(p1)
print(p2)
元组
元组创建完之后是不可以修改的,你可以把它当做是只读列表!
name =("summer","celina","sunny")
print(name.count("summer")) #值计数
print(name.index("summer")) #值得下标
#元组只有这两个方法
#什么情况下用元组,比如你写的程序,里面有数据库配置文件,程序一旦执行,不想被更改的!
七 购物车练习
# -*- coding:utf-8 -*-
product_list =[
("森海塞尔耳机",3880),
("高配大屏台式机",16880),
("捷安特自行车",3880),
("大床",6680),
("拿铁",38),
("苹果7p",5880)
]
salary = input("input your salary:")
shopping_list=[]
if salary.isdigit():
salary =int(salary)
while True:
for index,item in enumerate(product_list):
print(index,item)
choice= input("input the code that you wanna buy:")
if choice.isdigit():
choice=int(choice)
if choice<len(product_list) and choice>=0:
p_item =product_list[choice]
if p_item[1]<= salary:
shopping_list.append(p_item)
salary -=p_item[1]
print("add %s into you shopping list,and your 余额 is \033[40;1m %s \033[0m"%(p_item,salary))
else:
print("your 余额 is \033[40;1m not enough \033[0m to buy,please 跟我学python吧")
else:
print("correct number please")
elif choice == "q":
print("------SHOPPING CART------")
for p in shopping_list:
print(p)
print("你的余额还剩 \033[41;1m %s \033[0m"%salary)
exit()
else:
print("Only \033[40;1m Number \033[0m Please") #42代表背景绿 41代表背景红 40 代表背景黑色
else:
print("\033[42;1m ONLY NUMBERS PLEASE\033[0m")
八 字符串的常用操作
__author__ = 'shellxie'
#-*- coding:utf-8 -*-
name= "my name is {name},age is {age}"
#字符串后面两个下划线的,我们不用管他,这种事内部的功能
print(name.capitalize() ) #首字母大写
print(name.count("a") ) #统计值的个数,或者 字母的个数,例如name.count("a")
print(name.center(50,"-")) #打印50个字符,把name放中间,不够的用-来填补
print("---",name.encode()) #在python3里将字符串转换成二进制
print(name.endswith("a")) #判断字符串是不是以'值'结尾,是的话就返回为真
print(name.expandtabs(tabsize=30)) #把值里面的table键转换成30个字符的空格
print(name.find("e")) #把找到的字符索引给取回来
print(name[name.find("name"):]) #字符串的切片和列表相似
print(name.format(name="alex",age = "45"))#格式化输出
print(name.format_map({"name":"alex","age":45}))#格式化输出,用字典的格式写进去
print(name.isalnum()) #是不是一个阿拉伯的数字加字母,是的就返回为真
print(name.isalpha()) #是不是一个纯英文字母,是的就返回为真
print(name.isdecimal()) #是不是一个十进制的字符,是的就返回为真
print(name.isdigit()) #是不是一个整数符,是的就返回为真
print("name".isidentifier()) #是不是一个合法的标识符,是的就返回为真
print(name.islower()) #是不是小写的,是的就返回为真
print(name.isupper()) #是不是大写的,是的就返回为真
print(name.isnumeric()) #是不是一个数字,是的就返回为真
print(name.isspace()) #是不是一个空格字,是的就返回为真
print(name.istitle()) #是不是一个title(首字母大写即时title),是的就返回为真
print(name.isprintable()) #是不是一个可以打印的,是的就返回为真(例如tty file ,drive file)
print(name.join(["1","2","3"])) #返回一个字符串,元素之间的分隔符是name.
print(name.ljust(50,"*")) #保证name 是五十个字符长度,长度不够的话在右边用*补上
print(name.rjust(50,"*")) #保证name 是五十个字符长度,长度不够的话在左边用*补上
print(name.lower()) #把name变小写
print(name.upper()) #把name变大写
print(name.lstrip()) #去掉左边的空格和回车
print(name.rstrip()) #去掉右边的空格和回车
print(name.strip()) #去掉两边边的空格和回车
p= str.maketrans("mina","1234")
print("mn123ia".translate(p)) #可以写随机密码,比如此时 m对应的是1,i对应的是2,n对应的是3,a对应的是4,print("mn123ia".translate(p))的时候,就是把mn123ia改成对应的值
print(name.replace("m","M",1)) #把m替换成M,并且只替换一个
print(name.rfind("e")) #找到最后面那个值的索引
print(name.split("m")) #把字符串按照m分离成列表。也可以按照空格分离成列表
print("1+2+3+4".split("+")) #同上,这样就直接把数字提取出来
print("1+2+\n3+4".splitlines()) #按照换行符\n 来分离字符串成列表
print(name.swapcase()) #大写变小写,小写变大写
print(name.title()) #把name变成title
print(name.zfill(50)) #把name用 0 补充到50个字符
九 字典的使用
__author__ = 'shellxie'
# -*- coding:utf-8 -*-
data = {
"shell":"summer",
"janet":"candy",
"ez":"david",
"sunny":"sandy"
}
print(data) #字典没有下标,字典只有key,所以它打印出来是无序的
print(data["janet"])
data["janet"] = "pony" #通过key 直接修改字典里面的值
print(data)
data["celina"]="kiity" #没有key,就新建一个key
print(data)
del data["shell"] #删除key
print(data)
data.pop("ez") #删除key,
print(data)
data.popitem() #删除最后一个
print(data)
scg = {
"shell":"summer",
"janet":"candy",
"ez":"david",
"sunny":"sandy"
}
print(scg.get("celina")) #get方法取字典里的值,这样即使列表里没有这个key,也不会报错,会返回一个none.
print("ez" in scg ) #等同于python2里这样的写法# info.has_key("ez")
folk_music ={
"*":{
"1701":["热河","定西","鼠说","大象"],
"梵高先生":["梵高先生","你离开了南京从此没有人和我说话","董卓瑶"],
"被禁忌的游戏":["黑色信封","离婚","阿兰","欢愉","卡夫卡","被禁忌的游戏","罗庄的冬天","红色气球"],
"这个世界会好吗":["妈妈","喀纳斯","和你在一起","翁庆年的六英镑","我们不能失去信仰-献给刘艺","海的女儿","这个世界会好吗","人民不需要*"],
"我爱南京":["天空之城","结婚","家乡"]
},
"陈粒":{
"如也":["不灭","如也","奇妙能力歌","历历万乡"],
"爱若":["爱若"],
"小梦大半":["小半"],
"未收录的歌曲":["祝星"],
"戏台":["戏台"]
},
"赵雷":{
"赵小雷":["人家","未给姐姐递出的信","画"],
"吉姆餐厅":["吉姆餐厅","少年锦时","我们的时光"],
"成都":["成都"],
}
}
folk_music["赵雷"]["赵小雷"][2]="画2"
print(folk_music) #key尽量不要写中文,编码的问题可能导致取不出key
print(folk_music.values()) #打印字典里面所有的值
print(folk_music.keys()) #打印字典里面所有的key
folk_music.setdefault("二手玫瑰",{"娱乐江湖":["伎俩","命运"]}) # 如果能取到”二手玫瑰这个值,就返回,取不到就创建新的
print(folk_music)
scg1 = {
"shell":"summer",
"janet":"candy",
"ez":"david",
"sunny":"sandy"
}
b ={
"shell":"celina",
1:3,
2:4
}
scg1.update(b) #把字典b里面的值合并到scg1里面去,如果有值重复,以b为准
print(scg1)
print(scg1.items()) #字典转化成列表
c=dict.fromkeys([1,2,3,4],"test") #初始化一个字典,其中key已经写好,值用“test”
print(c)
d1=dict.fromkeys([1,2,3,4],[1,{"name":"alex"},444])
print(d1)
d1[1][1]["name"] = "shell" #这四个key指向同一个内存地址,改一个就会改所有的
print(d1)
for i in folk_music: # 循环字典
print(i,folk_music[i])
print(folk_music["*"])
for j,v, in folk_music.items(): # 这个循环首先会有个把字典转化成列表的过程,如果数据量大,消耗的时间就会很长。建议用上面的循环方法
print(j,v)
十 三级菜单实例
__author__ = 'shellxie'
# -*- coding:utf-8 -*-
folk_music ={
"*":{
"CD专辑":{
"1701":["热河","定西","鼠说","大象"],
"梵高先生":["梵高先生","你离开了南京从此没有人和我说话","董卓瑶"],
"被禁忌的游戏":["黑色信封","离婚","阿兰","欢愉","卡夫卡","被禁忌的游戏","罗庄的冬天","红色气球"],
"这个世界会好吗":["妈妈","喀纳斯","和你在一起","翁庆年的六英镑","我们不能失去信仰-献给刘艺","海的女儿","这个世界会好吗","人民不需要*"],
"我爱南京":["天空之城","结婚","家乡"]
},
"现场摇滚":{
"1701":["热河","定西","鼠说","大象"],
"梵高先生":["梵高先生","你离开了南京从此没有人和我说话","董卓瑶"],
"被禁忌的游戏":["黑色信封","离婚","阿兰","欢愉","卡夫卡","被禁忌的游戏","罗庄的冬天","红色气球"],
"这个世界会好吗":["妈妈","喀纳斯","和你在一起","翁庆年的六英镑","我们不能失去信仰-献给刘艺","海的女儿","这个世界会好吗","人民不需要*"],
"我爱南京":["天空之城","结婚","家乡"]
},
},
"陈粒":{
"CD专辑":{
"如也":["不灭","如也","奇妙能力歌","历历万乡"],
"爱若":["爱若"],
"小梦大半":["小半"],
"未收录的歌曲":["祝星"],
"戏台":["戏台"]
},
"现场摇滚":{
"1701":["热河","定西","鼠说","大象"],
"梵高先生":["梵高先生","你离开了南京从此没有人和我说话","董卓瑶"],
"被禁忌的游戏":["黑色信封","离婚","阿兰","欢愉","卡夫卡","被禁忌的游戏","罗庄的冬天","红色气球"],
"这个世界会好吗":["妈妈","喀纳斯","和你在一起","翁庆年的六英镑","我们不能失去信仰-献给刘艺","海的女儿","这个世界会好吗","人民不需要*"],
"我爱南京":["天空之城","结婚","家乡"]
},
},
"赵雷":{
"CD专辑":{
"赵小雷":["人家","未给姐姐递出的信","画"],
"吉姆餐厅":["吉姆餐厅","少年锦时","我们的时光"],
"成都":["成都"],
},
"现场摇滚":{
"1701":["热河","定西","鼠说","大象"],
"梵高先生":["梵高先生","你离开了南京从此没有人和我说话","董卓瑶"],
"被禁忌的游戏":["黑色信封","离婚","阿兰","欢愉","卡夫卡","被禁忌的游戏","罗庄的冬天","红色气球"],
"这个世界会好吗":["妈妈","喀纳斯","和你在一起","翁庆年的六英镑","我们不能失去信仰-献给刘艺","海的女儿","这个世界会好吗","人民不需要*"],
"我爱南京":["天空之城","结婚","家乡"]
},
},
"二手玫瑰":{
"CD专辑":{
"娱乐江湖":["伎俩","命运"],
"梵高先生":["梵高先生","你离开了南京从此没有人和我说话","董卓瑶"],
"被禁忌的游戏":["黑色信封","离婚","阿兰","欢愉","卡夫卡","被禁忌的游戏","罗庄的冬天","红色气球"],
"这个世界会好吗":["妈妈","喀纳斯","和你在一起","翁庆年的六英镑","我们不能失去信仰-献给刘艺","海的女儿","这个世界会好吗","人民不需要*"],
"我爱南京":["天空之城","结婚","家乡"]
},
"现场摇滚":{
"1701":["热河","定西","鼠说","大象"],
"梵高先生":["梵高先生","你离开了南京从此没有人和我说话","董卓瑶"],
"被禁忌的游戏":["黑色信封","离婚","阿兰","欢愉","卡夫卡","被禁忌的游戏","罗庄的冬天","红色气球"],
"这个世界会好吗":["妈妈","喀纳斯","和你在一起","翁庆年的六英镑","我们不能失去信仰-献给刘艺","海的女儿","这个世界会好吗","人民不需要*"],
"我爱南京":["天空之城","结婚","家乡"]
},
},
}
set_flag = False
while not set_flag:
for i in folk_music:
print(i)
choice = input("input the singer's name:")
if choice in folk_music :
while not set_flag:
for i2 in folk_music[choice]:
print(i2)
choice2 = input("input the style of CD:")
if choice2 in folk_music[choice] :
while not set_flag:
for i3 in folk_music[choice][choice2]:
print(i3)
choice3 =input("input the CD name:")
if choice3 in folk_music[choice][choice2]:
while not set_flag:
for i4 in folk_music[choice][choice2][choice3]:
print(i4)
choice4 = input("按b返回上级")
if choice4 == "b":
break
elif choice4 =="q":
set_flag=True
if choice3 == "b":
break
elif choice3 == "q":
set_flag=True
if choice2 == "b":
break
elif choice2 == "q":
set_flag=True
elif choice == "q":
set_flag=True
三级菜单优化
__author__ = 'Shell Xie'
# -*- coding: utf-8 -*-
folk_music ={
"*":{
"CD专辑":{
"1701":["热河","定西","鼠说","大象"],
"梵高先生":["梵高先生","你离开了南京从此没有人和我说话","董卓瑶"],
"被禁忌的游戏":["黑色信封","离婚","阿兰","欢愉","卡夫卡","被禁忌的游戏","罗庄的冬天","红色气球"],
"这个世界会好吗":["妈妈","喀纳斯","和你在一起","翁庆年的六英镑","我们不能失去信仰-献给刘艺","海的女儿","这个世界会好吗","人民不需要*"],
"我爱南京":["天空之城","结婚","家乡"]
},
"现场摇滚":{
"家跨年音乐会":["回答","定西","序曲","大象"],
"i/o2014":["墙上的向日葵","天空之城"]
},
},
"陈粒":{
"CD专辑":{
"如也":["不灭","如也","奇妙能力歌","历历万乡"],
"爱若":["爱若"],
"小梦大半":["小半"],
"未收录的歌曲":["祝星"],
"戏台":["戏台"]
},
"现场摇滚":{
"1701":["热河","定西","鼠说","大象"],
"梵高先生":["梵高先生","你离开了南京从此没有人和我说话","董卓瑶"],
"被禁忌的游戏":["黑色信封","离婚","阿兰","欢愉","卡夫卡","被禁忌的游戏","罗庄的冬天","红色气球"],
"这个世界会好吗":["妈妈","喀纳斯","和你在一起","翁庆年的六英镑","我们不能失去信仰-献给刘艺","海的女儿","这个世界会好吗","人民不需要*"],
"我爱南京":["天空之城","结婚","家乡"]
},
},
"赵雷":{
"CD专辑":{
"赵小雷":["人家","未给姐姐递出的信","画"],
"吉姆餐厅":["吉姆餐厅","少年锦时","我们的时光"],
"成都":["成都"],
},
"现场摇滚":{
"1701":["热河","定西","鼠说","大象"],
"梵高先生":["梵高先生","你离开了南京从此没有人和我说话","董卓瑶"],
"被禁忌的游戏":["黑色信封","离婚","阿兰","欢愉","卡夫卡","被禁忌的游戏","罗庄的冬天","红色气球"],
"这个世界会好吗":["妈妈","喀纳斯","和你在一起","翁庆年的六英镑","我们不能失去信仰-献给刘艺","海的女儿","这个世界会好吗","人民不需要*"],
"我爱南京":["天空之城","结婚","家乡"]
},
},
"二手玫瑰":{
"CD专辑":{
"娱乐江湖":["伎俩","命运"],
"梵高先生":["梵高先生","你离开了南京从此没有人和我说话","董卓瑶"],
"被禁忌的游戏":["黑色信封","离婚","阿兰","欢愉","卡夫卡","被禁忌的游戏","罗庄的冬天","红色气球"],
"这个世界会好吗":["妈妈","喀纳斯","和你在一起","翁庆年的六英镑","我们不能失去信仰-献给刘艺","海的女儿","这个世界会好吗","人民不需要*"],
"我爱南京":["天空之城","结婚","家乡"]
},
"现场摇滚":{
"1701":["热河","定西","鼠说","大象"],
"梵高先生":["梵高先生","你离开了南京从此没有人和我说话","董卓瑶"],
"被禁忌的游戏":["黑色信封","离婚","阿兰","欢愉","卡夫卡","被禁忌的游戏","罗庄的冬天","红色气球"],
"这个世界会好吗":["妈妈","喀纳斯","和你在一起","翁庆年的六英镑","我们不能失去信仰-献给刘艺","海的女儿","这个世界会好吗","人民不需要*"],
"我爱南京":["天空之城","结婚","家乡"]
},
},
}
level=[]
while True:
for key in folk_music:
print(key)
choice = input("input the choice that you wanna watch:").strip()
if choice =="q":
if len(level)==0:
break
folk_music =level[-1]
level.pop()
if choice not in folk_music:
continue
level.append(folk_music)
#print(level)
folk_music = folk_music[choice]