元组的定义与使用
1、为什么需要元组
思考
如果想要存储多个数据,但是这些数据是不能修改的数据,怎么做?
答:列表?列表可以一次性存储多个数据,但是列表中的数据允许更改。
num_list = [10, 20, 30]num_list[0] = 100
那这种情况下,我们想要存储多个数据且数据不允许更改,应该怎么办呢?
答:使用元组,元组可以存储多个数据且元组内的数据是不能修改的。
2、元组的定义
元组特点:定义元组使用小括号,且使用逗号隔开各个数据,数据可以是不同的数据类型。
基本语法
# 多个数据元组tuple1 = (10, 20, 30)# 单个数据元组tuple2 = (10,)
注意:如果定义的元组只有一个数据,那么这个数据后面也要添加逗号,否则该变量的数据类型就不是元组了。
3、元组的相关操作方法
由于元组中的数据不允许直接修改,所以其操作方法大部分为查询方法。
案例1
访问元组中的某个元素
nums = (10, 20, 30)print(nums[2])
案例2
查找某个元素在元组中出现的位置,存在则返回索引下标,不存在则直接报错
nums = (10, 20, 30)print(nums.index(20))
案例3
统计某个元素在元组中出现的次数
nums = (10, 20, 30, 50, 30)print(nums.count(30))
案例4
len()
方法主要就是求数据序列的长度,字符串、列表、元组
nums = (10, 20, 30, 50, 30)print(len(nums))
字典——Python中的查询神器
1、为什么需要字典
思考1
比如我们要存储一个人的信息,姓名:Tom,年龄:20周岁,性别:男,如何快速存储。
person = ['Tom', '20', '男']
思考2
在日常生活中,姓名、年龄以及性别同属于一个人的基本特征。但是如果使用列表对其进行存储,则分散为3个元素,这显然不合逻辑。我们有没有办法,将其保存在同一个元素中,姓名、年龄以及性别都作为这个元素的3个属性。
答:使用Python中的字典
2、Python中字典(dict)的概念
特点
符号为大括号(花括号) => {}
数据为键值对形式出现 => {key:value},key:键名,value:值,在同一个字典中,key必须是唯一(类似于索引下标)
各个键值对之间用逗号隔开
基本语法
# 有数据字典dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}# 空字典dict2 = {}dict3 = dict()
3、字典的增操作
基本语法
字典名称[key] = value注:如果key存在则修改这个key对应的值;如果key不存在则新增此键值对。
案例
定义一个空字典,然后添加name、age以及address这样的3个key
# 1、定义一个空字典person = {}# 2、向字典中添加数据person['name'] = '刘备'person['age'] = 40person['address'] = '蜀中'# 3、使用print方法打印person字典print(person)
注意:列表、字典为可变类型
4、字典的删操作
del 字典名称[key]:删除指定元素# 1、定义一个有数据的字典person = {'name':'王大锤', 'age':28, 'gender':'male', 'address':'北京市海淀区'}# 2、删除字典中的某个元素(如gender)del person['gender']# 3、打印字典print(person)
clear()方法:清空字典中的所有key
# 1、定义一个有数据的字典person = {'name':'王大锤', 'age':28, 'gender':'male', 'address':'北京市海淀区'}# 2、使用clear()方法清空字典person.clear()# 3、打印字典print(person)
5、字典的改操作
基本语法
字典名称[key] = value注:如果key存在则修改这个key对应的值;如果key不存在则新增此键值对。
案例:定义一个字典,里面有name、age以及address,修改address这个key的value值
# 1、定义字典person = {'name':'孙悟空', 'age': 600, 'address':'花果山'}# 2、修改字典中的数据(address)person['address'] = '东土大唐'# 3、打印字典print(person)
6、字典的查操作
查询方法:使用具体的某个key查询数据,如果未找到,则直接报错。字典序列[key]
② 字典的相关查询方法
案例1
使用get获取字典中某个key的value值
# 1、定义一个字典cat = {'name':'Tom', 'age':5, 'address':'美国纽约'}# 2、获取字典的相关信息name = cat.get('name')age = cat.get('age')gender = cat.get('gender', 'male') # get(key, 默认值)address = cat.get('address')print(f'姓名:{name},年龄:{age},性别:{gender},住址:{address}')
案例2
提取person字典中的所有key
# 1、定义一个字典person = {'name':'貂蝉', 'age':18, 'mobile':'13765022249'}# 2、提取字典中的name、age以及mobile属性print(person.keys())
案例3
提取person字典中的所有value值
# 1、定义一个字典person = {'name':'貂蝉', 'age':18, 'mobile':'13765022249'}# 2、提取字典中的貂蝉、18以及13765022249号码print(person.values())
案例4
使用items()方法提取数据
# 1、定义一个字典person = {'name':'貂蝉', 'age':18, 'mobile':'13765022249'}# 2、调用items方法获取数据,dict_items([('name', '貂蝉'), ('age', 18), ('mobile', '13765022249')])# print(person.items())# 3、结合for循环对字典中的数据进行遍历for key, value in person.items():print(f'{key}:{value}')
集合——求交集、并集、差集
1、什么是集合
集合(set)是一个无序的不重复元素序列。
去重无序
2、集合的定义
在Python中,我们可以使用一对花括号{}或者set()方法来定义集合,但是如果你定义的集合是一个空集合,则只能使用set()方法。
# 定义一个集合s1 = {10, 20, 30, 40, 50}print(s1)print(type(s1))# 定义一个集合:集合中存在相同的数据s2 = {'刘备', '曹操', '孙权', '曹操'}print(s2)print(type(s1))# 定义空集合s3 = {}s4 = set()print(type(s3)) # <class 'dict'>print(type(s4)) # <class 'set'>
3、集合操作的相关方法(增删查)
☆ 集合的增操作
add()方法
向集合中增加一个元素(单一)
students = set()students.add('李哲')students.add('刘毅')print(students)
update()方法
向集合中增加序列类型的数据(字符串、列表、元组、字典)
students = set()list1 = ['刘备', '关羽', '赵云']students.update(list1)print(students)
students = set()students.add('刘德华')students.add('黎明')# 使用update新增元素students.update('蔡徐坤')
☆ 集合的删操作
remove()方法
删除集合中的指定数据,如果数据不存在则报错。
discard()方法
删除集合中的指定数据,如果数据不存在也不会报错。
pop()方法
随机删除集合中的某个数据,并返回这个数据。
# 1、定义一个集合products = {'萝卜', '白菜', '水蜜桃', '奥利奥', '西红柿', '凤梨'}# 2、使用remove方法删除白菜这个元素products.remove('白菜')print(products)# 3、使用discard方法删除未知元素products.discard('玉米')print(products)# 4、使用pop方法随机删除某个元素del_product = products.pop()print(del_product)
☆ 集合中的查操作
in
判断某个元素是否在集合中,如果在,则返回True,否则返回False
not in
判断某个元素不在集合中,如果不在,则返回True,否则返回False
# 定义一个set集合s1 = {'刘帅', '英标', '高源'}# 判断刘帅是否在s1集合中if '刘帅' in s1:print('刘帅在s1集合中')else:print('刘帅没有出现在s1集合中')
集合的遍历操作
for i in 集合:print(i)
4、集合中的交集、并集与差集特性
在Python中,我们可以使用&
来求两个集合的交集:在Python中,我们可以使用|
来求两个集合的并集:
在Python中,我们可以使用-
来求两个集合的差集:
# 求集合中的交集、并集、差集s1 = {'刘备', '关羽', '张飞', '貂蝉'}s2 = {'袁绍', '吕布', '曹操', '貂蝉'}# 求两个集合中的交集print(s1 & s2)# 求两个集合中的并集print(s1 | s2)# 求连个集合中的差集print(s1 - s2)print(s2 - s1)
数据序列中的公共方法
1、什么是公共方法
所谓的公共方法就是支持大部分数据序列。
2、常见公共方法1
案例1
合并:+
# 1、+加号,代表两个序列之间的连接与整合str1 = 'hello'str2 = 'world'print(str1 + str2)# 2、定义两个列表,对其数据进行整合list1 = ['刘备', '关羽']list2 = ['诸葛亮', '赵云']print(list1 + list2)# 3、定义两个元组,对其数据进行整合tuple1 = (10, 20)tuple2 = (30, 40)print(tuple1 + tuple2)
案例2
复制:*
# 1、字符串与乘号的关系print('-' * 40)print('Python管理系统V1.0')print('-' * 40)# 2、列表与乘号的关系list1 = ['*']print(list1 * 10)# 3、元组与乘号的关系tuple1 = (10, )print(tuple1 * 10)
案例3
in
与not in
方法
ips = ['192.168.10.11', '10.1.1.100', '172.15.184.31']if '10.1.1.100' in ips:print('列表中元素已存在')else:print('列表中元素不存在')
3、常见公共方法2
案例1
len()
获取字符串、列表、元组、字典、集合的长度
# 定义一个字符串str1 = 'hello world'print(f'字符串的长度为{len(str1)}')# 定义一个列表list1 = [10, 20, 30, 40, 50]print(f'列表的长度为{len(list1)}')# 定义一个字典dict1 = {'name':'哆啦A梦', 'gender':'male', 'address':'东京'}print(f'字典的长度为{len(dict1)}')
案例2
del
方法,用于删除序列中指定的元素(根据索引下标)
# 定义一个列表list1 = ['吕布', '董卓', '貂蝉']# 使用del方法删除董卓del list1[1]print(list1)# 定义一个字典dict1 = {'name':'白龙马', 'age':23, 'address':'东海龙宫'}# 使用del方法删除agedel dict1['age']print(dict1)
案例3
求某个序列中元素的最大值和最小值
num1 = int(input('请输入第一个数:'))num2 = int(input('请输入第二个数:'))num3 = int(input('请输入第三个数:'))list1 = [num1, num2, num3]max_num = max(list1)min_num = min(list1)print(f'最大值:{max_num}')print(f'最小值:{min_num}')
案例4
enumerate()
,把一个序列类型的数据构造成 k e y : v a l u e key:value key:value结构,然后结合for循环进行遍历
list1 = [10, 20, 30, 40, 50]n = 1for i in list1:print(f'第{n}个数:{i}')n += 1print('-' * 40)for key, value in enumerate(list1):print(f'第{key+1}个数:{value}')
4、序列类型之间的相互转换
list()方法
把某个序列类型的数据转化为列表
# 1、定义元组类型的序列tuple1 = (10, 20, 30)print(list(tuple1))# 2、定义一个集合类型的序列set1 = {'a', 'b', 'c', 'd'}print(list(set1))# 3、定义一个字典dict1 = {'name':'刘备', 'age':18, 'address':'蜀中'}print(list(dict1))
tuple()方法
把某个序列类型的数据转化为元组
# 定义一个列表类型的数据list1 = ['a', 'b', 'c', 'd']print(tuple(list1))# 定义一个集合类型的数据set1 = {10, 20, 30, 40}print(tuple(set1))
set()方法
将某个序列转换成集合,但是要注意两件事:
集合可以快速完成列表去重集合不支持下标
# 定义一个列表类型的数据list1 = ['a', 'b', 'c', 'd', 'a']print(set(list1))# 定义一个元组类型的数据tuple1 = (10, 20, 30, 40)print(set(tuple1))
列表集合字典推导式
1、什么是推导式
推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列(一个有规律的列表或控制一个有规律列表)的结构体。 共有三种推导:列表推导式
、集合推导式
、字典推导式
。
例如:可以通过推导式从一个列表 [ 1 , 2 , 3 ] [1, 2, 3] [1,2,3]构建出另一个列表 [ 1 , 4 , 9 ] [1, 4, 9] [1,4,9]。
2、为什么需要推导式
案例
使用while循环创建一个0-9的列表:
# 初始化计数器i = 0list1 = []# 编写循环条件while i <= 9:list1.append(i)# 更新计数器i += 1print(list1)
使用for循环:
list1 = []# 编写for循环for i in range(0, 10):list1.append(i)print(list1)
思考:我们能不能把以上代码简化为一行代码搞定这个程序呢?
答:可以,使用推导式。
3、列表推导式
基本语法
变量名 = [表达式 for 变量 in 列表 for 变量 in 列表]变量名 = [表达式 for 变量 in 列表 if 条件]
案例
定义0-9之间的列表
list1 = []for i in range(10):list1.append(i)print(list1)
列表推导式
list1 = [i for i in range(10)]print(list1)
执行原理
[i for i in range(10)]
列表推导式先运行表达式右边的内容:
当第一次遍历时:i = 0,其得到变量i的结果后,会放入最左侧的变量i中,这个时候列表中就是[0]当第二次遍历时:i = 1,其得到变量i的结果后,会追加最左侧的变量i中,这个时候列表中就是[0, 1]…当最后一次遍历时:i = 9,其得到变量i的结果后,会追加最左侧的变量i中,这个时候列表中就是[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4、列表推导式 + if条件判断
在使用列表推导式时候,我们除了可以使用for循环,其实我们还可以在其遍历的过程中,引入if条件判断。
#变量 = [表达式 for 临时变量 in 序列 if 条件判断]#等价于for 临时变量 in 序列:if 条件判断
案例
生成0-9之间的偶数(i%2 == 0)序列
list1 = [i for i in range(10) if i % 2 == 0]print(list1)
5、for循环嵌套列表推导式
for 临时变量 in range(n):for 临时变量 in range(n):
基本语法
变量 = [表达式 for 临时变量 in 序列 for 临时变量 in 序列]
案例
创建列表: [(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
for循环嵌套实现:
list1 = []# 外层循环for i in range(1, 3):# 内层循环for j in range(0, 3):tuple1 = (i, j)list1.append(tuple1)print(list1)
列表推导式:
list1 = [(i, j) for i in range(1, 3) for j in range(0, 3)]print(list1)
6、字典推导式
思考
有如下两个列表,如何快速合并为一个字典?
list1 = ['name', 'age', 'gender']list2 = ['Tom', 20, 'male']person = {'name':'Tom', 'age':20, 'gender':'male'}
答:使用字典推导式。字典推导式列表推导式思想的延续,语法差不多,只不过产生的是字典而已。
基本语法
变量 = {key:value for key,value in 序列}
字典推导式作用
快速合并列表为字典或提取字典中目标数据。
案例1
创建一个字典:字典key是1-5数字,value是这个数字的2次方。
# dict1 = {1:1, 2:4, 3:9, 4:16, 5:25}dict1 = {i:i**2 for i in range(1,6)}print(dict1)
案例2
把两个列表合并为一个字典
list1 = ['name', 'age', 'gender']list2 = ['Tom', 20, 'male']# 结果:person = {'name':'Tom', 'age':20, 'gender':'male'}person = {list1[i]:list2[i] for i in range(len(list1))}print(person)
案例3
提取字典中目标数据
counts = {'MBP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'ACER': 99}# 需求:提取上述电脑数量大于等于200的字典数据counts = {key:value for key, value in counts.items() if value >= 200}print(counts)
7、集合推导式
集合推导式跟列表推导式非常相似,唯一区别在于用{ }
代替[ ]
。
思考:为什么需要集合推导式,列表推导式不香么?
答:集合的最大特点就是去重
需求
创建一个集合,数据为下方列表的2次方。
list1 = [1, 1, 2]set1 = {1, 4}
推导式
list1 = [1, 1, 2]set1 = {i**2 for i in list1}print(set1)
作业
编写通讯录管理系统
必须手工完成编写,只需要实现增加、删除、退出功能。
# 输出程序功能菜单print('-' * 40)print("欢迎使用学生通讯管理系统v1.0")print("[1] 增加学员信息")print("[2] 删除学员信息")print("[3] 打印学员信息")print("[4] 退出系统")print('-' * 40)students = []while True:n = int(input("请重新输入要操作的编号[1 - 4]:"))if n == 1:code = input("请输入学员学号:")name = input("请输入学员姓名:")tel = input("请输入学员电话:")s = {"code": code, "name": name, "tel": tel}students.append(s)print(students)elif n == 2:code = input("请输入待删除的学号:")# 遍历列表,查找待删除的学员for s in students:if s["code"] == code:students.remove(s)print("删除成功")breakelse:print("没有该学号的学生,删除失败!")elif n == 3:for x in students:print("学号:%s\t姓名:%s\t电话:%s\n" % (x["code"], x["name"], x["tel"]))elif n == 4:print('欢迎使用学生通讯管理系统v1.0')breakelse:print('输入错误,请重新输入要操作的编号')