【流畅的Python学习笔记】2023.4.29

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

此栏目记录我学习《流畅的Python》一书的学习笔记,这是一个自用笔记,所以写的比较随意,随缘更新

泛映射类型

collections.abc 模块中有 Mapping 和 MutableMapping 这两个抽象基类,它们的作用是为dict 和其他类似的类型定义形式接口

from collections import abc

my_dict = {}
print(isinstance(my_dict, abc.Mapping))

运行结果:
True
通过isinstance 的结果能够判断出字典是广义上的映射类型

可散列的数据类型

如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现 __hash__() 方法。另外可散列对象还要有__qe__()方法,这样才能跟其他键做比较。如果两个可散列对象是相等的,那么它们的散列值一定是一样的……

多种方式创建字典

# 多种方式创建字典
a = dict(id=1, name='jack', address='A1')
b = {'id': 1, 'name': 'jack', 'address': 'A1'}
c = dict(zip(['id', 'name', 'address'], [1, 'jack', 'A1']))
d = dict([('id', 1), ('name', 'jack'), ('address', 'A1')])
e = dict({'id': 1, 'name': 'jack', 'address': 'A1'})
print(a == b == c == d == e)

运行结果:
True
原来还可以有这么多种方式创建字典

字典推导

# 字典推导
# 字典推导
info_list = [[1, 'id'], ['jack', 'name'], ['A1', 'address']]
info_dict = {x1: x2 for x1, x2 in info_list}
print(info_dict)

# 按条件推导
rider_list = [(2000, 'Kuuga'), (2001, 'Agito'), (2002, 'Ryuki'),
              (2003, 'Faiz'), (2004, 'Blade'), (2005, "Hibiki"),
              (2006, 'Kabuto'), (2007, 'Den-o'), (2008, 'Kiva'),
              (2009, 'Decade'), (2010, 'W')]
# 取2010年之前的骑士做字典推导
rider_dict = {x1: x2 for x1, x2 in rider_list if x1<2010}
print(rider_dict)

运行结果:
{1: ‘id’, ‘jack’: ‘name’, ‘A1’: ‘address’}
{2000: ‘Kuuga’, 2001: ‘Agito’, 2002: ‘Ryuki’, 2003: ‘Faiz’, 2004: ‘Blade’, 2005: ‘Hibiki’, 2006: ‘Kabuto’, 2007: ‘Den-o’, 2008: ‘Kiva’, 2009: ‘Decade’}

用setdefault处理找不到的键

书上那个例子太复杂,看了半天才看懂,自己写了一个

test_dict = {'A': 1, 'B': 2, 'C': 3}  # 测试用字典
# 找test_dict['D'](肯定是找不到)
# 可以用 d.get(k, default) 来代替 d[k],给找不到的键一个默认的返回值
print(test_dict.get('D', 'error'))
#  但是要更新某个键对应
# 的值的时候,不管使用 __getitem__ 还是 get 都会不自然,而且效率低。
# 使用setdefault设置一个默认空值
index_list = ['A', 'B', 'C', 'D', 'E', 'F']
for item in index_list:
    # 如果遇到test_dict[item],且索引item不存在,则补一个默认值
    test_dict.setdefault(item, 'No Info')
print(test_dict)

运行结果:
{‘A’: 1, ‘B’: 2, ‘C’: 3, ‘D’: ‘No Info’, ‘E’: ‘No Info’, ‘F’: ‘No Info’}

有时候为了方便起见,就算某个键在映射里不存在,我们也希望在通过这个键读取值的时候能得到一个默认值。有两个途径能帮我们达到这个目的,一个是通过 defaultdict 这个类型而不是普通的 dict,另一个是给自己定义一个 dict 的子类,然后在子类中实现__missing__ 方法。

defaultdict:处理找不到的键的一个选择

import collections

# 使用 list 作为 default_factory ,可以轻松地将一系列键值对分组到列表字典中
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = collections.defaultdict(list)
for k, v in s:
    d[k].append(v)

print(s)
# factory_function可以是list、set、str等等,作用是当key不存在时,返回的是工厂函数的默认值,比如list对应[ ],str对应的是空字符串,set对应set( ),int对应0。
dd = collections.defaultdict(str)
l = ['111', 'aaa', 'ddd']
dd['111'] = '?'
for i in l:
    # 对应的键没给值,全都变成空字符串
    print(dd[i])

运行结果:
[(‘yellow’, 1), (‘blue’, 2), (‘yellow’, 3), (‘blue’, 4), (‘red’, 1)]
?

特殊方__missing__

# 继承字典类的子类
class MyDict(dict):

    def __missing__(self, key):
        self[key] = '默认'
        return self[key]


# 测试一下
d = MyDict({'A': 1, 'B': 2, 'C': 3})
print(d)

# 找不存在的索引对应的值
print(d['D'])

运行结果:
{‘A’: 1, ‘B’: 2, ‘C’: 3}
默认文章来源地址https://www.toymoban.com/news/detail-429947.html

到了这里,关于【流畅的Python学习笔记】2023.4.29的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Linux shell编程学习笔记29:shell自带的 脚本调试 选项

    Linux shell脚本的调试方法比较多,上次我们探讨和测试了shell内建命令set所提供的一些调试选项,其实 shell 本身也提供了一些调试选项。我们以bash为例来看看。 purleEndurer @ csdn ~ $ bash --help GNU bash, version 4.2.46(2)-release-(x86_64-redhat-linux-gnu) Usage:  bash [GNU long option] [option] ...      

    2024年02月04日
    浏览(40)
  • 2023小米秋招真题-手机流畅运行的秘密

    这是一道小米面试题,使用 贪心的思想 。 8月份发布会一结束,米小兔就在公司领到了一台最新发布的XiaomiMX Fold3手机。这是一款小米舰折屏手机,并搭载了全新升级架构的MIU114系统。其先进的应用引擎不仅让系统更流畅,应用体验也大幅提升。在一个优化项中,为了尽可能

    2024年02月09日
    浏览(27)
  • 【STM32】STM32学习笔记-USART串口收发HEX和文本数据包(29)

    串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式, 电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和

    2024年01月19日
    浏览(36)
  • 学习记录:2023.5.4

    MySQL分页: 使用limit实现分页 LIMIT出现在查询语句的最后,可以使用一个参数或两个参数来限制取出的数据。其中第一个参数代表偏移量:offset(可选参数),第二个参数代表取出的数据条数:rows 在进行分页之前,我们需要先根据数据总量来得出总页数,这需要用到

    2024年02月03日
    浏览(26)
  • 学习记录:2023.4.28

    1、SVG学习: 百度百科:SVG是可缩放矢量图形,是基于可扩展标记语言(标准通用标记语言的子集),用于描述二维矢量图形的一种图形格式。它由万维网联盟制定,是一个开放标准。应该是一种开放标准的矢量图形语言,可让你设计激动人心的、高分辨率的Web图形页面。用户可

    2024年02月01日
    浏览(34)
  • 【leetcode】7.29记录

    题目 考察内容 思路 踩坑 剑指Offer 05.替换空格(easy) 字符串 创建StringBuffer,用charAt获取每个字符并判断,用sb.append©添加字符,最后返回sb.toString() 541.反转字符串 II (easy) 字符串 针对每种情况直接实现就行 string.substring(start,end)截取到的不包含end 151.反转字符串中的单词(medium

    2024年02月15日
    浏览(27)
  • 行业追踪,2023-08-29

    凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让市场来告诉你 跟踪板块总结: 成交额超过 100 亿 排名靠前,macd柱由绿转红 成交量要大于均线 有必

    2024年02月10日
    浏览(24)
  • 2023-08-29力扣每日一题

    链接: 823. 带因子的二叉树 题意: 用给的数字建二叉树,要求父节点是子节点的乘积 解: 乐了 1500ms+30MB //注释版120ms+18MB 实际代码: 限制: 1 = arr.length = 1000 2 = arr[i] = 109 arr 中的所有值 互不相同

    2024年02月11日
    浏览(22)
  • Java XPath 使用(2023/08/29)

    众所周知,Java 语言适合应用于 Web 开发领域,不擅长用来编写爬虫。但在 Web 开发过程中有时又存在爬取数据的需求,此时采用其它语言编写独立爬虫模块的话存在维护不方便的问题,所以此处笔者选择了使用 Java + XPath 实现简单的爬虫功能,如果爬虫需求较多且复杂还是推

    2024年02月10日
    浏览(31)
  • 2023-07-29力扣每日一题

    链接: 141. 环形链表 题意: 求链表是否有环 解: 刚好昨天做完的初级算法链表题,翻转和暴力 实际代码: 限制: 链表中节点的数目范围是 [0, 104] -105 = Node.val = 105 pos 为 -1 或者链表中的一个 有效索引 。

    2024年02月15日
    浏览(27)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包