python 1.8 数据类型 元组 +集合
2.元组
列表(list),是一个有序且可变的容器,在里面可以存放多个不同类型的元素。
元组(tuple),是一个有序且不可变的容器,在里面可以存放多个不同类型的元素。
如何体现不可变呢?
记住一句话:《"我儿子永远不能换成是别人,但我儿子可以长大"》
2.1 定义
v1 = (11,22,33)
v2 = ("李杰","Alex")
v3 = (True,123,"Alex",[11,22,33,44])
# 建议:议在元组的最后多加一个逗v3 = ("李杰","Alex",)
d1 = (1) # 1
d2 = (1,) # (1,)
d3 = (1,2)
d4 = (1,2)
注意:建议在元组的最后多加一个逗号,用于标识他是一个元组。
# 面试题
1. 比较值 v1 = (1) 和 v2 = 1 和 v3 = (1,) 有什么区别?
2. 比较值 v1 = ( (1),(2),(3) ) 和 v2 = ( (1,) , (2,) , (3,),) 有什么区别?
(1,2,3)
2.2 独有功能
无
2.3 公共功能
-
相加,两个列表相加获取生成一个新的列表。
data = ("赵四","刘能") + ("宋晓峰","范德彪") print(data) # ("赵四","刘能","宋晓峰","范德彪") v1 = ("赵四","刘能") v2 = ("宋晓峰","范德彪") v3 = v1 + v2 print(v3) # ("赵四","刘能","宋晓峰","范德彪") -
相乘,列表*整型 将列表中的元素再创建N份并生成一个新的列表。
data = ("赵四","刘能") * 2 print(data) # ("赵四","刘能","赵四","刘能") v1 = ("赵四","刘能") v2 = v1 * 2 print(v1) # ("赵四","刘能") print(v2) # ("赵四","刘能","赵四","刘能") -
获取长度
user_list = ("范德彪","刘华强",'尼古拉斯赵四',) print( len(user_list) ) -
索引
user_list = ("范德彪","刘华强",'尼古拉斯赵四',) print( user_list[0] ) print( user_list[2] ) print( user_list[3] ) -
切片
user_list = ("范德彪","刘华强",'尼古拉斯赵四',) print( user_list[0:2] ) print( user_list[1:] ) print( user_list[:-1] ) -
步长
user_list = ("范德彪","刘华强",'尼古拉斯赵四',"宋小宝","刘能") print( user_list[1:4:2] ) print( user_list[0::2] ) print( user_list[1::2] ) print( user_list[4:1:-1] )# 字符串 & 元组。 user_list = ("范德彪","刘华强",'尼古拉斯赵四',"宋小宝","刘能") data = user_list[::-1] # 列表 user_list = ["范德彪","刘华强",'尼古拉斯赵四',"宋小宝","刘能"] data = user_list[::-1] user_list.reverse() print(user_list) -
for循环
user_list = ("范德彪","刘华强",'尼古拉斯赵四',"宋小宝","刘能") for item in user_list: print(item)user_list = ("范德彪","刘华强",'尼古拉斯赵四',"宋小宝","刘能") for item in user_list: if item == '刘华强': continue print(name)目前:只有 str、list、tuple 可以被for循环。 "xxx" [11,22,33] (111,22,33)
# len + range + for + 索引 user_list = ("范德彪","刘华强",'尼古拉斯赵四',"宋小宝","刘能") for index in range(len(user_list)): item = user_list[index] print(item)
2.4 转换
其他类型转换为元组,使用tuple(其他类型),目前只有字符串和列表可以转换为元组。
data = tuple(其他)
# str / list
name = "武沛齐"
data = tuple(name)
print(data) # 输出 ("武","沛","齐")
name = ["武沛齐",18,"pythonav"]
data = tuple(name)
print(data) # 输出 ("武沛齐",18,"pythonav")
2.5 其他
2.5.1 嵌套
由于元组和列表都可以充当容器,他们内部可以放很多元素,并且也支持元素内的各种嵌套。
tu = ( '今天姐姐不在家', '姐夫和小姨子在客厅聊天', ('姐夫问小姨子税后多少钱','小姨子低声说道说和姐夫还提钱') )
tu1 = tu[0]
tu2 = tu[1]
tu3 = tu[2][0]
tu4 = tu[2][1]
tu5 = tu[2][1][3]
print(tu1) # 今天姐姐不在家
print(tu2) # 姐夫和小姨子在客厅聊天
print(tu3) # 姐夫问小姨子税后多少钱
print(tu4) # 小姨子低声说道说和姐夫还提钱
练习题1:判断是否可以实现,如果可以请写代码实现。
li = ["alex", [11,22,(88,99,100,),33], "WuSir", ("ritian", "barry",), "wenzhou"]
# 0 1 2 3 4
# 1.请将 "WuSir" 修改成 "武沛齐"
li[2] = "武沛齐"
index = li.index("Wusir")
li[index] = "武沛齐"
# 2.请将 ("ritian", "barry",) 修改为 ['日天','日地']
li[3] = ['日天','日地']
# 3.请将 88 修改为 87
li[1][2][0] = 87 # (报错,)
# 4.请将 "wenzhou" 删除,然后再在列表第0个索引位置插入 "周周"
# li.remove("wenzhou")
# del li[-1]
li.insert(0,"周周")
练习题2:记住一句话:《"我儿子永远不能换成是别人,但我儿子可以长大"》
data = ("123",666,[11,22,33], ("alex","李杰",[999,666,(5,6,7)]) )
# 1.将 “123” 替换成 9 报错
# 2.将 [11,22,33] 换成 "武沛齐" 报错
# 3.将 11 换成 99
data[2][0] = 99
print(data) # ("123",666,[99,22,33], ("alex","李杰",[999,666,(5,6,7)]) )
# 4.在列表 [11,22,33] 追加一个44
data[2].append(44)
print(data) # ("123",666,[11,22,33,44], ("alex","李杰",[999,666,(5,6,7)]) )
练习题3:动态的创建用户并添加到用户列表中。
# 创建用户 5个
# user_list = [] # 用户信息
user_list = [ ("alex","132"),("admin","123"),("eric","123") ]
while True:
user = input("请输入用户名:")
if user == "Q":
brek
pwd = input("请输入密码:")
item = (user,pwd,)
user_list.append(item)
# 实现:用户登录案例
print("登录程序")
username = input("请输入用户名:")
password = input("请输入密码:")
is_success = False
for item in user_list:
# item = ("alex","132") ("admin","123") ("eric","123")
if username == item[0] and password == item[1]:
is_success = True
break
if is_success:
print("登录成功")
else:
print("登录失败")
总结 练习题
-
猜年龄 游戏
# 1. 猜年龄游戏,设置游戏次数,错误的同时计算次数,到达次数退出,正确退出。 age = '22' print("猜年龄游戏开始".center(70,"#")) item =0 while True : item += 1 num = input("苍老师的年龄是多少岁?").strip() if num.isdecimal() != True: print("请输入正确的数字") continue elif num>age or num<age: print(f"答错了,苍老师的年龄不是{num}岁") if item == 3: print(f"答错{item}次了,要不要继续?") code = input("退出继续请按Q/q,继续请按任意键.").strip() if code.upper() == "Q": break else: item = 0 elif num == age: print(f"答对了,苍老师的年龄是{num}岁") break -
用户注册和登录系统
注册用户和密码 是一个元组,追加到列表内 打印出来 user_list = [] key_user = input("请输入要注册的用户名:").strip() key_pwd = input("请输入要注册的密码:").strip() user_duple = (key_user,key_pwd) user_list.append(user_duple) print(f"尊贵的用户{key_user},您的密码是:{key_pwd},请妥善保管!") 输入用户名,登录系统 user_list = [("admin","123456",),("zhangsan","123456",)] print("欢迎登录游戏系统".center(60,"#")) key_user = input("请输入用户名:").strip() key_pwd = input(" 请输入密码:").strip() do_succseee = False for item in range(len(user_list)): if user_list[item][0]==key_user and user_list[item][1] == key_pwd: do_succseee= True if do_succseee: print(f"尊贵的用户{key_user},登录成功!") else: print("用户或密码错误!") ## 登录用户到系统 ,错误三次后锁定 登录admin用户,删除用户,更新密码
总结
- 概述
- 列表,以后写程序会用的非常多,要多些多练。
- 元组,以后写程序用的不是很多,主要以了解其特殊和用法为主。
- 列表和元组的区别。
- 可变类型和不可变类型。
- 列表独有功能 & 公共功能(不用特地去记,多做题目去用,以后每天都会有相关的练习题)。
- 列表和元组等数据的嵌套
- 元组中 (1) 和 (1,) 的区别。
- 元组的元素不能被替换,但元组的元素如果是可变类型,可变类型内部是可以修改的。
作业
-
以下哪些数据类型转换为布尔值为False
1 True "" False -19 True [] False [11,22] True (1) True (1,2,3) True () False -
运算符操作
v1 = [] or "alex" alex v2 = [11,22] and (1,2,) (1,2,) -
比较:
a = [1,2,3]和b = [(1),(2),(3) ]以及c = [(1,),(2,),(3,) ]的区别?a = [1, 2, 3] # 列表 b = [(1),(2),(3) ] # 列表内的元素是整型 c = [(1,),(2,),(3,) ] # 列表内的元素是元组 -
将字符串
text = "wupeiqi|alex|eric"根据|分割为列表,然后列表转换为元组类型。print(tuple(text.split("|"))) -
根据如下规则创建一副扑克牌(排除大小王)。
# 花色列表 color_list = ["红桃","黑桃","方片","梅花"] # 牌值 num_list = [] for num in range(1,14): num_list.append(num) result = [] # 请根据以上的花色和牌值创建一副扑克牌(排除大小王) # 最终result的结果格式为: [ ("红桃",1), ("红桃",2) ... ] # 花色列表 color_list = ["红桃", "黑桃", "方片", "梅花"] # 牌值 result = [] for i in color_list: for num in range(1, 14): color_num = (i,num,) result.append(color_num) print(result) # 请根据以上的花色和牌值创建一副扑克牌(排除大小王) # 最终result的结果格式为: [ ("红桃",1), ("红桃",2) ... ] -
9 9 乘法表
# 打印 9 *9 的乘法表 for i in range(1,10): for j in range(1,i+1): res = i * j if i == j : print(f"{j} * {i} = {res}" ) else: print(f"{j} * {i} = {res}" + " ",end="" )
1.集合(set)
集合是一个 无序 、可变、不允许数据重复的容器。
1.1 定义
v1 = { 11, 22, 33, "alex" }
-
无序,无法通过索引取值。
-
可变,可以添加和删除元素。
v1 = {11,22,33,44} v1.add(55) print(v1) # {11,22,33,44,55} -
不允许数据重复。
v1 = {11,22,33,44} v1.add(22) print(v1) # {11,22,33,44}
一般什么时候用集合呢?
就是想要维护一大堆不重复的数据时,就可以用它。比如:做爬虫去网上找图片的链接,为了避免链接重复,可以选择用集合去存储链接地址。
注意:定义空集合时,只能使用v = set(),不能使用 v={}(这样是定义一个空字典)。
v1 = []
v11 = list()
v2 = ()
v22 = tuple()
v3 = set()
v4 = {} # 空字典
v44 = dict()
1.2 独有功能
-
添加元素
data = {"刘嘉玲", '关之琳', "王祖贤"} data.add("郑裕玲") print(data)data = set() data.add("周杰伦") data.add("林俊杰") print(data) -
删除元素
data = {"刘嘉玲", '关之琳', "王祖贤","张曼⽟", "李若彤"} data.discard("关之琳") print(data) -
交集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s4 = s1.intersection(s2) # 取两个集合的交集 print(s4) # {"⽪⻓⼭"} s3 = s1 & s2 # 取两个集合的交集 print(s3) -
并集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s4 = s1.union(s2) # 取两个集合的并集 {"刘能", "赵四", "⽪⻓⼭","刘科⻓", "冯乡⻓", } print(s4) s3 = s1 | s2 # 取两个集合的并集 print(s3) -
差集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s4 = s1.difference(s2) # 差集,s1中有且s2中没有的值 {"刘能", "赵四"} s6 = s2.difference(s1) # 差集,s2中有且s1中没有的值 {"刘科⻓", "冯乡⻓"} s3 = s1 - s2 # 差集,s1中有且s2中没有的值 s5 = s2 - s1 # 差集,s2中有且s1中没有的值 print(s5,s6)
1.3 公共功能
-
减,计算差集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s3 = s1 - s2 s4 = s2 - s1 print(s3) print(s4) -
&,计算交集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s3 = s1 & s2 print(s3) -
|,计算并集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s3 = s1 | s2 print(s3) -
长度
v = {"刘能", "赵四", "尼古拉斯"} data = len(v) print(data) -
for循环
v = {"刘能", "赵四", "尼古拉斯"} for item in v: print(item)
1.4 转换
其他类型如果想要转换为集合类型,可以通过set进行转换,并且如果数据有重复自动剔除。
提示:int/list/tuple/dict都可以转换为集合。
v1 = "武沛齐"
v2 = set(v1)
print(v2) # {"武","沛","齐"}
v1 = [11,22,33,11,3,99,22]
v2 = set(v1)
print(v2) # {11,22,33,3,99}
v1 = (11,22,3,11)
v2 = set(v1)
print(v2) # {11,22,3}
提示:这其实也是去重的一个手段。
data = {11,22,33,3,99}
v1 = list(data) # [11,22,33,3,99]
v2 = tuple(data) # (11,22,33,3,99)
1.5 其他
1.5.1 集合的存储原理
1.5.2 元素必须可哈希
因存储原理,集合的元素必须是可哈希的值,即:内部通过通过哈希函数把值转换成一个数字。
目前可哈希的数据类型:int、bool、str、tuple,而list、set是不可哈希的。
总结:集合的元素只能是 int、bool、str、tuple 。
-
转换成功
v1 = [11,22,33,11,3,99,22] v2 = set(v1) print(v2) # {11,22,33,3,99} -
转换失败
v1 = [11,22,["alex","eric"],33] v2 = set(v1) # 报错 print(v2)
1.5.3 查找速度特别快
因存储原理特殊,集合的查找效率非常高(数据量大了才明显)。
-
低
user_list = ["武沛齐","alex","李璐"] if "alex" in user_list: print("在") else: print("不在") user_tuple = ("武沛齐","alex","李璐") if "alex" in user_tuple: print("在") else: print("不在") -
效率高
user_set = {"武沛齐","alex","李璐"} if "alex" in user_set: print("在") else: print("不在")
1.5.4 对比和嵌套
| 类型 | 是否可变 | 是否有序 | 元素要求 | 是否可哈希 | 转换 | 定义空 |
|---|---|---|---|---|---|---|
| list | 是 | 是 | 无 | 否 | list(其他) | v=[]或v=list() |
| tuple | 否 | 是 | 无 | 是 | tuple(其他) | v=()或v=tuple() |
| set | 是 | 否 | 可哈希 | 否 | set(其他) | v=set() |
data_list = [
"alex",
11,
(11, 22, 33, {"alex", "eric"}, 22),
[11, 22, 33, 22],
{11, 22, (True, ["中国", "北京"], "沙河"), 33}
]
注意:由于True和False本质上存储的是 1 和 0 ,而集合又不允许重复,所以在整数 0、1和False、True出现在集合中会有如下现象:
v1 = {True, 1}
print(v1) # {True}
v2 = {1, True}
print(v2) # {1}
v3 = {0, False}
print(v3) # {0}
v4 = {False, 0}
print(v4) # {False}
练习题
-
写代码实现
v1 = {'alex','武sir','肖大'} v2 = [] # 循环提示用户输入,如果输入值在v1中存在,则追加到v2中,如果v1中不存在,则添加到v1中。(如果输入N或n则停止循环) while True: name = input("请输入姓名(N/n退出):") if name.upper() == "Q": break if name in v1: v2.append(name) else: v1.add(name) -
下面那些值不能做集合的元素
"" 0 [11,22,33] # 不能 [] # 不能 (123) {1,2,3} # 不能 -
模拟用户信息录入程序,已录入则不再创建。
user_info_set = set() while True: name = input("请输入姓名:") age = input("请输入年龄:") item = (name,age,) if item in user_info_set: print("该用户已录入") else: user_info_set.add(item) -
给你个列表去重。
v = [11,22,11,22,44455] data = set(v) # {11,22,44455} result = list(data) # [11,22,44455]
强插:None类型
Python的数据类型中有一个特殊的值None,意味着这个值啥都不是 或 表示空。 相当于其他语言中 null作用一样。
在一定程度上可以帮助我们去节省内存。例如:
v1 = None
v2 = None
..
v1 = [11,22,33,44]
v2 = [111,22,43]
v3 = []
v4 = []
...
v3 = [11,22,33,44]
v4 = [111,22,43]
注意:暂不要考虑Python内部的缓存和驻留机制。
目前所有转换为布尔值为False的值有:
0
""
[] or list()
() or tuple()
set()
None
if None:
pass
浙公网安备 33010602011771号