Chapter 03 复合数据类型-2

ops/2024/12/27 11:24:48/

1.元组 tuple

        元组(tuple)是Python中的一种数据结构,它与列表(list)类似,但有一个重要的区别:元组是不可变的,即一旦创建,其元素就不能被修改。

元组的定义:

        元组是由圆括号()括起来的、由逗号分隔的多个元素组成的序列。这些元素可以是不同类型的数据,如整数、浮点数、字符串、列表、甚至是另一个元组

元组的创建:

直接赋值=

使用圆括号()将多个元素括起来,元素之间用逗号分隔。

注意:即使只有一个元素,也需要加上逗号来区分它是一个元组还是一个普通的括号表达式。

python">>>>t1 = ()#创建一个空元组变量t1
>>>t2 = (1,2,3,4,5)]#创建一个元素为整数的元组变量t2
>>>t3 = ('Python','BigData','AI') #创建元素为字符串的元组变量t3;
>>>t4 = ('乔峰', [1997,7,7],(90,1.83)) #元素的数据类型可以各不相同

注意:即使只有一个元素,也需要加上逗号来区分它是一个元组还是一个普通的括号表达式。

正确的元组定义
        当你使用逗号来分隔元素,并且整个表达式被括号包围时,Python 会将其视为一个元组

python">t = (1,)
print(t)  # 输出: (1,)
print(type(t))  # 输出: <class 'tuple'>

错误的元组定义(实际上是整数)
        当你只写 (1) 而不加逗号时,Python 不会将其视为元组,而是将其视为一个整数表达式,括号在这里没有作用(除了在某些数学运算中改变优先级)

python">t = (1)
print(t)  # 输出: 1
print(type(t))  # 输出: <class 'int'>

这里,Python 抛出了一个 TypeError,因为整数 1 不能被迭代来生成元组。 

尝试将整数转换为元组
        当你尝试使用 tuple() 函数将一个整数转换为元组时,你会遇到错误,因为 tuple() 函数期望一个可迭代对象(如列表、字符串、集合等),而整数不是可迭代的:

python">t = tuple(1)
# TypeError: 'int' object is not iterable

tuple()函数

tuple()函数可以将一个可迭代对象(如列表、字符串、集合等)转换为一个元组

python">tuple()函数可将其他序列转换为元组
>>> x = tuple() # 创建一个空元组
>>> y = [0,1,2,3,4] # 创建列表y
>>> z = tuple(y) #把列表y转换为元组, z的值为(0, 1, 2, 3, 4)
>>> t1= tuple(range(5)) # t1的值为 (0, 1, 2, 3, 4)
>>> t2= tuple('Python')  # t2的结果为('P', 'y', 't', 'h', 'o', 'n')

元组的主要操作:元素增、删、改、查

元组一旦定义就不允许更改其元素

tuple( )冻结列表,而list( )融化元组

+,*运算符,in关键字,len(),max(),min()等内置函数,切片的用法与列表一致。

元组的优势:

元组的速度比列表更快

        元组在性能上通常比列表更快,尤其是在创建和访问元素方面。这是因为元组是不可变的(immutable),一旦创建,其内容和结构就不能被改变。这种不可变性允许Python在内部对元组进行优化,例如通过减少内存分配和复制操作,以及可能利用更高效的数据结构来实现元组。相比之下,列表是可变的(mutable),允许在创建后添加、删除或修改元素,这些操作通常需要更多的内存和计算资源。

定义了一系列常量值时,使用元组而不是列表

        当您有一系列不需要改变的常量值时,使用元组而不是列表是一个更好的选择。这是因为元组的不可变性可以防止代码意外地修改这些值,从而增加代码的健壮性和可读性。此外,由于元组在性能上通常更优,使用它们还可以提高程序的运行效率。

元组对不需要改变的数据进行“写保护”将使得代码更加安全

        元组的不可变性提供了一种自然的“写保护”机制,可以防止代码中的错误或恶意行为修改数据。这种保护对于维护代码的正确性和稳定性至关重要。例如,在函数参数中使用元组可以确保传递给函数的值在函数执行期间不会被修改,从而避免了潜在的副作用和错误。

元组可用作字典键(特别是包含字符串、数值和其它元组这样的不可变数据的元组)。列表不能当做字典键使用,因为列表不是不可变的。

        由于元组是不可变的,因此它们可以用作字典(dictionary)的键。字典是一种基于键值对的数据结构,其中键必须是不可变的,以便能够在内部通过哈希函数进行快速查找。元组作为键时,可以包含字符串、数值和其他不可变的元组等数据类型。这使得元组在需要基于多个值进行快速查找和检索的场景中非常有用。

相比之下,列表由于是可变的,因此不能用作字典的键。如果尝试将列表用作键,Python将抛出一个TypeError异常,指出列表不是不可变的类型。

字典dict

字典是无序、可变序列

  • 无序性字典中的元素(键值对)没有固定的顺序。这意味着你不能通过索引来访问字典中的元素,而只能通过键来访问。
  • 可变性:与元组不同,字典是可变的。这意味着你可以在创建后添加、删除或修改字典中的键值对。

字典的定义

        字典的定义使用大括号 {} 来包含所有的键值对。每个键值对由键和值组成,它们之间用冒号 : 分隔。不同的键值对之间用逗号 , 分隔。(所有的元素放在大括号{}中,每个元素由键和值用冒号分隔,元素之间用逗号分隔。)

python">d = {'key1': 'value1', 'key2': 'value2'}

键的唯一性和不可变性

  • 键的唯一性:在字典中,每个键都是唯一的。如果尝试向字典中添加一个已经存在的键,其对应的值将被新值覆盖。
  • 键的不可变性字典的键必须是不可变的数据类型,如整数、实数、复数、字符串或元组。这是因为字典在内部通过哈希函数来存储和查找键值对,而哈希函数要求输入是不可变的。

字典的创建:

        字典可以通过多种方式创建:


 

  1. 1.直接赋值
    你可以直接通过赋值语句来创建一个字典。这是最常见和最简单的方法。

  2. python">>>> d1 = {} #空字典
    >>> d2 = {'name':'乔峰','age':40,('birth','height'):(1997,1.83)}#d2为 {'name': '乔峰', 'age': 40, ('birth', 'height'): (1997, 1.83)}
    

    2.使用 dict() 函数
    dict() 函数可以用来创建一个新的空字典,或者从其他可迭代对象(如列表、元组的列表等)中创建字典

  3. python">dict()可利用已有数据(键数据、值数据)创建字典:
    >>> d1 = dict() #空字典
    >>> keys = ['Python','C','mz']
    >>> values = [100,80,60] 
    >>> d3 = dict(zip(keys, values))#{'Python': 100, 'C': 80, 'mz': 60}
    >>> dx = dict(name=‘乔峰’, age=40)# {'name': '乔峰', 'age': 40}
    
  4. 3.以给定内容为键,创建值为空的字典

  5. python">>>> d2 = dict.fromkeys(['name', 'age’])
    >>> d4 = dict.fromkeys([1,2,3])
    >>> d4
    {1: None, 2: None, 3: None}
    

    zip() 函数: 内置函数,将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象。

    python">>>>a = [1,2,3]
    >>> b = [4,5,6]
    >>> c = [7,8,9,10,11]
    >>> z1 = zip(a,b)  # 返回一个对象
    >>> z1
    <zip object at 0x103abc288>
    >>> list(z1)  # list() 将z1转换为列表后可输出
    [(1, 4), (2, 5), (3, 6)]
    >>> list(zip(a,c)) # 元素个数与最短的列表一致
    [(1, 7), (2, 8), (3, 9)]
    

    字典的主要操作:

  6. 增(增加)

  7. 字典中添加新的键值对,或者修改现有键的值。

  8. 以键为下标赋值

  9. 如果键已经存在,则更新该键的值;如果键不存在,则添加新的键值对。

  10. python">d['address'] = '123 Main St'  # 添加新的键值对
    d['age'] = 31  # 修改现有键的值
    python">>>> sc={'Python': 100, 'C': 80, 'mz': 60}
    >>> sc[‘Java’] = 90 #不存在键’Java’
    >>> sc
    {'Python': 100, 'C': 80, 'mz': 60, 'Java': 90}
    >>> sc[‘C’] = 90  #存在键’C’
    >>> sc
    {'Python': 100, 'C': 90, 'mz': 60, 'Java': 90}
    
  11.  使用update()方法

  12.         将另一个字典的键值对添加到当前字典中。如果键已经存在,则更新该键的值;如果键不存在,则添加新的键值对。

  13. python">new_data = {'email': 'alice@example.com', 'phone': '123-456-7890'}
    d.update(new_data)  # 将new_data中的键值对添加到d中
  14. 删(删除)

  15. 1.del删除整个字典或某个元素

  16. 删除整个字典

  17. python">d = {'name': 'Alice', 'age': 30}
    del d  # 删除整个字典d
    # 此时,尝试访问d将引发NameError,因为d已经被删除

    删除字典中的某个元素

  18. python">d = {'name': 'Alice', 'age': 30}
    del d['name']  # 删除键为'name'的键值对
    # 此时,d中只剩下{'age': 30}
  19. 2.clear()方法来删除字典中所有元素

  20. clear() 方法用于删除字典中的所有元素,使其变为一个空字典

  21. python">d = {'name': 'Alice', 'age': 30}
    d.clear()  # 删除d中的所有元素
    # 此时,d变为{}
  22. 3.pop()方法删除并返回指定键的元素

  23.    pop() 方法用于删除并返回字典中指定键的元素。如果指定的键不存在,将引发KeyError异常。不过,可以通过为pop()方法提供一个默认值来避免这个异常。

  24. python">d = {'name': 'Alice', 'age': 30}
    removed_value = d.pop('name')  # 删除并返回键为'name'的元素的值
    # 此时,removed_value为'Alice',d变为{'age': 30}# 如果键不存在,提供默认值避免KeyError
    # removed_value = d.pop('gender', 'default_value')  # 返回'default_value'
  25. 4.popitem()方法删除并返回字典中的一个元素

  26.    popitem() 方法用于删除并返回字典中的一个元素(键值对)。需要注意的是,popitem() 方法在Python 3.7+版本中返回的是字典中的一个任意元素(因为字典在Python 3.7+中是有序的),而在更早的版本中,它返回的是最后插入的元素(但这并不总是可靠的,因为字典在Python 3.6及更早版本中是无序的)。

  27. python">d = {'name': 'Alice', 'age': 30}
    removed_item = d.popitem()  # 删除并返回一个元素(键值对)
    # 在Python 3.7+中,removed_item可能是('name', 'Alice')或('age', 30),具体取决于字典的内部实现和元素插入顺序
    # 此时,d将少一个元素
  28.  查(查询)

  29. 字典元素的访问: 

  30.         使用键作为下标来访问字典中的值。如果键存在,则返回对应的值;如果键不存在,则抛出KeyError异常(除非使用get()方法,它会返回None或指定的默认值)。​​​​​​​

  31. python">d = {'name': 'Alice', 'age': 30}
    print(d['name'])  # 输出: Alice
    print(d.get('age'))  # 输出: 30
    print(d.get('gender', 'unknown'))  # 输出: unknown(因为'gender'键不存在
python">>>> sc={'Python': 100, 'C': 80, 'mz': 60}
>>> sc['C']
80
>>> sc[‘Java’] #不存在Java键,抛出异常
Traceback (most recent call last):File "<pyshell#3>", line 1, in <module>sc['Java']
KeyError: 'Java'
python">for item in sc.items(): #输出字典元素    print(item)
for key, value in sc.items(): #序列解包print(key, value)
for key in sc:  #默认输出字典的键print(key)

  1. 改(修改)

  2.        实际上,修改操作可以通过上述的“增加”操作中的以键为下标赋值来实现。当键已经存在时,为其赋予新值即视为修改。

  3. 赋值= 可直接修改对应元素的值;

  4. python">d = {'name': 'Alice', 'age': 30}
    # 修改'age'键对应的值
    d['age'] = 31
    # 此时,d变为{'name': 'Alice', 'age': 31}
    
  5. 字典元素也是对象,支持相关类型操作:

  • 可哈希性:虽然字典本身是不可哈希的(因此不能作为另一个字典的键),但字典中的键必须是可哈希的。这通常是因为键需要支持哈希函数来计算其哈希值,以便在字典内部进行高效的存储和查找。

  • 动态属性:虽然字典的键值对没有像类实例那样明确的“属性”概念,但你可以通过键来动态地访问和修改字典中的内容,这在某种程度上类似于对象的属性访问。

  • 方法调用字典对象本身支持一系列方法,如keys()values()items()等,用于返回字典的键、值或键值对视图。此外,字典还支持get()pop()update()等方法来执行特定的操作。

  • 迭代字典支持迭代操作,你可以使用for循环来遍历字典的键、值或键值对。

  • 比较操作:虽然字典本身不支持直接的比较操作(如==<>等用于比较两个字典是否相等或大小关系),但你可以通过比较它们的元素(即键值对)来间接地实现这一点。通常,这需要你编写自定义的比较逻辑或使用Python内置的==运算符来比较两个字典是否包含相同的键值对。 

 编写代码,实现以下功能:

1.键盘输入一个字符串,统计其中每个字母和它出现的次数。

2.根据上述统计情况,以词云方式展示结果。

3.统计三国演义中人名出现的频率。


http://www.ppmy.cn/ops/145361.html

相关文章

软件老化分析

软件老化 课程&#xff1a;软件质量分析 作业 解答 Python代码如下&#xff1a; n int(input("类别数&#xff1a;")) theta list(map(float, input("各个类别的权重&#xff1a;").split())) m list(map(int, input("各个类别的度量元数量&…

CES Asia是一个关于什么的展会?

自2015年创办以来&#xff0c;CES Asia&#xff08;赛逸展&#xff09;一直是亚洲消费电子领域的盛会&#xff0c;展会汇聚了全球顶尖科技企业&#xff0c;展示了众多前沿创新成果&#xff0c;成为引领消费电子行业发展的风向标。 2015年&#xff0c;CES Asia首次大规模展示了虚…

Kubernetes 镜像拉取策略全解析:如何根据需求选择最佳配置?

在Kubernetes集群里&#xff0c;拉取容器镜像是一个非常关键的步骤。这些镜像包含了应用程序及其所有需要的依赖项&#xff0c;Kubernetes通过拉取这些镜像来启动Pod中的容器。为了提升集群的稳定性、速度和安全性&#xff0c;Kubernetes提供了几种不同的镜像拉取策略。这篇文章…

golangci-lint安装与Goland集成

golangci-lint安装与Goland集成 1.golangci-lint概述2.golangci-lint安装3.Goland 中集成 golangci-lint4.golangci-lint 的使用5.排除代码检查 1.golangci-lint概述 golangci-lint是用于go语言的代码静态检查工具集 官网地址&#xff1a;golangci-lint 特性&#xff1a; 快…

深度解析:电商平台API接口的安全挑战与应对策略

随着电子商务的蓬勃发展&#xff0c;电商平台与外部服务、内部系统之间的数据交换和通信变得日益频繁。API&#xff08;应用程序编程接口&#xff09;接口作为这一过程中的关键枢纽&#xff0c;其安全性显得尤为重要。API接口不仅承载着商品管理、订单处理、支付结算、用户管理…

JS 异步 ( 一、异步概念、Web worker 基本使用 )

文章目录 异步代码异步执行概念ES6 之前的异步 Web worker 异步 代码异步执行概念 通常代码是自上而下同步执行的&#xff0c;既后面的代码必须等待前面的代码执行完才会执行&#xff0c;而异步执行则是将主线程中的某段代码交由子线程去执行&#xff0c;当交给子线程后&…

通过GRE协议组建VPN网络

GRE&#xff08;Generic Routing Encapsulation&#xff0c;通用路由封装协议&#xff09;协议是一种简单而有效的封装协议&#xff0c;它在网络中的广泛应用&#xff0c;比如在构建VPN网络。   GRE是一种封装协议&#xff0c;它允许网络层协议&#xff08;如IP&#xff09;的…

【gulp】gulp 的基本使用

gulp 是一个基于node的自动化打包构建工具&#xff0c;前端开发者可以使用它来处理常见任务&#xff1a; 创建项目 进入项目 npm init -ynpm i gulp -g &#xff08;使用命令 gulp&#xff09;npm i gulp -D # 开发依赖&#xff08;前端工具都是开发依赖 本地安装 代…