首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >开源图书《Python完全自学教程》第5章

开源图书《Python完全自学教程》第5章

作者头像
老齐
发布2022-05-17 09:33:00
发布2022-05-17 09:33:00
77400
代码可运行
举报
文章被收录于专栏:老齐教室老齐教室
运行总次数:0
代码可运行

第5章 容器

★莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。 ——苏轼 ”

将字符串、列表和元组视为序列,是因为组成它们的成员具有顺序。这是对 Python 内置对象归类的一种方式。在有的资料中,还提出了“基础对象类型”的类别,包括整数类型、浮点数类型、字符串类型和布尔类型。所以,根据对象的不同特点,可以有不同的聚类结果。本章中的“容器”,也是一种归类方式,一般认为包括列表、元组和字典、集合(含可变集合和不变集合),前两种对象已经在第4章学习过,这里将开始学习后两种。诚然,读者也可以创造其他的归类方式。

5.1 字典

假设有一种需求,要存储城市和电话区号,用前面已经学习过的知识,可以这么做:

代码语言:javascript
代码运行次数:0
运行
复制
>>> cities = ['soochow', 'hangzhou', 'shagnhai']
>>> phones = ['0512', '0571', '021']

为了让城市和区号能对应起来,在创建列表的时候必须按照同样的索引顺序。若要显示 'soochow' 的电话号码,必须通过每个列表的索引获取:

代码语言:javascript
代码运行次数:0
运行
复制
>>> print(f"{cities[0]}: {phones[0]}")
soochow: 0512

类似这样,一个对象与另外一个对象之间建立对应关系,也是日常生活和生产中常见的事情,比如建立员工的姓名和工资、奖金之间的对应关系,建立学生和各个科目考试成绩之间的对应关系等等。既然如此司空见惯,Python 必然要有内置对象类型,这就是字典( Dictionary )——印刷的字典(比如《新华字典》)就是对应关系的典型代表。

5.1.1 创建字典

在此之前,已经用引号创建了字符串、用圆括号创建了元组,用方括号创建了列表,低头看看键盘,按照此思路发展,并且排除在其他地方已经使用的符号——比如 * 等,如果选用一个用于创建字典的符号,最可能用哪一个?

Python 发明人选择了 { } ,你是否也想到了这个?如果是,则英雄所见略同;如果不是,也要认可此规定。

代码语言:javascript
代码运行次数:0
运行
复制
>>> d = {"name": "laoqi", "age": 29}    # (1)
>>> type(d)
<class 'dict'>
>>> d
{'name': 'laoqi', 'age': 29}

注释(1)创建了一个字典对象,并用变量 d 引用此对象。从 type(d) 的返回值可知,Python 中以 dict 表示字典(或字典类型)。下面参照图5-1-1,理解字典的组成和要求:

  • 字典对象用英文状态下的符号 { } 包裹。
  • 符号 {} 里面的成员是“键值对”,键值对与键值对之间用英文状态的逗号分割。
  • 所谓键值对,即两个对象之间建立对应关系,并以英文冒号作为分隔符,冒号左侧的称为( Key ),右侧的称为此键所对应的( Value )。键与值配对,组成一个字典中的单元,称为“键值对”。

图5-1-1 字典的组成

字典中的键值对,不能随心所欲地创立——本书的目录和页码之间也是一种对应关系,不能乱写——有如下要求:

  • “键”必须唯一,不能重复——参考本书目录理解,目录名称不能重复。
  • “键”必须是不可变对象——如果书的目录名称会变化,那就不仅仅是眼花缭乱,而是手忙脚乱了。
  • “值”可以是 Python 中任何类型对象。
  • “值”可以重复。“键”已经作为“键值对”的唯一标识了,对“值”就不做唯一性要求。

比如,如果创建这样的字典:

代码语言:javascript
代码运行次数:0
运行
复制
>>> {'name': 'laoqi', 'name': 'zhangsan'}
{'name': 'zhangsan'}

不会报错,但是结果会“最后一个有效”——“键”是键值对的唯一标识。

至此,在已经学过的 Python 内置对象类型中,能够作为键值对中“键”的有:数字(整数、浮点数、复数)、字符串、元组。

代码语言:javascript
代码运行次数:0
运行
复制
>>> {1: 'first', (1,2,3): [1,2,3], 3.14: {} }
{1: 'first', (1, 2, 3): [1, 2, 3], 3.14: {}}

如果用列表作为键,会怎样呢?

代码语言:javascript
代码运行次数:0
运行
复制
>>> {[1, 2, 3]: "python"}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

出现了 TypeError 异常,特别注意看提示信息,告诉我们出问题的根源在于列表是 unhashable 类型。这是什么意思?简要说明:

  • hash:翻译为“散列”或“哈希”,“hashable”意即“可散列”、“可哈希”。截止目前,已经学习过的 Python 内置对象中,数字、字符串、元组都是可散列的,也是不可变对象。
  • unhasable:翻译为“不可散列”、“不可哈希”,此前学过的列表和现在学习的字典,都是此类型的对象,同时为可变对象。

所以,字典也不能作为键值对的键。

代码语言:javascript
代码运行次数:0
运行
复制
>>> {{1:2}:"python"}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'

特别提醒,如果用元组作为键值对的键,其成员只能是数字、字符串或者元组,不能包括任何可变对象。例如下面的示例,要仔细观察。

代码语言:javascript
代码运行次数:0
运行
复制
>>> {([1,2],3,4): 'tuple'}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
    
>>> {(([1,2],),3,4): 'tuple'}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

成员的成员,并且照此循环,都不能包括可变对象。

老生常谈,既然字典类型的名称是 dict ,Python 的内置函数就会有 dict()

代码语言:javascript
代码运行次数:0
运行
复制
>>> dct = dict()    # (2)
>>> dct
{}
>>> bool(dct)
False

用注释(2)创建一个空字典(直接用 dct = {} 也能创建空字典),其布尔值是 False 。特别观察,注释(2)中的变量名称,千万不要使用 dict ,否则后患无穷、自食其果。

如果用 dict() 函数创建非空字典,必须使用关键词参数的形式声明对应关系(关键词参数,详见第4章4.2.6节或第7章7.2.1节)。比如:

代码语言:javascript
代码运行次数:0
运行
复制
>>> dict(name='laoqi', age=38)
{'name': 'laoqi', 'age': 38}

所得字典的键就是 dict() 中的关键词参数 nameage ——虽然键是字符串,在 dict() 中不要将 nameage 写成 'name''age' ,特别要注意此细节。

此外,dict() 还支持以可迭代对象为参数创建字典,例如:

代码语言:javascript
代码运行次数:0
运行
复制
>>> dict([('a', 1), ('lang', 'python')])
{'a': 1, 'lang': 'python'}

此处以列表 [('a', 1), ('lang', 'python')] 为参数,列表中的成员是元组,每个元组内有两个对象,用这种方式约定了两个对象之间的对应关系。

在理解了字典的创建方法之后,读者也应该初步理解“容器”的含义。不论列表,元组还是字典,里面的可以放很多个成员(容器里面的“东西”),每个成员之间用逗号分隔。第4章曾经提到过“列表是个筐”,“筐”就是容器——容器更显得文雅一些。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老齐教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第5章 容器
    • 5.1 字典
      • 5.1.1 创建字典
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档