前言:
此时兄弟们对“python中元组和列表的区别”大体比较讲究,各位老铁们都想要剖析一些“python中元组和列表的区别”的相关内容。那么小编也在网摘上网罗了一些对于“python中元组和列表的区别””的相关内容,希望我们能喜欢,你们快快来了解一下吧!欢迎你来到站长学堂,学习站长在线出品的在线课程《零基础 Python完全自学教程》今天给大家分享的是第16课《 Python中的元组系列知识》。本节课是一个大课,我分了这些知识点进行详细讲解:元组的创建和删除详解、访问元组元素详解、遍历元组详解、修改元组详解、元组推导式详解及元组和列表的七大区别详解。
16.1、python中元组的创建和删除详解
温馨提示:本内容和前面所学的《Python中列表的创建和删除详解》内容基本一致,大家可以对照学习。
16.1.1、元组的概念:(和列表类似)
我们可以回顾一下列表的概念:
列表(list)是由一系列的特定顺序排列的元素。它是Python中内置的可变序列。在形式上,列表的所有元素都放在一对中括号“[]”里面,两个相邻的元素之间,使用英文逗号“,”隔开。在内容上,列表可以将整数、实数、字符串、列表、元组任何类型的元素放入列表中,并且同一列表中,元素的类型可以不同,因此他们之间没有任何关系。
元组(tuple)是python中另一个重要的序列结构,与列表类似,也是有一系列按特定排列的元素组成。但是,它是不可变序列,因此元组也可以称之为不可变的列表。在形式上元组的所有元素都放在一对小括号“()”中,相邻的元素之间使用英文逗号“,”分隔。在内容上,可以将整数、实数、字符串、列表、元组、字典、集合等任何类型的内容放入元组中,并且同一个元组中,元素的类型可以不同,因此他们之间没有任何关系。通常情况下,元组用于保存程序不可修改的内容。
从元组和列表的定义来看,这两种结构比较相似,但是他们之间的主要区别就是一个不可变序列,一个是可变序列。即元组中的元素不可以单独修改,而列表可以任意修改。
了解了什么是元组,接下来就讲讲创建元组的几个方法了:
16.1.2、在Python中使用赋值运算符“=”创建元组:(和列表类似)
在Python中,创建元组可以使用赋值运算符“=”创建元组,右边是赋值,左边是变量。具体语法如下:
tuplename = (element 1 , element 2 , element 3 , ... , element n)
其中,tuplename 表示元组的名称,可以是任何符合Python命名规则的标识符;element 1 , element 2 ,表示元组中的元素,这些元素的数量没有限制,内容上只要是Python中支持的数据类型如整数、实数、字符串、列表、元组都可以。
如下面的都是合法的元组:
shuzi = (1,2,3,4,5,6,7) #数字shige = ("床前明月光","疑是地上霜","举头望明月","低头思故乡") #诗歌hunhe = (66,"Python",('人生苦短','我用Python'),["WEB开发","云计算","爬虫"]) #混合元组python = ('优雅',"明确",'''简单''')
在 Python 中,元组通常都是使用一对小括号将所有元素包围起来的,但小括号不是必须的,只要将各元素用逗号隔开,Python 就会将其视为元组,请看下面的例子:
shige = "床前明月光","疑是地上霜","举头望明月","低头思故乡" print(shige)
在Python IDLE 中运行结果如下:
('床前明月光', '疑是地上霜', '举头望明月', '低头思故乡')>>>
当,创建的元组只有一个元素时,需要在元素的后面加“,”,如:
python = ('优雅',)print(python)
运行结果为:
('优雅',)>>>
当,创建的元组只有一个元素时,元素的后面没有加“,”,被视为定义了一个字符串,如:
python = ('优雅')print(python)
运行结果为:
优雅>>>
温馨提示:在Python中的内置函数type()可以检测变量的类型,代码如下:
python1 = ('优雅',)python2 = ('优雅')print("python1的类型为:",type(python1))print("python2的类型为:",type(python2))
运行结果为:
python1的类型为: <class 'tuple'>python2的类型为: <class 'str'>>>>
16.1.3、在Python中创建空的元组():(和列表类似)
在Python中,是可以创建空的元组的,如创建一个空元组代码如下
kong = ()
和空列表一样的原理,我们经常会用到空的元组。一般情况下,空元组用于为函数传递一个空的值,或者返回一个空的值。
16.1.4、在Python中使用tuple()函数创建数值元组:(和列表类似)
在Python中,可以使用tuple() 函数直接将range()函数循环出来的结果转换为元组。
我们先回顾一下range()函数的使用方法:(在《Python中的循环语句》里面学过)
range(start,end,step)
各参数说明如下:
start:用于指定技术的起始值,可以省略。如果省略则从0开始。
end:用于指定计数的结束值,不能省略。结束值不包括该值,如range(100),则表示值为0~99。当range()函数只有一个参数时,即表示指定计数的结束值。
step:用于指定步长,即两个数之间的间隔,可以省略。如果省略则表示步长为1。如range(1,7)则表示值为1、2、3、4、5、6
tuple() 函数用法如下:
tuple(data)
其中,data表示可以转换为列表的数据,包括range对象、字符串、元组、或者其他可以迭代类型的数据。
如:创建一个0~20(不包括20)的所有偶数列表,可以使用以下代码:
tuple(range(0,20,2))
运行结果如下:
(0, 2, 4, 6, 8, 10, 12, 14, 16, 18)>>>
注:使用tuple()函数不仅可以通过range对象创建元组,还可以通过其他的函数对象创建元组。其他函数在后面慢慢会学到的。
16.1.5、在Python中使用del命令删除元组(和列表类似)
在Python中,删除已经创建的元组是很简单的,使用 del 命令即可,语法格式如下:
del 元组名称
如:删除一个叫做 shige 的元组:
shige = ("床前明月光","疑是地上霜","举头望明月","低头思故乡")del shige
但是,如果你删除的是一个不存在的元组,就会报错,如:
shige = ("床前明月光","疑是地上霜","举头望明月","低头思故乡") del sg
当然上面不管是定义了shige 还是没有定义shige 的元组,都是一样,删除sg元组都是不存在的,报错结果如下:
Traceback (most recent call last): File "D:\Python\Python310\Doc\000.py", line 2, in <module> del sgNameError: name 'sg' is not defined>>>
实际开发中并不经常使用 del 来删除元组,因为 Python 自带的垃圾回收机制会自动销毁无用的元组,即使开发者不手动删除,Python 也会自动将其回收。
16.2、在Python中访问元组元素详解
16.2.1、使用print()函数输出内容。
在Python中,如果将元组中的内容输出是比较简单的,使用print()函数即可。
如:我们输出上个知识点的内容中的混合的hunhe元组,只要使用函数print(hunhe)即可
shuzi = (1,2,3,4,5,6,7) #数字shige = ("床前明月光","疑是地上霜","举头望明月","低头思故乡") #诗歌hunhe = (66,"Python",('人生苦短','我用Python'),["WEB开发","云计算","爬虫"]) #混合元组python = ('优雅',"明确",'''简单''')print(hunhe)print(python)
执行结果如下:
(66, 'Python', ('人生苦短', '我用Python'), ['WEB开发', '云计算', '爬虫'])('优雅', '明确', '简单')>>>
经过对比,不是 输入的是 单引号、双引号、三引号 ,输出的都是 单引号。
通过上述的输出,我们发现,在输出元组时,包括了两侧的小括号()的。
16.2.2、通过索引的方式访问元组元素。
元组是Python中另一个重要的序列结构,也是一个有序的集合,所以要访问元组中的任何元素,您只需要告诉Python元素的位置(索引)。要访问元组元素,首先指出元组的名称,然后指出元素在元组中的位置。
下面,我们来输出混合元组中的第3个和第2个元素,代码如下:
hunhe = (66,"Python",('人生苦短','我用Python'),["WEB开发","云计算","爬虫"])print(hunhe[2])print(hunhe[1])
输出的结果为:
('人生苦短', '我用Python')Python>>>
昨天的内容:
python1 = ('优雅',)python2 = ('优雅')print("python1的类型为:",type(python1))print("python2的类型为:",type(python2))print(python1)print(python2)
输出结果为:
python1的类型为: <class 'tuple'>python2的类型为: <class 'str'>('优雅',)优雅>>>
上面结果可以看出:在输出的单个元组时,也是包括小括号()。如果是字符串,还不包括左右的引号。
在访问列表元素的时候,我们使用了索引的方法,但是没有讲到切片的方法访问列表元素。在这里,我们讲讲使用切片的方法访问元组。
16.2.3、通过切片的方式访问元组元素。
访问元组元素是可以使用切片的方法,访问元组元素的。
我们访问混合元组的前2个元素,代码为:
hunhe = (66,"Python",('人生苦短','我用Python'),["WEB开发","云计算","爬虫"]) #混合元组print(hunhe[:2])
运行结果为:
(66, 'Python')>>>
我们访问混合元组的后2个元素,代码为:
hunhe = (66,"Python",('人生苦短','我用Python'),["WEB开发","云计算","爬虫"]) #混合元组print(hunhe[2:])
运行结果为:
(('人生苦短', '我用Python'), ['WEB开发', '云计算', '爬虫'])>>>
我们访问混合元组的第2个到第3个元素,就会报错了,代码为:
hunhe = (66,"Python",('人生苦短','我用Python'),["WEB开发","云计算","爬虫"]) #混合元组print(hunhe[2,3])
运行结果为:
Traceback (most recent call last): File "D:\Python\Python310\Doc\000.py", line 2, in <module> print(hunhe[2,3])TypeError: tuple indices must be integers or slices, not tuple>>>
实例:我们来输出每日一语。
import datetime #导入日期时间类mot = ("信任是最稀缺的货币。", #定义一个列表 "追求快速,反而死的很惨;有时候,慢也就是快!", "改编是一门技术,学会改编技术,就会改字成金,这辈子不会缺钱。", "流量是天然存在的,客户是天然存在的,方法是天然存在的。", "你的每一个时间都很珍贵,都要放在最有生产力的事情上。", "万物皆不为我所有,万物皆为我所用。", "钻石就在你家后院,秘笈就在你的眼前,你却每天视而不见。")day=datetime.datetime.now().weekday() #获取当前星期print(mot[day]) #输出每日一语
说明:在上述代码中,datetime.datetime.now()用于获取当前日期,weekday()再则是从日期时间对象中获取星期,其值为0~6中的一个,0位星期一,6为星期日。
在2021年11月9日的运行结果为:
追求快速,反而死的很惨;有时候,慢也就是快!>>>
16.3、在Python中遍历元组详解
站长在线温馨提示:本节教程内容与《在Python中遍历列表详解》大体一致,大家可以对比学习。(基本上就是把列表改成元组,[]改成(),list改成tuple)
我们先解释一下遍历的意思,遍就是全面,到处的意思,历就是行、游历的意思。所谓遍历就是全部走遍,到处周游的意思。
遍历元组就是从头到尾依次从元组中获取数据。
再次强调一下,元组是一种不可变的序列,不能单个修改某一个元素,但是遍历元组的每一个元素还是可以的。
在Python中,遍历元组的方法有很多种,下面介绍一些常用的遍历方法:
16.3.1、直接使用for循环遍历元组
直接使用for循环遍历元组,只能输出元素的值,语法格式如下:
for 变量元素 in 元组: #输出变量元素
列如,定义Python的设计理念,然后通过for循环遍历该元组,并输出每条内容。代码如下:
print("Python设计理念:")python = ("优雅","明确","简单")for linian in python: print(linian)
执行以后结果如下:
Python设计理念:优雅明确简单>>>
16.3.2、使用for循环和enumerate()函数遍历元组
使用for循环和enumerate()函数可以实现同时输出索引值和元素内容,其语法格式如下:
for index,变量元素 in enumerate(元组) #输出index和变量元素
例如,定义python的设计理念,然后通过for循环和enumerate()函数遍历该元组,并输出索引和每条内容。代码如下:
print("Python设计理念:")python = ("优雅","明确","简单")for index,linian in enumerate(python): print(index,linian)
执行结果如下:
Python设计理念:0 优雅1 明确2 简单>>>
16.3.3、使用for循环和tuple()函数遍历元组
例如,定义python的设计理念,然后通过for循环和tuple()函数遍历该元组,并输出每条内容。代码如下:
print("Python设计理念:")python = ("优雅","明确","简单")for linian in tuple(python): print(linian)
执行结果如下:
Python设计理念:优雅明确简单>>>
16.3.4、使用for循环和range()函数遍历元组
定义元组number 的元组,然后通过for循环和range()函数遍历该元组,并输出每条内容。代码如下:
number = (1122,2366,4400,5577,8888)for i in range(len(number)): print(i,number[i])
执行结果为:
0 11221 23662 44003 55774 8888>>>
可以不带索引输出,代码为:
number = (1122,2366,4400,5577,8888)for i in range(len(number)): print(number[i])
运行结果为:
11222366440055778888>>>
我们把输出的结果,放在同一行,代码为:
number = (1122,2366,4400,5577,8888)for i in range(len(number)): print(number[i],end=" ")
执行结果为:
1122 2366 4400 5577 8888 >>>
注意 range()函数只能用于数字的元组,在非数字中就会报错了。
16.3.5、使用for循环和iter()函数遍历元组
列如,定义python的设计理念,然后使用for循环和iter()函数遍历该元组,并输出每条内容。代码如下:
print("Python设计理念:")python = ("优雅","明确","简单")for linian in iter(python): print(linian)
输出结果如下:
Python设计理念:优雅明确简单>>>
16.3.6、使用while循环遍历元组
定义,元组number 的元组,然后通过while循环遍历元组并输出每条内容。代码如下:
number = (1122,2366,4400,5577,8888)i = 0while i < len(number): print(number[i]) i = i + 1
运行结果如下:
11222366440055778888>>>
16.4、在python中修改元组详解
回顾一下Python中列表元素的更新,我们分了3节课程来分享,分别是添加列表元素、修改列表元素和删除列表元素。但是在元组中,就不能说添加元组元素、修改元组元素和删除元组元素了,因为元组是不可变的序列,也是一种不可变的列表。当然我们也可以尝试一下修改一个元组元素看看,有什么结果?
我们以Python的设计理念(设计哲学)为例,我们来修改一个参数看看:
python = ("优雅","明确","简单")python[2] = "复杂"print(python)
运行结果如下:
Traceback (most recent call last): File "D:\Python\Python310\Doc\000.py", line 2, in <module> python[2] = "复杂"TypeError: 'tuple' object does not support item assignment>>>
翻译一下:“TypeError: 'tuple' object does not support item assignment”就是说:TypeError:“tuple”对象不支持项分配
也就是说在Python的元组是不可以单一修改元组元素的。那怎样才能修改元组呢?下面介绍两个方法:
16.4.1、在Python中直接使用赋值运算符“=”给元组重新赋值。
虽然说元组是不可变的序列,我们不能对单个元素的值进行修改,但是,这并不意味着,元组就完全不能修改了。我们可以对元组进行重新赋值:如:
python = ("优雅","明确","简单")python = ("优雅的","明确的","简单的")print("新元组:",python)
执行结果如下:
新元组: ('优雅的', '明确的', '简单的')>>>
16.4.2、在Python中使用加赋值运算符“+”连接两个元组。如:
python = ('网站开发','大数据处理','人工智能','自动化运维','云计算')print("原元组:",python)python = python + ('网络爬虫','游戏开发','图形图像处理')print("新元组:",python)
运行结果如下:
原元组: ('网站开发', '大数据处理', '人工智能', '自动化运维', '云计算')新元组: ('网站开发', '大数据处理', '人工智能', '自动化运维', '云计算', '网络爬虫', '游戏开发', '图形图像处理')>>>
这里值得注意的是,这里是元组和元组之间相“+”是可以的。元组和其他类型就不行了,如:
python = ('网站开发','大数据处理','人工智能','自动化运维','云计算')python = python + ['网络爬虫','游戏开发','图形图像处理'] # 元组+列表print(python)
运行结果如下‘:
Traceback (most recent call last): File "D:\Python\Python310\Doc\000.py", line 2, in <module> python = python + ['网络爬虫','游戏开发','图形图像处理'] # 元组+列表TypeError: can only concatenate tuple (not "list") to tuple>>>
翻译一下:“TypeError: can only concatenate tuple (not "list") to tuple”意思是:TypeError:只能将元组(而不是“列表”)连接到元组。
同理,元组也不能和字符串相连接,如:
python = ('网站开发','大数据处理','人工智能','自动化运维','云计算')python = python + '网络爬虫' # 元组+字符串print(python)
运行结果:
Traceback (most recent call last): File "D:\Python\Python310\Doc\000.py", line 2, in <module> python = python + '网络爬虫' # 元组+字符串TypeError: can only concatenate tuple (not "str") to tuple>>>
翻译“TypeError: can only concatenate tuple (not "str") to tuple”意思是:TypeError:只能将元组(而不是“str”)连接到元组。
在这里,还有一点要注意的是:如果元组中只有一个元素时,不要忘记加逗号哦,如:
python = ('网站开发','大数据处理','人工智能','自动化运维','云计算')python = python + ('网络爬虫')print(python)
运行结果为:
Traceback (most recent call last): File "D:\Python\Python310\Doc\000.py", line 2, in <module> python = python + ('网络爬虫')TypeError: can only concatenate tuple (not "str") to tuple>>>
不用翻译了吧,和上面一样的,当元组元素只有一个的时候,被视为字符串,但是加了“,”就被视为元组了哦!
python = ('网站开发','大数据处理','人工智能','自动化运维','云计算')python = python + ('网络爬虫',)print(python)
运行结果如下:
('网站开发', '大数据处理', '人工智能', '自动化运维', '云计算', '网络爬虫')>>>
16.5、Python中的元组推导式详解
我们在《python中的列表推导式详解》中学过,使用列表推导式可以快速生成一个新的列表,或者根据某个列表生成满足指定需求的列表。
生成指定范围的数值列表,语法格式如下:
list = [Expression for var in range]
那么我们使用列表推导式的方法用于元组推导式行不行呢?
我们根据列表推导式的方法,把“[]”改成“()”试一试:
tuple = (Expression for var in range)
我们也和列表推导式一样的内容:
a1 = (i for i in range(10)) #生成一个10以内的元组a2 = (i for i in range(10) if i % 2 == 0) #生成一个10以内的偶数元组print(a1)print(a2)
运行结果如下:
<generator object <genexpr> at 0x000001DC03E3C900><generator object <genexpr> at 0x000001DC03DBBD10>>>>
为什么是这样的,而不是下面这样我们想要的呢?
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)(0, 2, 4, 6, 8)>>>
从上面的执行结果可以看出,使用元组推导式生成的结果并不是一个元组,而是一个生成器对象,这一点和列表推导式是不同的。
那么怎样才能使用元组推导式获得新的元组呢?
下面讲解3个方法使用元组推导式获得新的元组:
16.5.1、在Python中使用 tuple() 函数,可以直接将生成器对象转换成元组。
要使用该生成器对象,可以转换成元组或者列表。下面我们就上面的内容进行转换成元组和列表,代码如下:
a1 = (i for i in range(10)) #生成一个10以内的元组a2 = (i for i in range(10) if i % 2 == 0) #生成一个10以内的偶数元组print("转换后的元组为:",tuple(a1)) #转换为元组print("转换后的列表为:",list(a2)) #转换为列表
运行结果如下:
转换后的元组为: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)转换后的列表为: [0, 2, 4, 6, 8]>>>
16.5.2、在Python中直接使用 for 循环遍历生成器对象,可以获得各个元素。例如:
a = (i for i in range(10)) # 生成一个10以内的元组for i in a: # for 循环遍历生成器对象 print(i,end=',') # 输出元组元素在同一行显示,并且用“,”隔开print(tuple(a)) # 输出新元组
运行结果为:
0,1,2,3,4,5,6,7,8,9,()>>>
16.5.3、 在Python中使用 __next__()方法遍历生成器对象,也可以获得各个元素。例如:
a = (i for i in range(3)) # 生成一个3以内的元组print(a.__next__()) # 输出第一个元素print(a.__next__()) # 输出第二个元素print(a.__next__()) # 输出第三个元素a = tuple(a) # 转换为元组print("转换后的元组:",a) # 输出新元组
运行结果为:
012转换后的元组: ()>>>
通过上面for循环遍历生成器对象和__next__()方法遍历生成器对象以后,如果还需要使用该生成器对象的话,都必须创建新的生成器对象才行,因为遍历以后,原来的生成器对象已经不存在了,输出的新元组为空。
16.6、python中元组和列表的七大区别详解
元组和列表都是属于序列,都是按照特定顺序储存的一组元素,都可以将整数、实数、字符串、列表、元组、字典、集合等任何类型的内容。创建和删除的方法也是一样。
列表和元组之间还是有区别的,下面站长在线整理了它们之间的7大区别:
16.6.1、列表是动态的,属于可变序列,它的元素可以随时增加、修改或者删除,而元组是静态的,属于不可变序列,无法增加、删除、修改元素,除非整体替换。
16.6.2、列表可以使用append()、extend()、insert()、remove()和pop()等方法实现添加和修改列表元素,而元组则没有这几个方法,因为不能向元组中添加和修改元素。同样,也不能删除元素,可以整体替换。
16.6.3、列表可以使用切片访问和修改列表中的元素。元组也支持切片,但是它只支持通过切片访问元组中的元素,不支持修改。
16.6.4、元组比列表的访问和处理速度快。所以如果只需要对其中的元素进行访问,而不进行任何修改,建议使用元组而不使用列表。
16.6.5、因为列表可以修改,元组不可以修改,因此元组比列表具有更高的安全性。
16.6.6、列表不能作为字典的键,而元组可以。
16.6.7、存储方式不同:空列表 比空元组多占用16个字节。
>>> lista = []>>> lista.__sizeof__()40>>> tuplea = ()>>> tuplea.__sizeof__()24>>>
相关阅读:
《零基础Python完全自学教程》目录
1、认识python
2、安装python及写第一个Python程序
3、Python开发工具介绍
4、Python语法特点
5、Python中的变量
6、Python中的基本数据类型
7、Python中的基本输入和输出
8、Python中常用的运算符
9、Python中运算符的优先级和条件表达式
10、Python中的三大程序结构
11、Python中的选择语句
12、Python中的循环语句
13、Python中的break语句、continue语句和pass语句
14、Python中的序列知识详解
15、Python中的列表
标签: #python中元组和列表的区别 #python元组赋值