《Fluent Python》笔记

1 functools.partial()和functools.partialmethod()

1)functools.partial()主要用于将原函数的某些参数固定,减少代码冗余,减少函数调用时的参数。

import functools
import operator
triple = functools.partial(operator.mul, 3)
print(list(map(triple, range(10))))
# [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

2)functools.partialmethod 函数(Python 3.4 新增)的作用与partial 一样,不过是用于处理方法的

from functools import partialmethod

class Cell(object):
    def __init__(self):
        self._alive = False

    @property
    def alive(self):
        return self._alive

    def set_state(self, state):
        self._alive = bool(state)

    set_alive = partialmethod(set_state, True)
    set_dead = partialmethod(set_state, False)
    set_alive_p = functools.partial(set_state, True)


c = Cell()
print(c.alive)

c.set_alive()
print(c.alive)

# c.set_alive_p() #报错,partial()不用于处理方法
print(c.alive)

参考:
偏方法partialmethod
python中partial的使用规则
原书5.10.2节
有待更新

2 python中的浅拷贝和深拷贝

1)python中非容器类型(比如数字、字符串和其他“原子”类型的对象,像xrange对象等)没有被拷贝一说,浅拷贝是用完全切片操作来完成的。
2)其他浅复制的几种情况:
使用切片[:]操作
使用工厂函数(如list/dir/set)
使用copy模块中的copy()函数
3)python中的赋值(=)实际上是一种引用,对赋值、浅拷贝和深拷贝原书8.3节和 python中对象的赋值、浅拷贝和深拷贝,讲的很清楚了。
4)元组不可修改和浅拷贝的问题
4.1)元组是相对不可变的,其不可修改指的是不可使用=(assignmen),但元组内存在list等可变对象可使用append/extend,因为append/extend只是增加了列表中的值,而列表的内存地址并没有发生改变。

l1 = [1, 2]
print(id(l1))
l1.extend([3, 4])
print(id(l1))
print(l1)
# 2108870255176 内存地址并没有发生改变,元组中存储的是引用,内存地址没变当然可以使用
# 2108870255176
# [1, 2, 3, 4]
t1 = (1, 2, [3, 4])
t1[2].append(5)
print(t1)
# (1, 2, [3, 4, 5])

4.2)元组中+=的问题
首先需要重温+=这个运算符,如a+=b:

  • 对于可变对象(mutable object)如list, +=操作的结果会直接在a对应的变量进行修改,而a对应的地址不变.
  • 对于不可变对象(imutable object)如tuple, +=则是等价于a = a+b 会产生新的变量,然后绑定到a上而已.
  • python中+=不是原子操作,相当于两步,extend和=
>>> a = ([1, 2], 3, 4)
>>> a[0] += [3, 4]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> print(a)
([1, 2, 3, 4], 3, 4)
#+=相当于首先进行a[0].extend([3,4]),改变了元组a引用的值,而后进行=操作,
#报错(元组不可修改,不支持=操作),但实际上a引用的值已经发生了改变。

参考:
Python中tuple+=赋值的四个问题
Why does += of a list within a Python tuple raise TypeError but modify the list anyway? [duplicate]

3 可哈希的问题

1) 散列函数是一种从任何一种数据中创建小的数字”指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值的指纹。散列值通常用来代表一个短的随机字母和数字组成的字符串。好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据会使得数据库记录更难找到。你可以把哈希值简单地理解成是一段数据(某个文件,或者是字符串)的DNA,或者身份证;
2)通过一定的哈希算法(典型的有MD5,SHA-1等),将一段较长的数据映射为较短小的数据,这段小数据就是大数据的哈希值。他有这样一个特点,他是唯一的,一旦大数据发生了变化,哪怕是一个微小的变化,他的哈希值也会发生变化。另外一方面,既然是DNA,那就保证了没有两个数据的哈希值是完全相同的。
3)正是因为这样的特点,它常常用来判断两个文件是否相同。比如,从网络上下载某个文件,只要把这个文件原来的哈希值同下载后得到的文件的哈希值进行对比,如果相同,则表示两个文件完全一致,下载过程没有损坏文件。而如果不一致,则表明下载得到的文件跟原来的文件不同,文件在下载过程中受到了损坏。
4)相同的数据有相同的哈希值。
5) python术语对照表中有:
在这里插入图片描述
由此可知可哈希对象要满足:哈希值在其生命周期内不改变、有__hash__方法、有__eq__方法(原书3.1节也对此进行了讲解);
5.1)解析以下原书9.6节的代码vector2d.py,改代码将Vector2d变成了一个可哈希对象:

from array import array
import math

class Vector2d:
    typecode = 'd'

    def __init__(self, x, y):
        self.__x = float(x) #将x,y变成私有属性使其不能够改变创建的实例,保持创建的实例不发生改变
                           #进而保持实例的哈希值不变
        self.__y = float(y)

    @property
    def x(self):
        return self.__x

    @property
    def y
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Fluent Python》是一本非常优秀的Python编程指南,它不仅深入浅出地介绍了Python语言的内部原理以及高级编程技巧,而且还涵盖了众多实用的代码示例和案例,读者不仅能够学习到Python语言的基础知识,还能够了解到Python编程的最佳实践和设计模式。 对于Python初学者来说,《Fluent Python》是一本非常好的入门指南。本书系统地介绍了Python语言的各个方面,包括Python语法、高级数据结构、函数式编程、面向对象编程、并发编程等,帮助读者掌握Python的基本使用方法和编程规范。而对于有经验的Python开发者来说,《Fluent Python》则提供了更加深入和高级的内容,如元编程、元类、装饰器等,这些内容可以帮助读者更加高效地编写Python代码和进行系统设计。 《Fluent Python》还提供了丰富的代码示例和案例,包括网络编程、数据处理、机器学习等,这些例子可以帮助读者深入理解Python编程的应用场景和解决问题的方法。此外,《Fluent Python》还有大量的扩展阅读内容,如函数式编程、计算机科学、Python社区等,让读者更加深入地了解Python编程及其应用。 总之,如果你想要深入学习Python编程,掌握Python语言的内部原理、高级特性和最佳实践,那么《Fluent Python》是一本非常值得推荐的书籍。 ### 回答2: 《Fluent Python》是一本高级Python编程指南,它由Luciano Ramalho撰写,主要涵盖了Python 3的高级语法和设计模式。 与其他Python书籍不同,《Fluent Python》聚焦于如何使用Python的核心概念和最佳实践,以及如何将它们应用于实际问题。本书分为三部分,分别是Python的数据模型、函数作为对象以及面向对象编程和其他高级话题。 在《Fluent Python》中,作者旨在帮助读者深入理解不同类型的Python对象以及它们之间的相互作用。此外,还介绍了Python中的装饰器、生成器、协程和异步编程等技术。此外,还涵盖了如何使用Python的文档、测试和调试工具,以及如何处理日期、时间和时区的常见问题。 《Fluent Python》提供了大量的示例代码和实现,以便读者深入学习和练习。它适用于有一定Python编程经验和想要提高自己的Python能力的读者,也适合那些希望在编写高效Python代码方面深入了解的开发人员。 总之,《Fluent Python》是一本全面深入的Python编程指南,适合有一定Python编程基础的读者学习。通过学习本书,读者将掌握Python的高级语法、设计模式和最佳实践,提高自己的Python编程能力。同时,本书的实例丰富,对于Python开发工作者,也是一个较为实用的参考工具。 ### 回答3: Fluent Python是一本由Luciano Ramalho所写的Python编程语言进阶书籍,其全称是《Fluent Python: Clear, Concise, and Effective Programming》。Fluent Python的PDF版本则是该书的电子版,方便读者进行在线阅读或是离线下载,进行学习和参考。 该书主要涵盖了Python编程语言的核心概念和高级特性,旨在帮助读者了解Python的内部工作机制,并使用Python编写优美的、高效的、易于维护的代码。该书主题从简单的数据结构和函数式编程开始,到复杂的并发编程和元类等高级技术,全方位覆盖了Python编程的方方面面。 Fluent Python的PDF版本主要加入了方便的电子阅读功能,例如利用大纲和书签浏览内容、搜索文本等。该电子版PDF的另一个优点是可以离线学习,无需互联网连接,可以随时随地进行学习、阅读和练习。 总之,Fluent Python PDF是Python编程语言的进阶参考书籍的电子版本,支持离线学习,并提供了便捷的电子阅读功能。该书的内容涵盖Python编程的高级技术,并且适合已经入门的Python开发人员,帮助他们深入学习Python的内部工作机制,并提高他们的编程技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值