疯狂Python讲义之列表、元组和字典-序列简介及通用用法笔记6

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

目录

1. 序列简介

2. 通用用法

2.1 通过索引使用元素

2.2 子序列

2.3 加法

2.4 乘法

2.5 in 运算符

2.6 长度、最大值和最小值

2.7 序列封包和序列解包


1. 序列简介

Python 内置的三种常用数据结构: 列表 ( list )、元组( tuple )和字典( dict ),这三种数据结构一但都可用于保存多个数据项,这对于编程而言是非常重要的因为程序不仅需要使用单个变量来保存数据,还需要使用多种数据结构来保存大量数据,而列表、元组和字典就可满足保存大量数据的需求。

所谓序列,指的是一种包含多项数据的数据结构,序列包含的多个数据项(也叫成员)按顺序排列,可通过索引来访问成员。

Python 的常见序列类型包括字符串、列表和元组等。

列表和元组,这两种类型看起来非常相似,最主要的区别在于: 元组是不可变的,元组一旦构建出来,程序就不能修改元组所包含的成员(就像字符串也是不可变的,程序无法修改字符串所包含的字符序列);但列表是可变的,程序可以修改列表所包含的元素。

创建列表和元组的语法也有点相似,区别只是创建列表使用方括号, 创建元组使用圆括号,并在括号中列出元组的元素,元素之间以英文逗号隔开。

创建列表的语法格式如下:             [ele1 , ele2, ele3 , ... ]

创建元组的语法格式如下:             (ele1, ele2, ele3 , ... )

# 使用方括号定义列表
my_list = ['Hello', 20, 'Python']
print(my_list)
# 使用圆括号定义元组
my_tuple = ('Hello', 20, 'Python')
print(my_tuple)

2. 通用用法

列表和元组非常相似,它们都可包含多个元素,多个元素也有各自的索引。程序可通过索引来操作这些元素,只要不涉及改变元素的操作,列表和元组的用法是通用的。

2.1 通过索引使用元素

列表和元组都可通过索引来访问元素,它们的索引都是从0 开始的,第1个元素的索引为0,第2 个元素的索引为1, ...... 依此类推; 它们也支持使用负数索引,倒数第1个元素的索引为-1,倒数第2 个元素的索引为-2 …… 依此类推。

a_tuple = ('crazyit', 20, 5.6, 'fkit', -17)
print(a_tuple)
# 访问第1个元素
print(a_tuple[0]) # crazyit
# 访问第2个元素
print(a_tuple[1]) # 20
# 访问倒数第1个元素
print(a_tuple[-1]) # -17
# 访问倒数第2个元素
print(a_tuple[-2]) # -fkit

2.2 子序列

列表和元组同样也可使用索引获取中间一段,这种用法被称为 slice (分片或切片)

slice的完整语法格式如下:

[start : end : step]

start、end 两个索引值都可使用正数或负数, 其中负数表示从倒数开始。该语法表示从start 索引的元素开始(包含) ,到end 索引的元素结束(不包含) 的所有元素.

step 表示步长,因此step 使用负数没有意义。

a_tuple = ('crazyit', 20, 5.6, 'fkit', -17)
# 访问从第2个到倒数第4个(不包含)所有元素
print(a_tuple[1: 3]) # (20, 5.6)
# 访问从倒数第3个到倒数第1个(不包含)所有元素
print(a_tuple[-3: -1]) # (5.6, 'fkit')
# 访问从第2个到倒数第2个(不包含)所有元素
print(a_tuple[1: -2]) # (20, 5.6)
# 访问从倒数第3个到第5个(不包含)所有元素
print(a_tuple[-3: 4]) # (5.6, 'fkit')


b_tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9)
# 访问从第3个到第9个(不包含)、间隔为2的所有元素
print(b_tuple[2: 8: 2]) # (3, 5, 7)
# 访问从第3个到第9个(不包含)、间隔为3的所有元素
print(b_tuple[2: 8: 3]) # (3, 6)
# 访问从第3个到倒数第2个(不包含)、间隔为3的所有元素
print(b_tuple[2: -2: 2]) # (3, 5, 7)

2.3 加法

列表和元组支持加法运算,力日法的和就是两个列表或元组所包含的元素的总和。

需要指出的是,列表只能和列表相加;元组只能和元组相加;元组不能直接和列表相加。

a_tuple = ('crazyit' , 20, -1.2)
b_tuple = (127, 'crazyit', 'fkit', 3.33)
# 计算元组相加
sum_tuple = a_tuple + b_tuple
print(sum_tuple) # ('crazyit', 20, -1.2, 127, 'crazyit', 'fkit', 3.33)
print(a_tuple) # a_tuple并没有改变
print(b_tuple) # b_tuple并没有改变
# 两个元组相加
print(a_tuple + (-20 , -30)) # ('crazyit', 20, -1.2, -20, -30)
# 下面代码报错:元组和列表不能直接相加
#print(a_tuple + [-20 , -30])
a_list = [20, 30, 50, 100]
b_list = ['a', 'b', 'c']
# 计算列表相加
sum_list = a_list + b_list
print(sum_list) # [20, 30, 50, 100, 'a', 'b', 'c']
print(a_list + ['fkit']) # [20, 30, 50, 100, 'fkit']

2.4 乘法

列表和元组可以和整数执行乘法运算,列表和元组乘法的意义就是把它们包含的元素重复N次一N 就是被乘的倍数。

# 同时对元组使用加法、乘法
order_endings = ('st', 'nd', 'rd')\
    + ('th',) * 17 + ('st', 'nd', 'rd')\
    + ('th',) * 7 + ('st',)
# 将会看到st、nd、rd、17个th、st、nd、rd、7个th、st
print(order_endings)
day = input("输入日期(1-31):")
# 将字符串转成整数
day_int = int(day)
print(day + order_endings[day_int - 1])

2.5 in 运算符

in 运算符用于判断列表或元组是否包含某个元素

a_tuple = ('crazyit' , 20, -1.2)
print(20 in a_tuple) # True
print(1.2 in a_tuple) # False
print('fkit' not in a_tuple) # True

2.6 长度、最大值和最小值

Python 提供了内置的len()、max()、min()全局函数来获取元组或列表的长度、最大值和最小值。

由于max()、min()要对元组、列表中的元素比较大小,因此程序要求传给max ()、min ()函数的元组、列表的元素必须是相同类型且可以比较大小。

# 元素都是数值的元组
a_tuple = (20, 10, -2, 15.2, 102, 50)
# 计算最大值
print(max(a_tuple)) # 102
# 计算最小值
print(min(a_tuple)) # -2
# 计算长度
print(len(a_tuple)) # 6
# 元素都是字符串的列表
b_list = ['crazyit', 'fkit', 'Python', 'Kotlin']
# 计算最大值(依次比较每个字符的ASCII码值,先比较第一个字符,若相同,继续比较第二个字符,以此类推)
print(max(b_list)) # fkit(26个小写字母的ASCII码为97~122)
# 计算最小值
print(min(b_list)) # Kotlin (26个大写字母的ASCII码为65~90)
# 计算长度
print(len(b_list)) # 4

Python 的字符串也是可比较大小的一- Python 依次按字符串中每个字符对应的编码来比较字符串的大小。

2.7 序列封包和序列解包

Python 还提供了序列封包( Sequence Packing )和序列解包( Sequence Unpacking )的功能。简单来说, Python 允许支持以下两种赋值方式。

  • 程序把多个值赋给一个变量时, Python 会自动将多个值封装成元组。这种功能被称为序列封包
  • 程序允许将序列(元组或列表等)直接赋值给多个变量,此时序列的各元素会被依次赋值给每个变量(要求序列的元素个数和变量个数相等)。这种功能被称为序列解包

如果在赋值中同时运用了序列封包和序列解包机制,就可以让赋值运算符支持同时将多个值赋给多个变量.

在序列解包时也可以只解出部分变量,剩下的依然使用列表变量保存。为了使用这种解包方式,Python 允许在左边被赋值的变量之前添加“”,那么该变量就代表一个列表,可以保存多个集合元素.

# 序列封包:将10、20、30封装成元组后赋值给vals
vals = 10, 20, 30
print(vals) # (10, 20, 30)
print(type(vals)) # <class 'tuple'>
print(vals[1]) # 20
a_tuple = tuple(range(1, 10, 2))
# 序列解包: 将a_tuple元组的各元素依次赋值给a、b、c、d、e变量
a, b, c, d, e = a_tuple
print(a, b, c, d, e) # 1 3 5 7 9
a_list = ['fkit', 'crazyit']
# 序列解包: 将a_list序列的各元素依次赋值给a_str、b_str变量
a_str, b_str = a_list
print(a_str, b_str) # fkit crazyit


# 将10、20、30依次赋值给x、y、z
x, y, z = 10, 20, 30
print(x, y, z) # 10 20 30
# 将y,z, x依次赋值给x、y、z
x, y, z = y, z, x
print(x, y, z) # 20 30 10

# first、second保存前2个元素,rest列表包含剩下的元素
first, second, *rest = range(10)
print(first) # 0
print(second) # 1
print(rest) # [2, 3, 4, 5, 6, 7, 8, 9]
# last保存最后一个元素,begin保存前面剩下的元素
*begin, last = range(10)
print(begin) # [0, 1, 2, 3, 4, 5, 6, 7, 8]
print(last) # 9
# first保存第一个元素,last保存最后一个元素,middle保存中间剩下的元素
first, *middle, last = range(10)
print(first) # 0
print(middle) # [0, 1, 2, 3, 4, 5, 6, 7, 8]
print(last) # 9

猜你喜欢

转载自blog.csdn.net/XieWinter/article/details/94593766