python3-cookbook中每个小节以问题、解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构、函数、类等特性在某类问题上如何更好地使用。这本书对于加深Python3的理解和提升Python编程能力的都有显著帮助,特别是对怎么提高Python程序的性能会有很好的帮助,如果有时间的话强烈建议看一下。
本文为学习笔记,文中的内容只是根据自己的工作需要和平时使用写了书中的部分内容,并且文中的示例代码大多直接贴的原文代码,当然,代码多数都在Python3.6的环境上都验证过了的。不同领域的编程关注点也会有所不同,有兴趣的可以去看全文。
python3-cookbook:https://python3-cookbook.readthedocs.io/zh_CN/latest/index.html

7.2 只接受关键字参数的函数

有时候为了代码可读性或者其他原因,我们需要在使用函数的时候强制要求调用者使用关键字参数,这时候只需要在某个*参数或单个*后面定义关键字参数即可。

def print_ax(a, x):
print(a, x) def print_x(a, *, x):
print(a, x) print_ax(111, 222)
# 如果这样写就会报错:print_x(111, 222)
print_x(111, x=222)

7.7 匿名函数捕获变量值

lambda表达式的参数值是在运行时绑定的,而不是定义时绑定的,这跟def定义参数默认值是不同的,如果需要lambda表达式在定义时就绑定值,可以使用参数默认值的写法。

>>> x = 10
>>> a = lambda y: x + y
>>> x = 20
>>> b = lambda y: x + y
>>> # 下面两个执行结果是一样的
>>> a(10)
30
>>> b(10)
30
>>> x = 30
>>> a(10)
40
>>> b(10)
40
>>> # 使用参数默认值的方式
>>> a = lambda y, x=x: x + y
>>> b = lambda y, x=x: x + y
>>> a(10)
40
>>> b(10)
40
>>>

7.8 减少可调用对象的参数个数

当调用某个函数的时候可能你并不需要传入全部参数值,或者只能传入部分参数值,就可以使用functools.partial()。

用法示例:

>>> from functools import partial
>>> def spam(a, b, c, d):
print(a, b, c, d) >>> s1 = partial(spam, 1) # a = 1
>>> s1(2, 3, 4)
1 2 3 4
>>> s2 = partial(spam, d=42) # d = 42
>>> s2(1, 2, 3)
1 2 3 42
>>> s3 = partial(spam, 1, 2, d=42) # a = 1, b = 2, d = 42
>>> s3(3)
1 2 3 42
>>>

排序使用示例:

"""将列表中的点根据距离基点的距离进行排序"""
import math
from functools import partial # 基点
pt = (4, 3)
points = [(1, 2), (3, 4), (5, 6), (7, 8)] def distance(p1, p2):
"""返回两个点之间的距离"""
x1, y1 = p1
x2, y2 = p2
return math.hypot(x2 - x1, y2 - y1) points.sort(key=partial(distance, pt))
print(points) # [(3, 4), (1, 2), (5, 6), (7, 8)]

回调函数使用示例:

import logging
from multiprocessing import Pool
from functools import partial def output_result(result, log=None):
if log is not None:
log.debug('Got: %r', result) def add(x, y):
return x + y if __name__ == '__main__':
# logging模块用于打印日志
logging.basicConfig(level=logging.DEBUG)
log = logging.getLogger('test') # 异步调用另一个函数,并将log对象传入进去
p = Pool()
p.apply_async(add, (3, 4), callback=partial(output_result, log=log))
p.close()
p.join()

python3-cookbook笔记:第七章 函数的更多相关文章

  1. JAVASCRIPT高程笔记-------第 七章 函数表达式

    7.1递归 经典递归例子 function factorial(num){ if(num <= 1){ return 1; }else{ return num * factorial(num - ...

  2. Android群英传笔记——第七章:Android动画机制和使用技巧

    Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最 近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中 ...

  3. JVM学习笔记-第七章-虚拟机类加载机制

    JVM学习笔记-第七章-虚拟机类加载机制 7.1 概述 Java虚拟机描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被 ...

  4. [Python学习笔记][第七章Python文件操作]

    2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...

  5. Getting Started With Hazelcast 读书笔记(第七章)

    第七章 部署策略 Hazelcast具有适应性,能根据不同的架构和应用进行特定的部署配置,每个应用可以根据具体情况选择最优的配置: 数据与应用紧密结合的模式(重点,of就是这种) 胖客户端模式(最好用 ...

  6. o'Reill的SVG精髓(第二版)学习笔记——第七章

    第七章:路径 所有描述轮廓的数据都放在<path>元素的d属性中(d是data的缩写).路径数据包括单个字符的命令,比如M表示moveto,L表示lineto.接着是该命令的坐标信息. 7 ...

  7. 《图解HTTP》阅读笔记--第七章---确保WEB安全的HTTPS

    第七章.确保WEB安全的HTTPSHTTP的缺点:通信使用明文(不加密),内容可能会被窃听 解决---加密处理: //将通信加密 :通过SSL(安全套接层)---HTTPS(超文本传输安全协议)--- ...

  8. C++ primer plus读书笔记——第8章 函数探幽

    第8章 函数探幽 1. 对于内联函数,编译器将使用相应的函数代码替换函数调用,程序无需跳到一个位置执行代码,再调回来.因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存. 2. 要使用内 ...

  9. C++ primer plus读书笔记——第7章 函数——C++的编程模块

    第7章 函数--C++的编程模块 1. 函数的返回类型不能是数组,但可以是其他任何一种类型,甚至可以是结构和对象.有趣的是,C++函数不能直接返回数组,但可以将数组作为结构或对象的组成部分来返回. 2 ...

随机推荐

  1. JS实现 JSON扁平数据转换树状数据

    后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name: '', level: 0}, {id:2 , parentId: 0, name: '', level: 0}, ...

  2. 基于Flask框架搭建视频网站的学习日志(一)

    ------------恢复内容开始------------ 基于Flask框架搭建视频网站的学习日志(一)2020/02/01 一.Flask环境搭建 创建虚拟环境 初次搭建虚拟环境 搭建完虚拟环境 ...

  3. android开发实战-记账本APP(一)

    记账本开发流程: 对于一个记账本的初步开发而言,我实现的功能有: ①实现一个记账本的页面 ②可以添加数据并更新到页面中 ③可以将数据信息以图表的形式展现 (一)首先,制作一个记账本的页面. ①在系统自 ...

  4. tcpdump用法说明

    tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上. 不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才会停止抓包. 例如: ...

  5. ios--->self.view.window在逻辑判断中的作用

    - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that ...

  6. 曹工说Spring Boot源码(14)-- AspectJ的Load-Time-Weaving的两种实现方式细细讲解,以及怎么和Spring Instrumentation集成

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  7. The .native modifier for v-on is only valid on components but it was used on <input>

    原因 基础不牢固就是这样了,事件的native修饰符只能在组件上使用,原生的html标签是不能使用的,这是因为我在input标签使用了native修饰符.

  8. Linux后门的几种姿势

    转载自 https://evilanne.github.io/2017/08/26/Linux%E5%90%8E%E9%97%A8-%E6%8C%81%E7%BB%AD%E5%85%B3%E6%B3% ...

  9. 《快乐编程大本营》java语言训练班 2课:java的变量

    <快乐编程大本营>java语言训练班 2课:java的变量 1变量介绍 2变量分类,数值变量 3变量分类-字符串变量 4变量分类-布尔变量 5变量分类-对象 http://code6g.c ...

  10. Codeforces_456_A

    http://codeforces.com/problemset/problem/456/A 按价格排序,比较质量. #include<cstdio> #include<algori ...