您的位置:首页 > 编程语言 > Python开发

流畅的Python第四章 文本和字节序列 第五章一等函数 第六章使用一等函数实现设计模式

2019-06-14 20:28 465 查看

人类使用文本,计算机使用字节序列.
一个字符串是一个字符序列.bytes字面量以b开头: b’caf\xc3\xa9’
bytes在python3中是不可变类型,bytrarrary是可变类型,bytes或bytearrary对象的各个元素是介于0-255之间的整数.
bytes对象的切片还是bytes对象,即使只有一个字节的切片.
二进制序列其实是整数序列,但是他们的字面量表示法表名其中有ASCII文本,因此,各个字节的值可能会使用下列三种不同的方式显示
1 可打印的ASCII范围内的字符(从空格到~),使用ASCII字符本身
2 制表符 换行符 回车符和\对应的字符,使用转义序列\t \n \r \
3 其他字节的值 使用十六进制转义序列
如果正则表达式编译自二进制序列而不是字符串,re模块中的正则表达式函数也能处理二进制序列.
二进制序列有一个方法是str没有的,名为fromhex,作用是解析十六进制数字对,构建二进制序列.

结构体和内存视图

struct模块提供了一些函数,把打包的字节序列转换成不同类型字段组成的元组,还有一些函数用于执行反向转换,struct模块能处理bytes,bytearray和memoryview对象
memoryview类不是用于创建和存储字节序列的,而是共享内存.
python自带了超过100中编解码器.
如果加载的.py模块中包含UTF-8之外的数据,而且没有声明编码,会得到SyntaxError:Non-UTF-8 codestarting 的错误
BOM: 字节序标记
wrapper: 包装器

os函数中的字符串和字节序列

os模块提供了特殊的编码和解码函数
fsencode(filename): 如果filename是str类型,使用sys.getfilesystemencoding()返回的编解码器把filename编码成字节序列,
fsdecode(filename): 如果filename是bytes类型,使用 sys.getfilesystemencoding()把filename解码成字符串.

第五章 一等函数

高阶函数: map filter reduce和apply ,其中apply函数在Python2.3中已标记为过时 ,map和filter为python3的内置函数,reduce放到了functools模块中.
all和any也都是内置的函数. all(iterable):如果iterable的每个元素都是真值,就返回True,all([])返回True
any(iterable):只要iterable中有元素是真值,就返回True.
lambda关键字在python表达式内创建匿名函数.
python简单的句法现在了lamdba函数的定义体只能使用纯表达式.也就是lambda的定义体中不能赋值
判断对象能否调用,可以使用内置的callable( ) 函数进行判断
python的7种可调用对象:
1 用户定义的函数 : 使用def语句或lambda表达式创建
2 内置函数 使用C(cpython) 实现的函数
3 内置方法 使用C语言实现的方法
4 方法: 在类的定义体中定义的函数
5. 类
6 类的实例 如果类定义了__call__方法,那么它的实例可以作为函数调用
7 生成器函数 使用yield关键字的函数或方法.调用生成器函数返回的是生成器对象.
不仅python函数是真正的对象,任何python对象都可以表现的像函数.为此,只需实现实例方法__call__
使用dir函数可以探知factorial具有哪些属性
仅限关键字参数: 仅限关键字参数是python3新增的特性.定义函数时若想指定仅限关键字参数,要把它们放到前面有的参数后面.如果不想支持数量不定的定位参数,但是想支持仅限关键字参数,在签名中放一个.
def f(a,*,b):
return a,b
f(1,b=2) ==> 1,2

namedtuple

Tuple还有一个兄弟,叫namedtuple。虽然都是tuple,但是功能更为强大。对于namedtuple,你不必再通过索引值进行访问,你可以把它看做一个字典通过名字进行访问,只不过其中的值是不能改变的。

为了构造一个namedtuple需要两个参数,分别是tuple的名字和其中域的名字。比如在例子中,tuple的名字是“Animal”,它包括三个域,分别是“name”、“age”和“type”。Animal = namedtuple(‘Anima’,‘name age type’)
Namedtuple还有一个非常好的一点是,它与tuple是完全兼容的。也就是说,我们依然可以用索引去访问一个namedtuple。
from collections import namedtuple
Animal = namedtuple(‘Animal’,‘name age type’)
perry = Animal(name=‘perry’,age = 31,type=‘cat’)

支持函数式编程的包

operator模块: reduce(): 求积数
operator模块还有一类函数: itemgetter的用途: 根据元组的某个字段给元组列表排序.

使用一等函数实现设计模式

python内置函数 globals() 函数: 返回一个字典,表示当前的全局符号表.这个符号表始终针对当前模块.

函数装饰器和闭包

闭包除了在装饰器中有用之外,闭包还是回调式异步编程和函数式编程风格的基础.
装饰器是可调用的对象,其参数是另一个函数(被装饰的函数).装饰器可能会处理被装饰的函数,然后把他返回,或将其替换成另一个函数或可调用对象
装饰器的一大特性是,能把被装饰的函数替换成其他函数.第二特性是,装饰器在加载模块时立即执行.
闭包是一种函数,它会保留定义函数时存在的自由变量的绑定,这样调用函数时,虽然定义作用域不可用了,但是仍能使用那些绑定.

标准库中的装饰器

python内置了三个用于装饰方法的函数: property classmethod和staticmethod.
另一种常见的装饰器是: functools.wraps: 它的作用是协助构建行为良好的装饰器.

functolls.lru_cache

functools.lru_cache是非常实用的装饰器,它实现了备忘功能.这是一项优化技术,它把耗时的函数的结果保存起来,避免传入相同的参数时重复计算.
functools.lru_cache(maxsize=128,typed=False) lru_cache可以用于两个可选配置.maxsize参数指定存储多少个调用的结果.typed参数如果设为True,把不同参数类型得到的结果分开保存.

单发派泛函数

使用@singleddispath装饰的普通函数会编程泛函数,根据第一个参数的类型,以不同方式执行相同操作的一组函数.
singleddispath 机制的一个显著特征是,你可以在系统的任何地方和任何模块中注册专门函数.

第九章 符合python风格的对象

bytes( ) 函数调用它获取对象的直接序列表现形式.而__format__方法会被内置的format()函数和str.format()方法调用,使用特殊的格式代码显示对象的字符串表示形式.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐