超详解——Python 元组详解——小白篇

news2024/11/24 4:01:22

目录

1. 元组简介

创建元组

2. 元组常用操作

访问元组元素

切片操作

合并和重复

成员操作符

内置函数

解包元组

元组方法

3. 默认集合类型

作为字典的键

作为函数参数

作为函数的返回值

存储多种类型的元素

4.元组的优缺点

优点

缺点

5.元组的使用场景

数据存储

配置项

函数返回值

多线程环境

6.与其他数据结构的比较

与列表的比较

与集合的比较

7.高级用法

嵌套元组

元组作为数据表

多变量交换

总结


元组(Tuple)是Python中的一种内置数据类型,用于存储多个有序的元素。与列表不同,元组是不可变的,这意味着一旦创建,元组中的元素就不能修改。

1. 元组简介

元组是Python中的一种序列类型,使用圆括号 () 表示。元组可以包含任意类型的元素,包括数字、字符串、列表、甚至其他元组。元组的不可变性使得它们在某些场景下非常有用,例如作为函数的返回值,或者作为字典的键。

创建元组

元组可以通过圆括号 () 创建,元素之间用逗号 , 分隔。如果元组中只有一个元素,需要在元素后加一个逗号 ,,以避免与普通括号表达式混淆。

示例:

tup1 = (1, 2, 3)
tup2 = ("Python", 3.7, [1, 2, 3])
tup3 = (1,)  # 单元素元组
tup4 = ()  # 空元组

print(tup1)  # 输出:(1, 2, 3)
print(tup2)  # 输出:("Python", 3.7, [1, 2, 3])
print(tup3)  # 输出:(1,)
print(tup4)  # 输出:()

元组也可以通过内置函数 tuple() 创建,将可迭代对象(如列表、字符串)转换为元组。

示例:

lst = [1, 2, 3]
tup = tuple(lst)
print(tup)  # 输出:(1, 2, 3)

s = "Python"
tup2 = tuple(s)
print(tup2)  # 输出:('P', 'y', 't', 'h', 'o', 'n')

2. 元组常用操作

虽然元组是不可变的,但Python提供了一些操作符和方法,用于查询和处理元组中的元素。

访问元组元素

元组中的元素可以通过索引访问,索引从0开始。负索引从-1开始,表示从末尾向前数。

示例:

tup = (1, 2, 3, 4, 5)
print(tup[0])  # 输出:1
print(tup[-1]) # 输出:5

切片操作

元组支持切片操作,可以提取子元组。切片的语法为 元组[开始:结束:步长],其中 开始结束 是索引,步长 表示元素间的间隔。

示例:

tup = (1, 2, 3, 4, 5)
print(tup[1:4])  # 输出:(2, 3, 4)
print(tup[:3])   # 输出:(1, 2, 3)
print(tup[::2])  # 输出:(1, 3, 5)

合并和重复

元组可以使用 + 操作符合并,使用 * 操作符重复。

示例:

tup1 = (1, 2, 3)
tup2 = (4, 5, 6)
tup3 = tup1 + tup2
print(tup3)  # 输出:(1, 2, 3, 4, 5, 6)

tup4 = tup1 * 3
print(tup4)  # 输出:(1, 2, 3, 1, 2, 3, 1, 2, 3)

成员操作符

可以使用 innot in 操作符检查元素是否存在于元组中。

示例:

tup = (1, 2, 3, 4, 5)
print(3 in tup)     # 输出:True
print(6 not in tup) # 输出:True

内置函数

以下是一些常用的元组内置函数:

  • len(tup):返回元组的长度。
  • max(tup):返回元组中的最大值。
  • min(tup):返回元组中的最小值。
  • sum(tup):返回元组中所有元素的和(适用于数字元组)。
  • sorted(tup):返回元组的排序副本(结果为列表)。
  • tuple(iterable):将可迭代对象转换为元组。

示例:

tup = (1, 2, 3, 4, 5)
print(len(tup))     # 输出:5
print(max(tup))     # 输出:5
print(min(tup))     # 输出:1
print(sum(tup))     # 输出:15
print(sorted(tup))  # 输出:[1, 2, 3, 4, 5]

解包元组

元组解包允许将元组中的元素赋值给多个变量。

示例:

tup = (1, 2, 3)
a, b, c = tup
print(a, b, c)  # 输出:1 2 3

# 使用 * 运算符解包剩余元素
tup = (1, 2, 3, 4, 5)
a, *b, c = tup
print(a)  # 输出:1
print(b)  # 输出:[2, 3, 4]
print(c)  # 输出:5

元组方法

元组提供了两个内置方法:

  • tup.count(x):返回元素 x 在元组中出现的次数。
  • tup.index(x):返回元素 x 在元组中第一次出现的索引。

示例:

tup = (1, 2, 3, 2, 4, 2)
print(tup.count(2))  # 输出:3
print(tup.index(3))  # 输出:2

3. 默认集合类型

在Python中,元组被广泛用作默认集合类型,因为它们是不可变的。这种不可变性使得元组在某些场景下非常有用,例如:

作为字典的键

由于元组是不可变的,因此可以用作字典的键。而列表是可变的,不能用作字典的键。

示例:

d = {(1, 2): "a", (3, 4): "b"}
print(d[(1, 2)])  # 输出:"a"
print(d[(3, 4)])  # 输出:"b"

作为函数参数

元组常用于传递函数的多个参数。函数可以接受元组作为参数,并解包元组中的元素。

示例:

def func(a, b, c):
    print(a, b, c)

tup = (1, 2, 3)
func(*tup)  # 输出:1 2 3

作为函数的返回值

元组常用于函数返回多个值。函数可以返回一个元组,并在调用时解包返回的元组。

示例:

def func():
    return 1, 2, 3

a, b, c = func()
print(a, b, c)  # 输出:1 2 3

存储多种类型的元素

元组可以存储不同类型的元素,常用于固定结构的数据。例如,一个包含名称、年龄和地址的元组。

示例:

person = ("John", 25, "1234 Elm St")
name, age, address = person
print(f"Name: {name}, Age: {age}, Address: {address}")
# 输出:Name: John, Age: 25, Address: 1234 Elm St

4.元组的优缺点

优点

  1. 不可变性:元组的不可变性使得它们在多线程环境中是安全的,可以避免数据竞争。
    tup = (1, 2, 3)
    # 无法修改元组中的元素
    # tup[0] = 10  # 这行代码会引发错误
    
  2. 性能:元组的创建和访问速度比列表快,因为它们是不可变的,不需要额外的内存开销。
    import timeit
    
    t1 = timeit.timeit("(1, 2, 3)", number=1000000)
    t2 = timeit.timeit("[1, 2, 3]", number=1000000)
    
    print(f"元组创建时间: {t1}")
    print(f"列表创建时间: {t2}")
    
  3. 哈希特性:元组可以作为字典的键,因为它们是不可变的,这在某些数据结构中非常有用。
    d = { (1, 2): "a", (3, 4): "b" }
    print(d[(1, 2)])  # 输出:"a"
    

缺点

  1. 不可变性:虽然不可变性是一个优点,但在需要修改元素的情况下,它可能成为一个限制。
    tup = (1, 2, 3)
    # 尝试修改元组中的元素会引发错误
    # tup[0] = 10  # 这行代码会引发错误
    
  2. 功能限制:与列表相比,元组不支持许多列表的方法,例如 append()remove() 等,这在某些操作中可能不方便。
    lst = [1, 2, 3]
    lst.append(4)
    print(lst)  # 输出:[1, 2, 3, 4]
    
    tup = (1, 2, 3)
    # tup.append(4)  # 这行代码会引发错误
    

5.元组的使用场景

数据存储

元组常用于存储不同类型的数据,例如数据库记录。一条记录的不同字段可以用元组存储。

record = ("John Doe", 30, "Engineer")
name, age, profession = record
print(f"Name: {name}, Age: {age}, Profession: {profession}")
# 输出:Name: John Doe, Age: 30, Profession: Engineer

配置项

在某些情况下,配置项可以用元组存储,因为它们是不可变的,不会被意外修改。

config = (800, 600)
# config[0] = 1024  # 这行代码会引发错误
print(config)  # 输出:(800, 600)

函数返回值

在需要返回多个值的函数中,元组是一个常用的选择。

def get_user_info():
    return "Alice", 28, "Developer"

name, age, job = get_user_info()
print(f"Name: {name}, Age: {age}, Job: {job}")
# 输出:Name: Alice, Age: 28, Job: Developer

多线程环境

在多线程环境中,使用元组可以避免数据竞争和修改问题。

import threading

def worker(data):
    print(data)

data = (1, 2, 3)
threads = [threading.Thread(target=worker, args=(data,)) for _ in range(5)]

for t in threads:
    t.start()

for t in threads:
    t.join()

6.与其他数据结构的比较

与列表的比较

  • 不可变性:元组是不可变的,而列表是可变的。
    tup = (1, 2, 3)
    # tup[0] = 10  # 这行代码会引发错误
    
    lst = [1, 2, 3]
    lst[0] = 10
    print(lst)  # 输出:[10, 2, 3]
    
  • 性能:元组的性能通常比列表好,因为它们不需要额外的内存开销。
    import timeit
    
    t1 = timeit.timeit("(1, 2, 3)", number=1000000)
    t2 = timeit.timeit("[1, 2, 3]", number=1000000)
    
    print(f"元组创建时间: {t1}")
    print(f"列表创建时间: {t2}")
    
  • 功能:列表有更多的方法和操作符,例如 append()remove() 等。
    lst = [1, 2, 3]
    lst.append(4)
    print(lst)  # 输出:[1, 2, 3, 4]
    
    tup = (1, 2, 3)
    # tup.append(4)  # 这行代码会引发错误
    

与集合的比较

  • 顺序:元组是有序的,而集合是无序的。
    tup = (1, 2, 3)
    print(tup)  # 输出:(1, 2, 3)
    
    s = {3, 1, 2}
    print(s)  # 输出:{1, 2, 3} 或 {3, 1, 2} 等(集合是无序的)
    
  • 不可变性:元组是不可变的,而集合是可变的。
    tup = (1, 2, 3)
    # tup[0] = 10  # 这行代码会引发错误
    
    s = {1, 2, 3}
    s.add(4)
    print(s)  # 输出:{1, 2, 3, 4}
    
  • 重复元素:元组允许重复元素,而集合不允许重复元素。
    tup = (1, 2, 2, 3)
    print(tup)  # 输出:(1, 2, 2, 3)
    
    s = {1, 2, 2, 3}
    print(s)  # 输出:{1, 2, 3}
    

7.高级用法


嵌套元组

元组可以包含其他元组作为元素,这使得它们可以用于表示复杂的数据结构。

nested_tup = (1, (2, 3), (4, (5, 6)))
print(nested_tup[1])  # 输出:(2, 3)
print(nested_tup[2][1])  # 输出:(5, 6)

元组作为数据表

在处理数据库或表格数据时,元组常用于表示行数据。

rows = [
    (1, "John", "Doe"),
    (2, "Jane", "Smith"),
    (3, "Emily", "Jones")
]

for row in rows:
    print(row)
# 输出:
# (1, "John", "Doe")
# (2, "Jane", "Smith")
# (3, "Emily", "Jones")

多变量交换

元组可以用于交换多个变量的值,而不需要临时变量。

a, b = 1, 2
a, b = b, a
print(a, b)  # 输出:2 1

总结

元组是Python中重要的数据结构,因其不可变性而被广泛应用。通过本文的详细讲解,相信读者对元组的常用操作和其作为默认集合类型的用法有了深入的理解。元组的不可变性使得它们在某些场景下非常有用,如作为字典的键、函数参数和返回值等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1817670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【iOS】UI学习——界面切换

界面切换 push和poppresent和dismiss示例程序 push和pop 在 Objective-C 中,pop 和 push 通常是与 UINavigationController 一起使用的方法,用于控制导航栈中视图控制器的跳转和回退。 push 和 pop 通常成对使用,用于实现导航栈的前进和后退功能。当用户进入新的视图控制器时…

Linux——自动化运维ansibe

一、自动化运维定义 自动化--- 自动化运维: 服务的自动化部署操作系统的日常运维:日志的备份、临时文件清理、服务器日常状态巡检、(几乎包括了linux服务管理、linux 系统管理以及在docker 容器课程中涉及的所有内容)服务架构的…

FPGA专项课程即将开课,颁发AMD官方证书

社区成立以来,一直致力于为广大工程师提供优质的技术培训和资源,得到了众多用户的喜爱与支持。为了满足用户需求,我们特别推出了“基于Vitis HLS的高层次综合及图像处理开发”课程。 本次课程旨在帮助企业工程师掌握前沿的FPGA技术&#xff…

谷歌工程师指责OpenAI阻碍AGI研究进展:推迟了5到10年

Google母公司Alphabet的一位软件工程师表示,OpenAI阻碍了人工通用智能(AGI)的发展5到10年。在最近的一次播客访谈中,Google软件工程师弗朗索瓦乔莱特(Franois Chollet )表达了他对AGI研究现状的担忧。这段对…

MySQL----常见的存储引擎

存储引擎 存储引擎就是数据库如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。 MySQL存储引擎 M…

【Apollo配置中心】集成springboot自动监听属性变更和动态发布配置

1. 背景 在实际项目中,Spring Boot项目结合使用Apollo配置中心时,经常会遇到需要更新Apollo上的项目的一些配置,比如测试环境或生产环境中,需要修改某个类的属性值,如果我们在Apollo上更新了配置,已经在运…

M41T00串行实时时钟-国产兼容RS4C400

RS4C400是一种低功耗串行实时时钟(RTC)。内置32.768 kHz振荡器(外部晶体控制)和RAM的前8个字节用于时钟/日历功能,并以二进制编码十进制(BCD)格式配置。地址和数据通过双线双向总线串行传输。内…

WPF Prism框架搭建

WPF Prism框架搭建 1.引入Prism框架 在Nuget包管理器中搜索Prism&#xff0c;并添加到项目中 2.在项目中使用prism框架 2.1 修改app.xaml 删除项目中自带的StartupUri 修改Application节点为prism:PrismApplication 引入prism命名空间 <prism:PrismApplication x:C…

2024年中国移动游戏市场研究报告

来源&#xff1a;点点数据&#xff1a; 近期历史回顾&#xff1a; 面向水泥行业的5G虚拟专网技术要求&#xff08;2024&#xff09;.pdf 2024年F5G-A绿色万兆全光园区白皮书.pdf 2024年全球废物管理展望报告.pdf 内容管理系统 2024-2025中国羊奶粉市场消费趋势洞察报告.pdf 20…

MySQL 示例数据库大全

前言&#xff1a; 我们练习 SQL 时&#xff0c;总会自己创造一些测试数据或者网上找些案例来学习&#xff0c;其实 MySQL 官方提供了好几个示例数据库&#xff0c;在 MySQL 的学习、开发和实践中具有非常重要的作用&#xff0c;能够帮助初学者更好地理解和应用 MySQL 的各种功…

糖尿病患者血糖控制困难,4个辅助降糖方法分享。

对于糖尿病患者来讲&#xff0c;血糖控制极为困难&#xff0c;稍不留意就会致使忽高忽低的情况出现&#xff0c;今天我来教你 4 个办法来辅助降糖。 第一&#xff0c;在饮食上可多进食全谷类食物&#xff0c;中医认为谷类食物是脾胃的主食。经常吃这类食物不但能够给脾胃提供充…

DSSA(Domain-Specific Software Architecture)方法论

DSSA&#xff08;Domain-Specific Software Architecture&#xff09;方法论是一种针对特定问题领域的软件架构设计方法。在软件开发中&#xff0c;有些问题在特定领域是共通的&#xff0c;这些问题可以通过通用的抽象和解决方案来处理。DSSA方法论正是利用这一特点&#xff0c…

比 Safari 阅读模式更强大的阅读助手

一、简介 1、一款专为浏览器设计的扩展程序&#xff0c;旨在提供更为简洁、高效的网页阅读体验。它能够对网页内容进行智能提取和排版&#xff0c;自动屏蔽广告和噪音&#xff0c;使读者能够专注于网页的核心内容。此外&#xff0c;Circle 阅读助手还具备多种个性化功能&#x…

Mongodb在UPDATE操作中使用$pull操作

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第68篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

c++实战知识点

c实战知识点 一、概述1.数据2.C11的原始字面量3.数据类型的别名4.const修饰指针5.void关键字6.内存模型7.二级指针8.函数指针和回调函数9.数组10.C风格字符串11.二维数组用于函数的参数行指针&#xff08;数组指针&#xff09; 12.引用引用与const 13.各种形参的使用场景14.重载…

数据结构01 栈及其相关问题讲解

栈是一种线性数据结构&#xff0c;栈的特征是数据的插入和删除只能通过一端来实现&#xff0c;这一端称为“栈顶”&#xff0c;相应的另一端称为“栈底”。 栈及其特点 用一个简单的例子来说&#xff0c;栈就像一个放乒乓球的圆筒&#xff0c;底部是封住的&#xff0c;如果你想…

Druid 参数配置详解

简介 Java 程序很大一部分要操作数据库&#xff0c;为了提高性能操作数据库的时候&#xff0c;又不得不使用数据库连接池。 Druid 是阿里巴巴开源平台上一个数据库连接池实现&#xff0c;结合了 C3P0、DBCP 等 DB 池的优点&#xff0c;同时加入了日志监控。 Druid 可以很好的…

基础-01-计算机网络概论

一. 计算机网络的发展与分类 1.计算机网络的形成与发展 计算机网络&#xff1a;计算机技术与通信技术的结合 ICTITCT 2.计算机网络标准阶段 3.计算机网络分类1:通信子网和资源子网 通信子网:通信节点(集线器、交换机、路由器等)和通信链路(电话线、同轴电缆、无线电线路、卫…

HashMap第3讲——JDK1.8红黑树细节

上篇文章对HashMap的put方法进行了源码解析&#xff0c;并介绍了其中的两个亮点设计——位运算取代%和扰动计算。其中还有几个细节&#xff0c;比如每次扩容都是2^n是怎么做到的、JDK1.8增加的红黑树结构&#xff0c;由于篇幅原因没有介绍&#xff0c;本节就先来介绍其中的一个…

网络安全 - ARP 欺骗原理+实验

APR 欺骗 什么是 APR 为什么要用 APR A P R \color{cyan}{APR} APR&#xff08;Address Resolution Protocol&#xff09;即地址解析协议&#xff0c;负责将某个 IP 地址解析成对应的 MAC 地址。 在网络通信过程中会使用到这两种地址&#xff0c;逻辑 IP 地址和物理 MAC 地址&…