0. 序
我年少却不有为
不懂得珍贵却自卑
摘自·网易云音乐《年少有为》·热评
1. 简单认识序列和列表
# 序列
# 序列是Python 中最基本的数据结构,用于保存一组有序的数据,所有数据都在序列中拥有一个唯一索引,并且按照元素添加的顺序来指定序列
# 序列的分类
# 1. 可变序列(序列中的元素可以改变):list
# 2. 不可变序列(序列中的元素不可改变):字符串(str);元祖(tuple)
# 列表的切片和通用操作可以用于所有序列类型
# 创建列表,直接通过[]即可创建一个空列表
my_list = []
print(my_list, type(my_list)) # [] <class 'list'>
# 列表中的一个个数据,一般都称为一个个元素
# 可以在创建列表的时候,直接指定元素,和 java 的 ArrayList 很类似
my_list = [1, 2, 3]
print(my_list) # [1, 2, 3]
# 列表中可以存储任何类型的数据(和 java 严格的数据类型规定不同)
my_list = [1, 'cris', True, None, [123, 321], print]
# [1, 'cris', True, None, [123, 321], <built-in function print>]
print(my_list)
# 类表中的数据插入都是有顺序的,取数据又是根据索引取,和java 的数组一样
print(my_list[0]) # 1
# 可以使用 len()函数获取列表的元素个数
print(len(my_list)) # 6
2. 序列的通用操作
players = ['james', 'curry', 'harden', 'durant', 'rose']
#
# + 和 *
# + 可以将别表拼接,不同列表的元素可以重复
nums = [1, 2, 3] + [3, 4, 5]
print(nums) # [1, 2, 3, 3, 4, 5]
# * 可以对列表进行复制,类似于字符串
names = ['cris', 'james'] * 2
print(names) # ['cris', 'james', 'cris', 'james']
# in 和 not in 可以用来检查元素存在/不存在 列表中
print('davis' in players) # False
print('davis' not in players) # True
# len()用于获取列表长度
# max 和 min 可以用来最大和最小值,数字比较值,字符串比较 Unicode 编码
print(max(nums)) # 5
print(min(nums)) # 1
# 方法和函数基本一致,但是方法需要通过对象.方法名(参数) 来调用,所以方法其实就是
# 和对象关系紧密的函数
# index(x,[start],[end]) 默认用于获取指定元素 x 第一次出现的索引
print(players.index('harden')) # 2
# 从索引为3 的元素开始查找指定元素的索引,结束索引为4,如果在这个范围内没有找到,报错
# print(players.index('harden', 3, 4))
# print(players.index('cris')) # 不存在报错
# count(x) 用于获取指定元素 x 出现的次数
print(players.count('harden')) # 1
print(players.count('cris')) # 0
3. 序列的切片(列表为例)
# 列表的切片:从现有列表获取子列表
players = ['james', 'curry', 'harden', 'durant', 'rose']
players1 = players[1:4] # ['cris', True, None]
print(players1)
# 索引可以是负数,表示倒数向前获取元素,-1 表示倒数第一个,依次类推
players2 = players[-1]
print(players2)
# 如果想要获取列表中的前两个数据:列表中元素的索引都是从0开始,切片范围留头不留尾
print(players[0:2]) # 包括索引为0和1的元素,但是不包括2
print(players) # ['james', 'curry', 'harden', 'durant', 'rose']
# 切片总会返回新的列表,对原列表没有任何影响,除非对原引用重新赋值
# 如果切片的范围没有结束位置,默认截取到最后一个元素
print(players[0:]) # ['james', 'curry', 'harden', 'durant', 'rose']
# 如果切片的范围没有启示位置,默认从第一个元素开始切片
print(players[:3]) # ['james', 'curry', 'harden']
# 如果开始位置和结束位置都省略,相当于复制了一遍原列表
print(players[:]) # ['james', 'curry', 'harden', 'durant', 'rose']
# 可以加入步长参数,默认为1,这里设置为2,表示每隔两个切一个,步长如果为0,则报错
# 步长如果设置为负数,如-1,则从列表的后面倒着取
print(players[::2]) # ['james', 'harden', 'rose']
print(players[::-1]) # ['rose', 'durant', 'harden', 'curry', 'james']
# 以下这种情况切出来为 [],因为列表的顺序默认从开头往末尾切片(或者理解为从左往右)
print(players[-2:-4]) # []
# 如果想要倒着切片(从右往左),那就需要设置步长为负数了
print(players[-2:-4:-1]) # ['durant', 'harden']
print(players[-4:-2]) # ['curry', 'harden']
4. 列表 API 之修改
players = ['james', 'curry', 'harden', 'durant', 'rose']
# 列表的修改
# 1. 通过索引直接修改
players[0] = 'kobe'
print(players) # ['kobe', 'curry', 'harden', 'durant', 'rose']
# 2. 通过del 删除元素
del players[1]
print(players) # ['kobe', 'harden', 'durant', 'rose']
# 3. 通过切片并赋值的形式来修改列表,注意赋值的类型必须是序列,且元素个数不必匹配
players[0:2] = 'str'
print(players) # ['s', 't', 'r', 'durant', 'rose']
players[0:3] = ['towns', 'jordan', 'lavin']
print(players) # ['towns', 'jordan', 'lavin', 'durant', 'rose']
# players[0:2] = 123 # 报错
print(players[0:0]) # []
players[0:0] = ['antony'] # 向索引为0 的元素前面插入新的序列
print(players) # ['antony', 'towns', 'jordan', 'lavin', 'durant', 'rose']
# 设置步长后,替换序列的个数必须和切片的元素个数一致
players[0::2] = [1, 2, 3]
print(players) # [1, 'towns', 2, 'lavin', 3, 'rose']
# 通过切片删除元素
del players[0:2]
print(players) # [2, 'lavin', 3, 'rose']
players[1:2] = []
print(players) # [2, 3, 'rose']
# 通过list()函数将不可变序列转换为可变序列
cris = list('cris')
print(cris) # ['c', 'r', 'i', 's']
cris = list(123) # 报错
5. 列表的常见方法
players = ['james', 'curry', 'harden', 'durant', 'rose']
print('原列表', players) # 原列表 ['james', 'curry', 'harden', 'durant', 'rose']
# append 方法:将元素插入到列表的末尾
players.append('cris')
print(players) # ['james', 'curry', 'harden', 'durant', 'rose', 'cris']
# insert 方法:向列表的指定位置插入元素
players.insert(1, '思密达')
print(players) # ['james', '思密达', 'curry', 'harden', 'durant', 'rose', 'cris']
# extend() 使用新的序列扩展当前序列,等同于 +=
players.extend('kobe')
# ['james', '思密达', 'curry', 'harden', 'durant', 'rose', 'cris', 'k', 'o', 'b', 'e']
print(players)
players += (['刘备', '张飞'])
# ['james', '思密达', 'curry', 'harden', 'durant', 'rose', 'cris', 'k', 'o', 'b', 'e', '刘备', '张飞']
print(players)
# clear()
# players.clear()
# print(players) # []
# pop:根据索引删除并返回元素,不传递索引默认删除最后一个元素并返回该元素
player = players.pop(2)
# ['james', '思密达', 'harden', 'durant', 'rose', 'cris', 'k', 'o', 'b', 'e', '刘备', '张飞']
print(players)
print(player) # curry
# remove:根据元素的值删除,默认删除第一个匹配的元素
players.remove('rose')
# ['james', '思密达', 'harden', 'durant', 'cris', 'k', 'o', 'b', 'e', '刘备', '张飞']
print(players)
# reverse:反转
players.reverse()
# ['张飞', '刘备', 'e', 'b', 'o', 'k', 'cris', 'durant', 'harden', '思密达', 'james']
print(players)
# sort:对列表中的元素排序,默认升序
nums = list("faoanaonoalg")
nums.sort()
print(nums) # ['a', 'a', 'a', 'a', 'f', 'g', 'l', 'n', 'n', 'o', 'o', 'o']
nums = [23, 1, 34, 53, 14]
# 如果想要降序排序,传入指定 reverse 参数即可
nums.sort(reverse=True)
print(nums) # [53, 34, 23, 14, 1]
6. 列表的遍历
# 遍历列表其实就是将列表中的所有元素取出来操作即可
players = ['james', 'curry', 'harden', 'durant', 'rose']
# 通过while 循环来遍历列表
n = 0
while n < len(players):
print(players[n])
n += 1
# 通过for 循环来遍历,类似java 的增强for 循环,相比while 循环更加便利
for player in players:
print(player)
7. 列表case练习:EMS
# EMS (employee manager system)
emps = [[1, 'james', '23', '男', '美国']]
id = 1
while True:
num = int(input('''====================欢迎使用员工管理系统=============
1. 查询所有员工
2. 新增员工
3. 删除员工
4. 退出
请输入(1-4):'''))
if num == 1:
print(f'''======================================================
序号 姓名 年龄 性别 住址''')
for emp in emps:
print(
f'''\t\t\t\t{emp[0]} {emp[1]} {emp[2]} {emp[3]} {emp[4]}''')
elif num == 2:
print('-' * 15)
name = input('请输入员工的名字:')
age = int(input('请输入员工的年龄:'))
sex = input('请输入性别(男/女/人妖):')
address = input('请输入员工的地址:')
id += 1
emps.append([id, name, age, sex, address])
elif num == 3:
print('=' * 15)
num = int(input('请输入要删除的员工编号:'))
for emp in emps:
# 注意不同数据类型之间的比较(==)是无法进行值比较的,例如'1' 和 1
if emp[0] == num:
print('删除员工成功')
emps.remove(emp)
break
elif num == 4:
input('欢迎使用员工管理系统,点击回车键退出')
break
else:
print('只能选择 1~4')