Python3学习笔记之数据类型常用功能详解
1. python几种数据类型的比较
1. 是否可变。
不可变类型:变量的值可以发生变化,id也变了,相当于创建了一个新的对象,所以一修改值,id就变了,这种类型称之为不可变类型。
可变类型:变量的值可以发生变化,而且 id不会变,所以称之为可变类型。
#数字类型样例 x=10 print (id(x)) 输出:1374668752 #修改x的值为100,看看id变了吗? x=100 print (id(x)) 输出:1374671632 可以看到值修改了,id也变了,无法做到修改值,而保持id不变,所以数字类型属于不可变类型。 #字符串样例: x='yangjianbo' print(x,id(x)) #修改x的值,两个id比较一下,是否相同。 x='wangyanhe' print(x,id(x)) 输出的结果: 发现字符串的值被修改了,同时它的id也发生了变化,说明是产生了一个新的引用,所以字符串类型也是不可变类型。 # 列表样例: x = ['yangjianbo', 'wangyanhe', 'gaozhongmin'] print (x, id(x)) # 修改一下某个元素,看看列表x,id是否变化。 x[0] = 'gushuwei' print (x, id(x)) 输出的结果: ['yangjianbo', 'wangyanhe', 'gaozhongmin'] 37527688 ['gushuwei', 'wangyanhe', 'gaozhongmin'] 37527688 结论:修改列表中的某个元素,不会影响整个列表的id,所以列表属于可变类型。 # 元组样例: x = ('yangjianbo', 'wangyanhe', 'gaozhongmin') print (x, id(x)) x[0] = 'gushuwei' print (x, id(x)) 输出结果:直接报错,因为元组只可读,不能写。 结论:元组是不可变类型。 # 字典 x = {'name': 'yangjianbo', 'age': 10, 'bumen': 'xitongbu'} print (x, id(x)) x['name'] = 'wangyanhe' print (x, id(x)) 输出结果: {'name': 'yangjianbo', 'age': 10, 'bumen': 'xitongbu'} 31218928 {'name': 'wangyanhe', 'age': 10, 'bumen': 'xitongbu'} 31218928 结论:字典的值可以修改,而且id不会发生变化,所以字典属于可变类型。
最终结论:
可变类型:字典和列表
不可变类型:数字,字符串,元组
2. 有序或无序。
有序和无序,数据类型能否按照索引的方式,读出数据。
#数字类型 x=10 print (x[0]) 结论:报错了,数字类型,无法使用索引读出,它不是一个有序的数据类型。 #字符串 x='aabbcc4455' print (x[9]) 结论:字符串可以通过索引读取字符串中的字符,字符串是有序的数据类型。 #列表 x=['yangjianbo','wangyanhe','gaozhongmin'] print (x[0]) 结论:列表读取某个元素,必须指定元素的索引,所以列表是有序的数据类型。 #元组 x=('yangjianbo','wangyanhe','gaozhongmin') print (x[0]) 结论:元组读取某个元素,必须指定元素的索引,所以元组是有序的数据类型。 #字典 x={'name':'yangjianbo','age':10,'bumen':'xitongbu'} print (x['name']) 结论:字典读取其中的某个值,必须指定键名称,不能按照索引进行读取。所以字典不是有序的数据类型。
最终结论:
有序类型:字符串,列表,元组
无序类型:数字,字典
3. 是否可读写。
除了元组不可写,其他类型都支持读写。
4. 存一个值还是多个值。
数字类型只有一个值
字符串也只有一个值
列表多个值
元组多个值
字典多个值
2. 数字类型的一些功能
两个变量交换数值。 x=10 y=20 print (x,id(x)) print (y,id(y)) x,y=y,x print (x,id(x)) print (y,id(y)) 输出结果: 10 8791457912128 20 8791457912448 20 8791457912448 10 8791457912128 将多个变量引用到一个值上。 x=y=z=100 print (x,y,z,id(x),id(y),id(z)) 结果都一样
3. 字符串的一些功能
查看字符串长度
x='aaa11111' print (len(x))
字符串切片
x='abc12345ABC' print (x[1:9:3]) 第一个数字1表示从索引1开始, 第二个数字9表示到第9-1索引结束 第三个数字3表示步长,从索引1开始数,三步一个。 输出的结果:b25
成员运算符
x='abc12345ABC' print ('A' in x) print ('B' not in x) 输出的结果 True False
移除空格
使用字符串的函数strip() lstrip() rstrip()
strip()默认移除的是字符串两边空白符,\t \r \n.
name = " yangjianbo" print (name) name=name.strip() print (name)
输出的yangjianbo,没有前面的空白。
name = "yangjianbo*****"
name=name.strip('*')
print (name)
输出的结果:忽略*号字符。
name = "yangjianbo*****"
name=name.strip('an')
print (name)
输出的结果:我要忽略an,这个an字符在整个字符串的中间部分,而不是两头,结果输出的结果依然是原来的值
结论:中间的字符不能被忽略,只能忽略头和尾的字符。
分割
x='I am yang jian bo !' print (x.split(' ',1)) 输出结果:split函数第一个参数是以哪个分隔符进行切割(默认为空格,\r \n \t),第二个参数是要求分成几份。 也可以只指定第一个参数,会以最大的份数分割,分割成列表数据类型。 ['I', 'am yang jian bo !']
以字符开头
x='I am yang jian bo !' print (x.startswith('yang',5,11)) 输出的结果: True startswith函数的意思是:是不是以指定的字符串开头的,第一个参数是你要查找的字符串,第二个参数是你要从哪个索引开始查,第三个参数是指你到哪个索引结束。返回的值是布尔值。正确则为true,则为false.
以字符结尾
x='I am yang jian bo !' print (x.endswith('yang',5,11)) 输出结果: False endswith函数是用来检测是不是以指定的字符串结尾的,参数设置与startswith相同,返回值也是一样的。
替换
x='I am yang jian bo !' print (x.replace('a','b',2)) 输出的结果:I bm ybng jian bo ! replace函数用来替换指定的字符串,第一个参数指定旧的字符串,第二个参数指定新的字符串,第三个参数指定要替换几个字符串。
小写改大写
x='I am yang jian bo !' print (x.upper()) 输出的结果:I AM YANG JIAN BO !
将字符串中的小写字母改为大写字母。
将结果改为小写
x='I am yang jian bo !' print (x.lower()) 输出的结果:i am yang jian bo !
将字符串中的大写字母改为小写字母。
查找字符对应的索引
x='I am yang jian bo !' print (x.index("a")) 输出的结果:将第一个匹配的字符串对应的索引打印出。
判断字符串是不是只包含数字
password=input("输入密码:") if not password.isdigit() : print ("请输入正确密码,只包含数字!") else: print ("登录成功!") 输出的结果:如果输入字母,会报错。
同理is类型的函数还有
string.isalnum() 如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False string.isalpha() 如果字符串至少有一个字符并且所有字符都是字母则返回 True,否则返回 False string.isdecimal() 如果 string 只包含十进制数字则返回 True 否则返回 False.
字符串的join函数
l=['True','or','False'] s=' ' res=s.join(l) print(res,type(res)) 结果: True or False <class 'str'> 结论: Python join() 方法用于将列表中的元素以指定的字符连接生成一个新的字符串。
4. 列表
长度
x=['yangjianbo','wangyanhe','gaozhongmin'] print (len(x)) 输出结果: 3
切片
x=['yangjianbo','wangyanhe','gaozhongmin'] print (x[1:3]) 输出的结果:['wangyanhe', 'gaozhongmin'] 切片的顺序其实跟步长有关系,默认步长为1。 从列表索引1开始,到索引3(不包括)结束。 x=['yangjianbo','wangyanhe','gaozhongmin','gushuwei','liudehua','zhangxueyou'] print (x[-3:-1]) 输出结果:['gushuwei', 'liudehua'] 从列表索引-1开始(不包括),到索引-3(包括)结束。一定要写成-3:-1,写反的话,会返回空列表。
翻转
num=[1,2,3,4,5,6,7] print (num[::-1]) 输出结果:[7, 6, 5, 4, 3, 2, 1]
追加
x=['yangjianbo','wangyanhe','gaozhongmin'] x.append('gushuwei') print (x) 输出的结果:['yangjianbo', 'wangyanhe', 'gaozhongmin', 'gushuwei'] append()函数在列表的最后追加一个新的元素,append()函数不会有返回值。返回None。
删除
x=['yangjianbo','wangyanhe','gaozhongmin'] print (x.pop(2)) 输出结果:gaozhongmin pop()函数的参数是索引 pop删除并返回值 x=['yangjianbo','wangyanhe','gaozhongmin','wang','gaozhongmin'] print (x.remove('gaozhongmin')) print (x) 输出结果:None ['yangjianbo', 'wangyanhe', 'wang', 'gaozhongmin'] remove()函数的参数是元素的值 remove删除元素,但是不会返回值
更新
x=['yangjianbo','wangyanhe','gaozhongmin'] x[1]='zhangxueyou' print (x) 输出结果:['yangjianbo', 'zhangxueyou', 'gaozhongmin']
排序
练习题
1. 有列表data=['alex',49,[1900,3,18]],分别取出列表中的名字,年龄,出生的年,月,日赋值给不同的变量
data=['alex',49,[1900,3,18]] name=data[0] age=data[1] birth=data[2] print (name,age,birth[0],birth[1],birth[2]) 输出结果:alex 49 1900 3 18
2. 用列表模拟队列
队列要求就是:先进先出,后进后出。
num=[] 先创建一个空的列表 num.append(1) 往空的列表追加一个1 num.append(2) 再追加一个2 num.append(3) 再追加一个3 num.append(4) 再追加一个4 num.pop(0) 删除第一个元素 num.pop(0) 删除第一个元素 num.pop(0) 删除第一个元素 num.pop(0) 删除第一个元素 print (num) 以上就相当于先进先出。
3. 用列表模拟堆栈
先进后出,后进先出
num=[] num.append(1) num.append(2) num.append(3) num.append(4) num.pop(-1) num.pop(-1) num.pop(-1) num.pop(-1) print (num)
5. 元组
长度
读取
切片
成员运算in或者not in
元组与列表相同
6. 字典
键值要成对。
键必须为不可变类型,所以键不能为列表。值可以为任意类型。
读取
xitongbu={'name':'yangjianbo','age':30,'zhiwei':'gongchengshi'} print (xitongbu['name']) 输出的结果:yangjianbo 字典查询,需要按照键查找,不能按照索引,因为字典是无序的。
长度
xitongbu={'name':'yangjianbo','age':30,'zhiwei':'gongchengshi'} print (len(xitongbu)) 输出的结果:3 显示字典有几对键值。
成员in not in
xitongbu={'name':'yangjianbo','age':30,'zhiwei':'gongchengshi'} print ('name' in xitongbu) 输出的结果:True 字典只能查看键是不是成员,而不能看值。
添加键值
xitongbu={'name':'yangjianbo','age':30,'zhiwei':'gongchengshi'} xitongbu['gongzi']=20000 print (xitongbu) 输出结果:{'name': 'yangjianbo', 'age': 30, 'zhiwei': 'gongchengshi', 'gongzi': 20000}
删除某个键
xitongbu={'name':'yangjianbo','age':30,'zhiwei':'gongchengshi'} xitongbu['gongzi']=20000 del xitongbu['zhiwei'] print (xitongbu) 输出结果:{'name': 'yangjianbo', 'age': 30, 'gongzi': 20000}
删除整个字典
xitongbu={'name':'yangjianbo','age':30,'zhiwei':'gongchengshi'} xitongbu['gongzi']=20000 del xitongbu print (xitongbu) 输出的结果:NameError: name 'xitongbu' is not defined 删除xitongbu,变量都不存在了。
清空整个字典
xitongbu={'name':'yangjianbo','age':30,'zhiwei':'gongchengshi'} xitongbu['gongzi']=20000 xitongbu.clear() print (xitongbu) 输出的结果:{} 字典被清空,但是变量还在。
字典常用的方法
清空 dic.clear() 删除键并返回值 dic.pop() xitongbu={'name':'yangjianbo','age':30,'zhiwei':'gongchengshi'} xitongbu['gongzi']=20000 print (xitongbu.pop('gongzi')) print (xitongbu) 输出的结果:{'name': 'yangjianbo', 'age': 30, 'zhiwei': 'gongchengshi'} 使用pop函数删除键,会有返回值。 打印键 dic.keys() xitongbu={'name':'yangjianbo','age':30,'zhiwei':'gongchengshi'} xitongbu['gongzi']=20000 print (xitongbu.keys()) print ('name' in xitongbu.keys()) 输出的结果:字典的所有键会被打印出 打印值 dic.values() xitongbu={'name':'yangjianbo','age':30,'zhiwei':'gongchengshi'} xitongbu['gongzi']=20000 print (xitongbu.values(),type(xitongbu.values())) print ('gongchengshi' in xitongbu.values()) 输出的结果:打印出的结果是字典所有的值。 打印键和值 dic.items() xitongbu={'name':'yangjianbo','age':30,'zhiwei':'gongchengshi'} xitongbu['gongzi']=20000 print (xitongbu.items(),type(xitongbu.items())) 输出的结果:打印出字典的键和值。
7. 集合
特点:与字典一样采用大括号,但是只有值,没有键。 集合不支持索引。
长度 len()函数
name={'yangjianbo','wangyanhe','gaozhongmin'} print (len(name))
成员in not in
name={'yangjianbo','wangyanhe','gaozhongmin'} if 'yangjian' in name: print ("you are right!") else: print("you are wrong!")
交集 &
name1={'yangjianbo','wangyanhe','gaozhongmin'} name2={'yangjianbo','zhoujianping','liushuang'} print (name1&name2) 输出的结果:是两个集合的相同的部分。
差集 -
name1={'yangjianbo','wangyanhe','gaozhongmin'} name2={'yangjianbo','zhoujianping','liushuang'} print (name1-name2,type(name1-name2)) 输出的结果:谁在前面,就以谁为标准,减去相同的,剩下的就是差集。 name1={'yangjianbo','wangyanhe','gaozhongmin'} name2={'yangjianbo','zhoujianping','liushuang'} print (name2-name1,type(name2-name1)) 输出的结果:顺序不同,最后得到的差集也不同。
并集 |
name1={'yangjianbo','wangyanhe','gaozhongmin'} name2={'yangjianbo','zhoujianping','liushuang'} print (name1|name2) 输出的结果:两个集合合并后的结果,合并后还是一个集合。集合中不能有重复的元素。 {'yangjianbo', 'gaozhongmin', 'wangyanhe', 'liushuang', 'zhoujianping'}
对称差集 ^
name1={'yangjianbo','wangyanhe','gaozhongmin'} name2={'yangjianbo','zhoujianping','liushuang'} print (name2^name1,type(name2^name1)) 输出的结果:{'gaozhongmin', 'wangyanhe', 'zhoujianping', 'liushuang'} <class 'set'>
8. for循环
for循环用来遍历string和list,字典的内容。
遍历字符串 name='yangjianbo' for i in name: print (i) 输出的结果:单个的字符. 遍历列表 name=['yangjianbo','wangyanhe','gaozhongmin'] for i in name: print (i) 输出的结果:输出各个元素。 遍历列表: sites = ["Baidu", "Google","Runoob","Taobao"] for site in sites: if site == "Runoob": print("菜鸟教程!") break print("循环数据 " + site) else: print("没有循环数据!") print("完成循环!") 输出结果:当循环完成时候,才会执行else后面的语句,但是这个for循环不会执行else语句,因为执行被break.
9. 身份运算符
is is not
is与==的不同:is查看对象是否来自一个引用,==比较的是值。
最后文件练习题:
#求出所购买的东西的价格总数。 count=[] with open('a.txt','r') as read_f: for line in read_f: line=line.split(' ') line_count=int(line[1])*int(line[2]) count.append(line_count) if len(count)==5: print(sum(count))
作业一:
#作业一: 三级菜单 #要求: 打印省、市、县三级菜单 可返回上一级 可随时退出程序
低级版本:
menu = {
'北京':{
'海淀':{
'五道口':{
'soho':{},
'网易':{},
'google':{}
},
'中关村':{
'爱奇艺':{},
'汽车之家':{},
'youku':{},
},
'上地':{
'百度':{},
},
},
'昌平':{
'沙河':{
'老男孩':{},
'北航':{},
},
'天通苑':{},
'回龙观':{},
},
'朝阳':{},
'东城':{},
},
'上海':{
'闵行':{
"人民广场":{
'炸鸡店':{}
}
},
'闸北':{
'火车战':{
'携程':{}
}
},
'浦东':{},
},
'山东':{},
}
while True:
for key1 in menu:
print(key1)
choice1=input('选择>>').strip()
if choice1=='b':break
if not choice1 or choice1 not in menu:continue
while True:
for key2 in menu[choice1]:
print(key2)
choice2=input('选择>>').strip()
if choice2=='b':break
if not choice2 or choice2 not in menu[choice1]:continue
while True:
for key3 in menu[choice1][choice2]:
print(key3)
choice3=input('选择>>').strip()
if choice3=='b':break
if not choice3 or choice3 not in menu[choice1][choice2]:continue
while True:
for key4 in menu[choice1][choice2][choice3]:
print(key4)
choice4=input('选择>>').strip()
if choice4=='b':break
升级版本:
menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, 'youku':{}, }, '上地':{ '百度':{}, }, }, '昌平':{ '沙河':{ '老男孩':{}, '北航':{}, }, '天通苑':{}, '回龙观':{}, }, '朝阳':{}, '东城':{}, }, '上海':{ '闵行':{ "人民广场":{ '炸鸡店':{} } }, '闸北':{ '火车战':{ '携程':{} } }, '浦东':{}, }, '山东':{}, } level=[] while True: for key in menu: print(key) choice=input('选择>>').strip() if choice=='b': if len(level)==0:break menu=level[-1] level.pop() if not choice:continue if choice not in menu:continue level.append(menu) menu=menu[choice]
作业二最终版:
#作业二:请闭眼写出购物车程序 #需求: 用户名和密码存放于文件中,格式为:egon|egon123 启动程序后,先登录,登录成功则让用户输入工资,然后打印商品列表,失败则重新登录,超过三次则退出程序 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买商品和余额
最终代码:
dic={
1:['apple',200],
2:['tesla',2000000],
3:['lenovo',3000]
}
userinfo={'yangjianbo':['123456',20000],'wangyanhe':['abcd',200]}
count=0
while True:
username = input('用户名>>').strip()
if count==3:
print("用户名输入已经3次")
break
elif not username in userinfo:
print("用户名错误")
elif username in userinfo:
password = input('密码>>').strip()
if password!=userinfo[username][0]:
print('用户名密码不正确!')
count+=1
elif password==userinfo[username][0]:
print('登陆成功!')
while True:
choice_dic={'购物车':1,'查看余额':2,'退出':3}
print(choice_dic)
choice_type=int(input('请输入您的选择:'))
if choice_type==choice_dic['购物车']:
print(dic)
while True:
choice = input('请输入您要购买的物品的编号>>').strip()
if choice=='exit':
exit()
elif not choice.isdigit(): continue
for id, product in dic.items():
choice = int(choice)
if choice == id:
print('确认要购买%s吗?' % product[0])
quren = input('是否购买 y/n:').strip()
if quren in ('yes' or 'y'):
userinfo[username][1] = int(userinfo[username][1])
if userinfo[username][1] > product[1]:
userinfo[username][1] = userinfo[username][1] - product[1]
print('您已经购买了%s! 您的余额还有%s元!' % (product[0],userinfo[username][1]))
else:
print('您的余额不足,请尽快充值!')
elif quren in ('no' or 'n'):
break
elif choice_type==choice_dic['查看余额']:
print('您的余额是%s元' % userinfo[username][1])
elif choice_type==choice_dic['退出']:
exit()
一往无前虎山行,拨开云雾见光明