内容概览
- 模块
- python运行过程
- 基本数据类型(数字,字符串)
- 序列类型(列表,元组,字典)
模块使用
- 模块我们可以把它想象成导入到python以增强其功能的一种拓展。需要使用import来导入模块
- 常用的模块之一:os(用于调用系统命令等)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
print(os.path) #打印当前路所在的路径
cmd=os.system("dir") #定义cmd执行系统的dir命令
print(cmd) #返回cmd的状态信息,成功为0,反之不为0
cmd_1 = os.mkdir("SSS") #定义cmd执行在当前路径下创建文件夹SSS
print(cmd_1) #打印状态
cmd_2 = os.rmdir("SSS") #定义cmd执行在当前路径下删除SSS文件夹
##如果要通过print来打印定义的cmd命令变量的话就需要popen这个参数
cmd_3=os.system('ipconfig')
print(cmd_3)
cmd_4=os.popen("ipconfig").read() #执行系统命令ipconfig
print(cmd_4)
3.sys模块
#!/usr/bin/env python
import sys
print(sys.path) #打印python相关路径
print(sys.argv) #传参数的功能
print(sys.argv[1]) #打印第二个参数
4.自定义模块
自定义模块:当要导入的自定义模块,需要具备和需要导入模块的程序在同一级目录或者在系统默认的库目录下例如在:pythom35\\lib\\site-packages
python运行过程
对于Python的运行我们还是得追溯到那个神奇的*.pyc字节码文件,这就是在python解释器运行python代码的时候生成的一个字节码文件。
那么生成的*.pyc文件是什么呢?c应该是compiled的缩写才对啊!
为了防止其他学习Python的人也被这句话误解,那么我们就在第一篇文章中做了形象的说明。
基本数据类型
- 数字类型之整型(int):这是用于存储数值的一种数据类型
对于变量的复制除了var = value 的这种方式,也还能通过var1,var2,var3,..=value1,value2,value3,...的方式来进行
在python3.x中对于int这个整形数据类型不再有long int这种说法,这样有效的防止了所谓的溢出问题
- 数据运算
- 算术运算
- 比较运算
- 赋值运算
- 逻辑运算
- 成员运算
- 位运算:这个比较恶心,涉及到二进制移位操作
这玩意儿得用点代码来表示:
#!/usr/bin/env python
# -*- coding:utf-8 -*- a = 50 #二进制表示50=110010
b = 150 #二进制表示150=10010110
c = a & b #与运算
print(c) #试了一把结果出来的值是18,这个的话尽量忘记吧。和后面的| ;^; ~ ;<< ;>>;这些玩意儿都一路货色
d = a | b
print(d) #或运算,得到的结果182
e = a ^ b
print(e) #异或的操作得到结果164
#f = a ~ b
#print(f)
g = a << 2
print(g) #左移位2下得到结果200
h = a >> 2
print(h) #右移位2得到结果12
其他的数据操作,请看此处的引用:http://www.runoob.com/python/python-operators.html
下面是变量赋值的操作截图:
下面是装逼的三元运算,感觉66的:
三元运算解释:
result = 值1 if 条件 else 值2
#如果条件为真:result = 值1
#如果条件为假:result = 值2
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:wanghui
a = 1
b = 2
c = 3
if a > b:
d = a
print(d)
elif a > c:
d = a
print(d)
###三元操作
a,b,c=1,2,3
d=a if a>b else c
2.python3.x严格区分string和byte:
在Python3.x下,文本用unicode表示,二进制数据则使用byte来表示。下图就说明了二者之间的关系:
代码表示:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:wanghui
msg = "呵呵哒!!"
#print(msg.encode(encoding='utf-8')) ##编码的过程,指定字符编码
b'\xe5\x91\xb5\xe5\x91\xb5\xe5\x93\x92\xef\xbc\x81\xef\xbc\x81' #结果
print(msg.encode(encoding='utf-8').decode(encoding='utf-8')) ##解码的过程
呵呵哒!!
3.字符串:也是比较常见的数据类型了,下面是字符串的一些操作
序列类型
- 列表:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:wanghui
names = ["chenjing","huangjie","huyuedong"]
'''
##切片操作
print(names[0]) #切片打印第一个位置元素
print(names[0:2]) #打印前两个元素(顾头不顾尾)
print(names[-2:]) #打印倒数后两个元素,不建议用[-2:-1]
''' ###添加元素
#names.append("shaolin") #在最后位置追加shaolin这个新元素
#print(names)
#names.insert(2,"wanghuihui") #在第三个位置插入wanghuihui
#print(names)
#b = ["wanghui","huangjie","chenyibo","huyuuedong"]
#names.extend(b) #在 names中拓展b列表
#print(names) ###修改元素
#names[2] = "alex" #修改第二个位置的元素为alex
#print(names)
#names[3] = "fengjie" #如果第四个位置没有fengjie这个元素的话就会报错
#print(names) ###索引(用于索引引用)
#print(names.index("alex")) #获取alex的位置索引
#print(names[names.index("alex")]) #根据alex索引位置值显示对应的内容 ###统计
# names.append("alex")
# names.extend(["wanghui","jeck","alex"])
# names.insert(3,"wanghui")
# print(names.count("wanghui")) #经过一系列的增加操作之后统计“wanghui”出现的次数 ###删除操作
#方法一:del操作
# print(names)
# del names[2] #按照元素的索引位置删除
# print(names)
#方法二:remove操作
# print(names)
# names.remove("huyuedong") #按照元素的value删除
# print(names)
#方法三:pop操作
# print(names)
# names.pop() #删除结尾的一个元素
# print(names)
# names.pop(0) #指定索引位置删除
# print(names)
#方法四:清空
# print(names)
# names.clear() #直接清空列表
# print(names) ###排序操作
names.append("Alex")
names.extend(["","","",""])
names.insert(3,"####") #还是一系列的新增操作
print(names)
names.sort()
print(names) #排序的优先级是符号>数字>大写>小写
此处还有一个比较重要的概念就是深浅拷贝
需要了解:变量是一个系统表的元素,拥有指向对象的连接的空间
对象是被分配的一块内存,存储其所代表的值
引用是自动形成的从变量到对象的指针
特别注意: 类型属于对象,不是变量
深浅拷贝,即可用于序列,也可用于字典
##浅拷贝
import copy
a=["hahaha","xixixi","lalala",["hehe",123],"wuwuwu"]
b=copy.copy(a)
print(a) ->输出['hahaha', 'xixixi', 'lalala', ['hehe', 123], 'wuwuwu']
print(b) ->输出['hahaha', 'xixixi', 'lalala', ['hehe', 123], 'wuwuwu']
a[0]="hahaha" #修改第一个元素为hahaha
print(a) ->输出['hahaha', 'xixixi', 'lalala', ['hehe', 123], 'wuwuwu']
print(b) ->输出['hahaha', 'xixixi', 'lalala', ['hehe', 123], 'wuwuwu']
a[2][1]=789 #修改第三个元素的第二个元素为789
print(a) ->输出['hahaha', 'xixixi', 'lalala', ['hehe', 789], 'wuwuwu']
print(b) ->输出['hahaha', 'xixixi', 'lalala', ['hehe', 789], 'wuwuwu']
##深拷贝
import copy
names = ["wanghui","huangjie","chenyibo","王辉",["alex","jack"]]
name2 = copy.deepcopy(names)
print(names)
print(name2)
names[-1][0]="ALEX"
print(names)
print(name2) ##保持原状不变,这就是深拷贝
参考详情:http://www.cnblogs.com/Eva-J/p/5534037.html
2.元组:不能修改的列表,同样支持count和index方法
#!/usr/bin/env python
# -*- coding:utf-8 -*-
names = ("huangjie","liurun","huyuedong")
names.count('huangjie') #通过count方法来获取黄姐出现的次数
names.index('huangjie') #通过index方法来获取huangjie的下标
names[names.index("huangjie")]
#切片操作
print(names[1:]) #打印第一个到最后一个元素
print(names[0:2]) #打印第一个到第三个元素 #不能对元组元素进行增加和删除操作
3.字符串操作:比较多
#!/usr/bin/env python
# -*- coding:utf-8 -*- a="name is hehehe"
print(a.capitalize()) #首字母大写
print(a.count('h')) #统计h出现的次数
print(a.center(10,"-")) #按照10字节的字符,如果不够就用-补充,字符串居中
print(a.encode()) #字符串编码
print(a.endswith('he')) #判断是否以he结尾
print(a.expandtabs(tabsize=50)) #实现的字符串中得有\t占位符才能读取到
print(a.find('hehe')) #打印hehe的下标位置方便切片print(a[a.find("hehe"):])
#print(a[a.find("hehe"):]) #切片
#print(a.format()) print("hello {name}".format(neme="hehe))
#print(a.format_map({"hehe":23,"haha",44})) #传入字典
print(a.index("is")) #打印is的index编号
print(a.isalnum()) #阿拉伯数字,有特殊字符就不行了
print(a.isalpha()) #纯英文字符包括大小写
print(a.isdecimal()) #是否为十进制
print(a.isalnum()) #是否为数字
print(a.isdigit()) #是否为整数
print(a.isidentifier()) #判断是否为一个合法的变量名
print(a.islower()) #判断字符串是否为小写
print(a.isnumeric()) #是否为数字(小数不包括)
print(a.isspace()) #是否为空格
print(a.istitle()) #是否为标题
print(a.isprintable()) #是否可打印(tty或者设备文件不可打印)
print(a.isupper()) #是否为大写
print('+'.join(['1','2','3','4'])) #拼接成1+2+3+4的形式
print(a.ljust(50,'*')) #保证长度50然后右侧填充*
print(a.rjust(30,'#')) #保证长度50然后左侧填充#
print(a.lower()) #把大写转成小写
print("\n\n\nhehehe\n\nkkk".lstrip()) #去除左边的空格或者回车
print("\n\n\nhehehe\n\nkkk").rstrip() #去除右边的回车或者空格
print("\n\n\nhehehe\n\nkkk").strip() #去除两侧的回车或者空格
'''
p = str.maketrans("abcdef",'123456')
print("wanghui".translate(p)) #把字符串转换成后面对应的数字的值w1nghui
'''
print(a.replace('h','H',2)) #替换字符串里的h为H,指定数字的话代表第几个
print(a.rfind('e')) #找到最右边的e的位置下标并返回
print('1+2+3+4'.split('+')) #按照+作为分隔符分割字符串
#print('1+2\n+3\n+4'.splitlines('+')) #按照+号作为分隔符分割(忽略回车或者空格)
print(a.startswith("heh")) #判断字符串是否以heh开头
print(a.swapcase()) #小写转大写
print(a.title()) #变title
print(a.zfill(50)) #补位操作
4.字典及其操作
#!/usr/bin/env python
# -*- coding:utf-8 -*-
dic = {
'wanghui':12345,
'jack':123456,
'sam':1234567,
'sary':12345678
}
#字典是无序的,key是唯一的,so天生去重
print(dic) #无序打印字典
print(dic['wanghui']) #按照wanghui打印出对应的值
dic['wanghui']='wanghui' #修改wanghui的值为wanghui
print(dic['wanghui']) #打印
dic['henry']='henry' #新增字典元素
print(dic) #打印字典
# del dic['wanghui'] #删除wanghui和对应的值
# print(dic)
# dic.pop('henry') #指定删除
# dic.popitem() #随机删除
print(dic.get('wanghui') #安全的查找方式,如果存在返回其值。否则返回none
dic_1 = {
'wanghui':12345,
'alex':234567,
'huyuedong':23455
}
dic.update(dic_1) #合并两个字典,如果有交叉,就更新字典,如果没有交叉就创建
print(dic)
print(dic.items() #字典转成了列表 c = dic.fromkeys([6,7,8]) #创建了新的字典
print(c) #->输出:{8: None, 6: None, 7: None} d = dic.fromkeys([6,7,8],"test") #初始化字典创建
print(d) #->输出:{8: 'test', 6: 'test', 7: 'test'}
e = dic.fromkeys([9,10,11],[1,{"name":'wanghui'},1234])
print(e) #->输出:{9: [1, {'name': 'wanghui'}, 1234], 10: [1, {'name': 'wanghui'}, 1234], 11: [1, {'name': 'wanghui'}, 1234]}
嵌套字典:
dic={
"甘肃省 ":{
'张掖市':['甘州区','民乐县','山丹县','高台县'],
'武威市':['凉州区','古浪县','民勤县'],
'酒泉市':['敦煌市','玉门市','肃州区']
},
"山东省":{
'潍坊市':['寒亭区','高密市','寿光市','昌乐县'],
'济南市':['长清区','历下区','禹城市'],
'青岛市':['即墨市','黄岛区','崂山区']
},
"陕西省":{
'西安市':['未央区','长安区','雁塔区','新城区'],
'咸阳市':['秦都区','渭城区','礼泉县'],
'安康市':['汉阴县','白河县','紫阳县']
}
}
dic['陕西省']['西安市'][2]="碑林区" #修改操作
print(dic)
print(dic.values())
dic.setdefault('台湾省',{'baidu.com':[1,2,3]}) #设置默认值
print(dic)
课堂程序
程序:购物车程序
需求:
- 启动程序后,让用户输入工资,然后打印商品列表
- 允许用户根据商品编号购买商品
- 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
- 可随时退出,退出时,打印已购买商品和余额
#!/usr/bin/env python
# -*- coding:utf-8 -*-
product_list = [
('Iphone',5800),
('Mac Pro',9800),
('Bike',800),
('Watch',10600),
('Coffee',31),
('Alex Python',120),
]
shopping_list = []
salary = input("Please input your salary:")
if salary.isdigit():
salary=int(salary)
while True:
for num,item in enumerate(product_list):
print(num,item)
user_choice = input("Please choice your item:")
if user_choice.isdigit():
user_choice=int(user_choice)
if user_choice < len(product_list) and user_choice >= 0:
p_item = product_list[user_choice]
if p_item[1] <= salary:
shopping_list.append(p_item)
salary -= p_item[1]
print("added %s into shopping car,your current balence is \033[31;1m%s\033[0m" %(p_item,salary))
else:
print("your money is not enough to buy,you have \033[41;1m%s\033[0m left" %(salary))
else:
print("your choice %s is out of shopping_list" %(user_choice))
elif user_choice == 'q':
print("shopping_list".center(50,"*"))
for i in shopping_list:
print(i)
print("your current balence:",salary)
exit()
else:
print("Invalid option!!")
else:
print("invalid salary!!")
三级菜单程序:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:wanghui
##三级菜单字典定义
zone = {
"甘肃省": {
"张掖市": ["甘州区", "民乐县", "山丹县"],
"武威市": ["凉州区", "古浪县", "民勤县"],
},
"山东省": {
"济南市":["历下区","长清区","禹城市"],
"潍坊市":["昌乐县","潍城区","寒亭区"]
},
"陕西省": {
"西安市":["雁塔区","新城区","未央区"],
"咸阳市":["礼泉县","秦都区","渭城区"]
}
}
##退出循环标志位定义
exit_flag = True
while exit_flag:
for i in zone: #读取第一级菜单
print(i)
choice = input("first,press q to exit:") #第一级菜单输入
if choice == "q":
exit_flag =False
if choice in zone:
while exit_flag:
for i2 in zone[choice]: #第二级菜单读取
print("\t\t",i2)
choice2 = input("second,press b return back and q to quit!!!:") #第二级菜单输入
if choice2 in zone[choice]:
while exit_flag:
for i3 in zone[choice][choice2]:
print("\t\t\t\t",i3)
choice3 = input("last one,press b return back and q to quit!!!") #第三级菜单输入
if choice3 == 'b':
break
elif choice3 == "q":
exit_flag=False
if choice2 == 'b':
break
elif choice2 == 'q':
exit_flag = False
升级版三级菜单(以后可以当模板):
current = zone
last = [] while True:
for i in current:
print(i)
choice = input(">>:")
if len(choice) == 0 :continue
if choice == 'b':
if len(last) == 0:break #防止第一级为空报错,直接退出
current=last[-1] #打印当前一级
last.pop() #往上走一级,就删除当前
if choice not in current:continue
last.append(current) #保存上级菜单
current = current[choice] #当前菜单