流畅的Python (节选)

0 前言

  • 节选学习部分有用的内容

  • Fluent Python

2 序列构成的数组

  • Python 会忽略代码里 []、{} 和 () 中的换行,因此如果你的代码里有多行的列表、列表推导、生成器表达式、字典这一类的,可以省略不太好看的续行符 \。

  • 元组其实是对数据的记录:元组中的每个元素都存放了记录中一个字段的数据,外加这个字段的位置。正是这个位置信息给数据赋予了意义。

  • 笛卡儿积列表的长度等于输入变量的长度的乘积。

  • 把一个可迭代对象里的元素,一并赋值到由对应的变量组成的元组中。元组拆包(unpacking)

    python 复制代码
    b, a = a, b  # 不使用中间变量交换两个变量的值
    # 还可以用 * 运算符把一个可迭代对象拆开作为函数的参数
    t = (20, 8)
    divmod(*t)
  • 用*来处理剩下的元素,平行赋值

    python 复制代码
    >>> a, *body, c, d = range(5)
    >>> a, body, c, d
    (0, [1, 2], 3, 4)
  • 具名元组

    collections.namedtuple 是一个工厂函数,它可以用来构建一个带字段名的元组和一个有名字的类

    bash 复制代码
    >> from collections import namedtuple
    >>> City = namedtuple('City', 'name country population coordinates') 
    >>> tokyo = City('Tokyo', 'JP', 36.933, (35.689722, 139.691667)) 
    >>> tokyo
    City(name='Tokyo', country='JP', population=36.933, coordinates=(35.689722,
    139.691667))
  • 多维切片和省略

    二维的 numpy.ndarray 就可以用 a[i,j] 这种形式来获取,抑或是用 a[m:n, k:l] 的方式来得到二维切片。

    省略(ellipsis)的正确书写方法是三个英语句号(...),如果 x 是四维数组,那么 x[i, ...] 就是 x[i, :, :, :] 的缩写。

  • 对序列使用+和* ,不修改原有的操作对象,而是构建一个全新的序列。

    python 复制代码
    # 一个包含 3 个列表的列表,嵌套的 3 个列表各自有 3 个元素
    board = [['_'] * 3 for i in range(3)]
  • list.sort 方法会就地排序列表

  • 如果一个函数或者方法对对象进行的是就地改动,那它就应该返回 None,好让调用者知道传入的参数发生了变动,而且并未产生新的对象。

  • 内置函数 sorted,它会新建一个列表作为返回值。甚至可以操作不可变序列或生成器。

  • Python 的排序算法------Timsort------是稳定的,意思是就算两个元素比不出大小,在每次排序的结果里它们的相对位置是固定的(跟在原来的列表里一样)。

  • 频繁对序列做先进先出的操作,deque(双端队列)。

5 一等函数

  • 在 Python 中,函数是一等对象,即一等函数

    • 在运行时创建
    • 能赋值给变量或数据结构中的元素
    • 能作为参数传给函数
    • 能作为函数的返回结果
  • map 函数返回一个可迭代对象,里面的元素是把第一个参数

    (一个函数)应用到第二个参数(一个可迭代对象,这里是

    range(11))中各个元素上得到的结果。

  • 接受函数为参数,或者把函数作为结果返回的函数是高阶函数(higher-order function)。

  • 内置函数 sorted 也是:可选的 key 参数用于提供一个函数,它会应用到各个元素上进行排序。

  • 列表推导或生成器表达式具有 map 和 filter 两个函数的功能。

  • lambda 关键字在 Python 表达式内创建匿名函数。在参数列表中最适合使用匿名函数。

  • 函数注解,注解不会做任何处理。

    def clip(text:str, max_len:'int > 0'=80) -> str:

    函数声明中的各个参数可以在 : 之后增加注解表达式。如果参数有默认值,注解放在参数名和 = 号之间。如果想注解返回值,在 ) 和函数声明末尾的 : 之间添加 -> 和一个表达式。那个表达式可以是任何类型。注解中最常用的类型是类(如 str 或 int)和字符串(如 'int >0')。

  • functools.partial 这个高阶函数用于部分应用一个函数。部分应用是指,基于一个函数创建一个新的可调用对象,把原函数的某些参数固定。

7 函数装饰器和闭包

  • 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。
  • 装饰器的一大特性是,能把被装饰的函数替换成其他函数。第二个特性是,装饰器在加载模块时(导入时)立即执行。
  • Python 编译函数的定义体时,它判断 b 是局部变量,因为在
    函数中给它赋值了。赋值隐式创建局部变量。
  • 闭包和自由变量
  • 如果为 nonlocal 声明的变量赋予新值,闭包中保存的绑定会更
    新。
  • 装饰器的典型行为:把被装饰的函数替换成新函数,二者接受相同的参数,而且(通常)返回被装饰的函数本该返回的值,同时还会做些额外操作。
  • 使用functools.lru_cache做备忘
  • 把 @d1 和 @d2 两个装饰器按顺序应用到 f 函数上,作用相当于 f =d1(d2(f))。 叠放装饰器
  • 装饰器工厂函数
相关推荐
Chef_Chen9 分钟前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
百事老饼干13 分钟前
Java[面试题]-真实面试
java·开发语言·面试
千澜空28 分钟前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
斯凯利.瑞恩35 分钟前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
杨荧1 小时前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
白子寰1 小时前
【C++打怪之路Lv14】- “多态“篇
开发语言·c++
yannan201903131 小时前
【算法】(Python)动态规划
python·算法·动态规划
蒙娜丽宁1 小时前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev1 小时前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
王俊山IT1 小时前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习