深挖 Python 元组 pt.2

这篇具有很好参考价值的文章主要介绍了深挖 Python 元组 pt.2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

哈喽大家好,我是咸鱼

在《深挖 Python 元组 pt.1》中我们了解 Python 元组的一些概念(索引和切片等),以及如何创建元组,最重要的是我们还介绍了元组的不可变特性

那么今天我们来继续深挖 Python 元组

打包&解包

在 python 中,元组可以被打包(packing )和解包(unpacking

例如,point = x, y, z 将会把 x, y 和 z 的值打包到 point 中,于是创建了一个新元组

>>> x = 1
>>> y = 2
>>> z = 3
>>> point = x,y,z
>>> point
(1, 2, 3)

我们还可以执行反向操作(解包),将元组 point 的值解包为适当数量的变量

>>> point = (7, 14, 21)

>>> x, y, z = point
>>> x
7
>>> y
14
>>> z
21

可以看到,x, y, z = point 神奇地将point的内容解压缩为三个变量。注意,值按顺序转到变量。(第一个值归第一个变量,第二个值归第二个变量,依此类推)

Python 3.5 扩展了元组解包语法,以处理各种可迭代对象

所以不单单元组可以解包,可迭代对象也可以解包

在常规解包中,变量的数量必须与要解包的值的数量相匹配。否则会报错

>>> point = (7, 14, 21)

>>> x, y = point
Traceback (most recent call last):
    ...
ValueError: too many values to unpack (expected 2)

解包最常见的用例就是利用解包在变量之间交换值

没有解包的话使用常规赋值在两个变量之间交换值,必须使用临时变量

>>> a = 200
>>> b = 400

>>> temp = a
>>> a = b
>>> b = temp

>>> a
400
>>> b
200

通过解包来交换变量值

>>> a = 200
>>> b = 400

>>> a, b = b, a

>>> a
400
>>> b
200

解包还有一个用处是并行分配,比如说下面的操作:我们在进行赋值时需要知道对应的索引

>>> employee = ("John Doe", 35, "Python Developer")

>>> name = employee[0]
>>> age = employee[1]
>>> job = employee[2]

如果通过解包来实现,则无需使用索引。这样能使代码更易阅读和理解,且不易出错

>>> name, age, job = ("John Doe", 35, "Python Developer")

Python 还有一个打包和解包运算符 ( *,我们可以使用它让解包(打包)操作更加灵活

例如当左边的变量数和右边元组的元素数量不匹配时,可以使用 * 使得单个变量接收多个值

>>> numbers = (1, 2, 3, 4, 5)

>>> *head, last = numbers
>>> head
[1, 2, 3, 4]
>>> last
5

>>> first, *middle, last = numbers
>>> first
1
>>> middle
[2, 3, 4]
>>> last
5

>>> first, second, *tail = numbers
>>> first
1
>>> second
2
>>> tail
[3, 4, 5]

>>> first, *_ = numbers
>>> first
1

关于这个操作符的更多用法,可以看我之前的文章:《python 星号 * 还能这么用》

函数返回元组

在某些情况下,需要从函数返回多个值。所以可以构建一个带有逗号分隔的一系列参数的 return 语句,这样返回的是一个元组

我们还可以使函数返回值是列表,这样需要我们显式地使用方括号来构建列表

内置 divmod() 函数是返回多个值的函数的一个很好的例子。该函数接受两个数字,并在执行整数除法时返回一个包含商和余数的元组:

>>> divmod(4, 2)
(2, 0)

# 由于该函数返回元组,因此可以使用解包语法将每个值存储在其专用变量中
>>> quotient, remainder = divmod(8, 2)
>>> quotient
4
>>> remainder
0

又或者我打算写一个函数,这个函数返回一组数的最大值和最小值

>>> def find_extremes(iterable):
...     data = tuple(iterable)
...     if len(data) == 0:
...         raise ValueError("input iterable must not be empty")
...     return min(data), max(data)
...

>>> extremes = find_extremes([3, 4, 2, 6, 7, 1, 9])
>>> extremes
(1, 9)

>>> type(extremes)
<class 'tuple'>

可以看到函数的返回值有两个:最大值、最小值。当用逗号分隔一系列值时,将创建一个元组。因此,此函数返回一个 tuple 对象

深拷贝浅拷贝

当需要转换数据时,通常需要复制对象,同时保持原始数据不变。在处理可变数据类型(如列表和字典)时,副本非常有用

副本可以在不影响原数据的情况下对数据进行更改

  • 直接赋值

我们先来看一个例子

>>> student_info = ("Linda", 18, ["Math", "Physics", "History"])

>>> student_profile = student_info[:]
>>> id(student_info) == id(student_profile)
True
>>> id(student_info[0]) == id(student_profile[0])
True
>>> id(student_info[1]) == id(student_profile[1])
True
>>> id(student_info[2]) == id(student_profile[2])
True

可以看到,student_info、 student_profile 是对同一元组对象的引用。所以, student_profile 是 的 student_info 别名而不是副本

  • 浅拷贝

copy 模块中的 copy() 函数生成等效结果

>>> from copy import copy

>>> student_info = ("Linda", 18, ["Math", "Physics", "History"])

>>> student_profile = copy(student_info)
>>> id(student_info) == id(student_profile)
True
>>> id(student_info[0]) == id(student_profile[0])
True
>>> id(student_info[1]) == id(student_profile[1])
True
>>> id(student_info[2]) == id(student_profile[2])
True

可以看到,两个变量student_info、 student_profile 都包含对同一元组对象和相同元素的引用

上面的元组里面包含了一个列表元素,我们知道列表是可变的,我们来试着更改一下

>>> student_profile[2][2] = "Computer science"

>>> student_profile
('Linda', 18, ['Math', 'Physics', 'Computer science'])
>>> student_info
('Linda', 18, ['Math', 'Physics', 'Computer science'])

可以看到,student_profile 更改会影响 student_info 中的原始数据

  • 深拷贝

下面的例子中, student_info 通过 deepcopy() 函数制作了student_profile

>>> from copy import deepcopy

>>> student_info = ("Linda", 18, ["Math", "Physics", "History"])
>>> student_profile = deepcopy(student_info)

>>> id(student_info) == id(student_profile)
False
>>> id(student_info[0]) == id(student_profile[0])
True
>>> id(student_info[1]) == id(student_profile[1])
True
>>> id(student_info[2]) == id(student_profile[2])
False

可以看到,两个变量student_info、 student_profile 指向的元组对象不是同一个

如果我们对里面的列表元素进行更改

>>> student_profile[2][2] = "Computer science"
>>> student_profile
('Linda', 18, ['Math', 'Physics', 'Computer science'])
>>> student_info
('Linda', 18, ['Math', 'Physics', 'History'])

可以看到,对student_profile 的修改不会影响 student_info 中的数据

总结一下:

  • 元组的浅拷贝不会创建一个新的对象(副本)。
  • 元组的深拷贝创建一个新的元组对象
    • 对于元组内的不可变元素,它们仍然会共享相同的内存地址
    • 对于元组内的可变元素,则是创建了一个新的对象,不共享内存地址

其他操作

  • 元组拼接和重复

在 Python 中连接两个元组,可以使用加号运算符 ( +

>>> personal_info = ("John", 35)
>>> professional_info = ("Computer science", ("Python", "Django", "Flask"))

>>> profile = personal_info + professional_info
>>> profile
('John', 35, 'Computer science', ('Python', 'Django', 'Flask'))

需要注意的是,+ 左右两边必须都是元组,即只能将元组跟元组拼接。如果元组跟列表或其他对象拼接的话,会报错

>>> (0, 1, 2, 3, 4, 5) + [6, 7, 8, 9]
Traceback (most recent call last):
    ...
TypeError: can only concatenate tuple (not "list") to tuple

元组使用重复运算符 ( * )将元素克隆多次

>>> numbers = (1, 2, 3)

>>> numbers * 3
(1, 2, 3, 1, 2, 3, 1, 2, 3)

>>> 4 * numbers
(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3)
  • 元组反转和排序

内置 reversed() 函数将序列作为参数,并返回一个迭代器,该迭代器以相反的顺序从输入序列生成值

>>> days = (
...     "Monday",
...     "Tuesday",
...     "Wednesday",
...     "Thursday",
...     "Friday",
...     "Saturday",
...     "Sunday",
... )

>>> reversed(days)
<reversed object at 0x107032b90>

>>> tuple(reversed(days))
(
    'Sunday',
    'Saturday',
    'Friday',
    'Thursday',
    'Wednesday',
    'Tuesday',
    'Monday'
)

使用元组作为参数进行调用 reversed() 时,将获得一个迭代器对象,该对象以相反的顺序生成项

如果要对元组进行排序,可以使用内置 sorted() 函数,该函数将值的可迭代对象作为参数并以列表形式返回排序后的值

>>> numbers = (2, 9, 5, 1, 6)

>>> sorted(numbers)
[1, 2, 5, 6, 9]

如果元组里面的元素数据类型不一致(异构数据),则无法排序文章来源地址https://www.toymoban.com/news/detail-710729.html

到了这里,关于深挖 Python 元组 pt.2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python学习】Python学习11-元组

    目录 文章所属专区 Python学习 本章节主要说明Python的Python 的元组与列表类似,不同之处在于元组的元素不能修改。通过小括号创建。 创建一个列表 通过方括号和逗号分割创建,列表数据项中不需要有相同的类型 创建空元组 元组中只包含一个元素时,需要在元素后面添加逗

    2024年01月24日
    浏览(54)
  • 《对线面试官》| 高频 Python 面试题 pt.1

    1.聊聊 python 中的值传递和引用传递吧 值传递: 值传递意味着在函数调用时,将实际参数的值复制一份传递给函数的形式参数 在函数内部,形式参数将作为局部变量使用,对形式参数的修改不会影响原始变量的值 引用传递 引用传递意味着在函数调用时,将实际参数的引用(

    2024年02月17日
    浏览(46)
  • 【Python数据类型-元组】------- PYTHON基础11

    元组与列表类似。 元组的列表最大区别是: 元组的元素是不可被修改,添加,和删除的。 元组使用 小括号 定义,而列表使用中括号定义。 输出 输出 3.1. 列表转为元组,通过内置函数tuple()实现,比如: 输出 3.2. 元组转为列表,通过内置函数list()实现 输出 4.1. 元组更新:构

    2024年02月04日
    浏览(43)
  • Python -- 列表、元组、字典、集合

    目录 一、列表 1.列表介绍 1)列表的介绍 2)列表创建方式 2.列表的增删改查 1)获取列表中某个元素(查) 2)修改元素的值(改) 3)删除元素(删) 4)添加元素(增) 3.其它常用方法 1)列表常用方法 2)常用Python内置方法 二、元组 1.元组介绍 1)元组的介绍 2)元组创建

    2024年02月03日
    浏览(60)
  • 【Python】元组(tuple)详解

    元组(tuple)是 Python 中另一个重要的序列结构,和列表类似,元组也是由一系列按特定顺序排序的元素组成。 元组也可以看做是 不可变的列表 ,通常情况下,元组用于保存无需修改的内容。 从形式上看,元组的所有元素都放在一对小括号( )中,相邻元素之间用逗号,分隔,

    2024年02月05日
    浏览(48)
  • Python 基础(十):元组

    ❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴: 点赞 👍 + 收藏 ⭐ + 留言 💬

    2023年04月23日
    浏览(38)
  • 列表和元组(上)——“Python”

    各位CSDN的uu们你们好呀,今天小雅兰的内容是Python中的列表,下面,让我们进入列表的世界吧 列表是什么, 元组是什么 创建列表 访问下标 切片操作 遍历列表元素 列表是什么, 元组是什么 编程中, 经常需要使用变量, 来 保存/表示数据 . 如果代码中需要表示的数据个数比较少

    2023年04月18日
    浏览(62)
  • Python中的元组(tuple)

    Python中的元组(tuple)是一种不可变的有序序列,与列表(list)类似。元组中的元素可以是任何类型的对象,并且可以包含重复的元素。元组一旦创建就无法修改。 以下是Python元组的一些常用操作: 1. 创建元组:可以使用小括号()或者tuple()函数来创建一个元组。 ```python my_tuple =

    2024年02月04日
    浏览(49)
  • Python 集合(列表 ,元组,集合, 字典)

    Python 编程语言中有四种集合数据类型: 列表(List)是一种有序和可更改的集合。允许重复的成员。 元组(Tuple)是一种有序且不可更改的集合。允许重复的成员。 集合(Set)是一个无序和无索引的集合。没有重复的成员。 字典(Dictionary)是一个无序,可变和有索引的集合

    2024年02月02日
    浏览(57)
  • Python 元组完全指南1

    元组用于在单个变量中存储多个项目。 mytuple = (\\\"apple\\\", \\\"banana\\\", \\\"cherry\\\") 元组是 Python 中的 4 种内置数据类型之一,用于存储数据集合,另外还有列表、集合和字典,它们都具有不同的特性和用途。元组是有序且不可更改的集合。元组使用圆括号表示。 示例,创建一个元组: 元

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包