'''
时间: 9月5日 - 9月30日
要求:
1. 书本内容总结归纳,整理在博客园笔记上传
2. 完成所有课后习题
注:“#” 后加的是备注内容
(每天看42页内容,可以保证月底看完此书)
“重点笔记”“本章习题” - 标题1,二级标题用- 标题2,笔记大纲标题、习题题目- 加粗,16px
'''

重点笔记

一. 函数设计概念

  • 耦合性: 对于输入使用参数并且对于输出使用return语句  1
  • 耦合性: 只有在真正必要的情况下使用全局变量
  • 耦合性: 不要改变可变类型的参数,除非调用者希望这样做
  • 聚合性: 每一个函数都应该有一个单一的、统一的目标
  • 大小:    每一个函数应该相对较小
  • 耦合:    避免直接改变在另一个模块文件中的变量

(注:耦合性 也叫块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。)

二. 递归函数

  递归可以要求遍历任意形状的结构。

  

def sumtree(L):
total = 0
for x in L:
if not isinstance(x,list):
total += x
else:
total += sumtree(x)
return total
L = [1,[1,[2,3],4],5]
print(sumtree(L))

注:

isinstance(object, classinfo)
如果参数object是classinfo的实例,或者object是classinfo类的子类的一个实例, 返回True。如果object不是一个给定类型的的对象, 则返回结果总是False。

三. 匿名函数:lambda

  lambda表达式创建了一个之后能够调用的函数,但是它返回了一个函数而不是将这个函数赋值给了一个变量名。

  • lambda 是一个表达式,而不是一个语句
  • lambda 的主体是一个单个的表达式,而不是一个代码块

  除了这些,def和lambda都能够做同样种类的工作。

四. 为什么使用lambda

  lambda起到了函数速写的作用,允许在使用的代码内嵌入一个函数的定义。

五. 在序列中映射函数: map

  map函数会对一个序列对象中的每一个元素应用被传入的函数,并且返回一个包含了所有函数调用结果的一个列表。

  

>>> l = [1,2,3]
>>> def add(x): return x + 10 >>> list(map(add,l))
[11, 12, 13]

  由于map期待传入一个函数,它恰好是lambda通常出现的地方之一:

>>> list(map(lambda x : x+10,l))
[11, 12, 13]
>>> list(map(pow,[1,2,3],[1,2,3]))
[1, 4, 27]

六. 函数式编程工具: filter 和reduce

  map函数是用来进行函数式编程的这类工具中最简单的内置函数代表: 函数式编程的意思就是对序列应用一些函数的工具。

>>> list(filter((lambda x :x > 0), range(-5,5)))#return great more zero
[1, 2, 3, 4]

  reduce

>>> from functools import reduce
>>> reduce((lambda x,y : x+y),[1,2,3,4,5])
15

  此外,内置的reduce还允许一个可选的第三个参数置于序列的各项之前,从而当序列为空时充当一个默认的结果。

>>> import operator,functools
>>> functools.reduce(operator.add,[2,12,5])
19

本章习题:

1. lambda表达式和def语句有什么关系?

答:lambda和def都会创建函数对象,以便稍后调用。但是,lambda是表达式,可以嵌入函数定义的def语法上无法出现的地方。

  lambda的使用,总是可以用def来替代,并且通过变量名来引用函数。

  语法上来看,lambda只允许单个返回值表达式,因为它不支持代码块,不适用于较大的函数。

2. 使用lambda的要点是什么?

答:lambda允许“内联”小单元可执行代码,推迟其执行,并且以默认参数和封闭作用域变量的形式为其提供状态。lambda不是必须的,总是可以被def替代。它通常出现在GUI这样的基于回调的程序中,并且它们与map和filter这些期待一个处理函数的函数工具密切相关。

3. 比较和对比map、filter和reduce

答:map把每一项传递给函数并收集结果

  filter收集那些函数返回一个True值的项

  reduce 通过对一个累加器和后续项应用函数来计算一个单个的值。

4. 什么是函数注解,如何使用它们?

答:Python为声明注解提供了特殊的语法,但是,它本身不做任何事情,注解完全是可选的,并且出现的时候只是直接附加到函数对象__annotations__属性以供其他用户使用。

5. 什么是递归函数,如何使用它们?

答:递归函数调用本身可以直接地或间接地进行,从而实现循环。它们可以用来遍历任意形状的结构,但是,也可以用来进行一般性迭代。

6. 编写函数的通用设计规则是什么?

答:函数通常应该较小,尽可能自包含,拥有单一的,统一的用途,并且与输入参数和返回值等其他部分通信。

《Python 学习手册4th》 第十九章 函数的高级话题的更多相关文章

  1. 《Python 学习手册4th》 第十七章 作用域

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...

  2. 《Python 学习手册4th》 第十三章 while和for循环

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...

  3. 《Python 学习手册4th》 第七章 字符串

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...

  4. 《Python 学习手册4th》 第六章 动态类型简介

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书)“重点笔 ...

  5. 《Python 学习手册4th》 第四章 介绍Python对象类型

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容(每天看42页内容,可以保证月底看完此书) ''' ...

  6. 流畅python学习笔记:第十九章:动态属性和特性

    首先来看一个json文件的读取.书中给出了一个json样例.该json文件有700多K,数据量充足,适合本章的例子.文件的具体内容可以在http://www.oreilly.com/pub/sc/os ...

  7. 《Python 学习手册4th》 第十一章 赋值、表达式和打印

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...

  8. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十九章:法线贴图

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十九章:法线贴图 学习目标 理解为什么需要法线贴图: 学习法线贴图如 ...

  9. Python之路【第十九章】:Django进阶

    Django路由规则 1.基于正则的URL 在templates目录下创建index.html.detail.html文件 <!DOCTYPE html> <html lang=&q ...

随机推荐

  1. QT中可以用QProgressBar或着QProgressDialog来实现进度条

    QProgressBar的使用 首先在designer中拖一个按钮和进度条部件,按下面初始化 //补充:下面两句写在MainWindow的构造函数里进行初始化 ui->progressBar-& ...

  2. Java应用发布后,需要关注的7个性能指标

    在某个重大发布之后,都需要记录相应的指标,本文介绍了最重要的几个 Java 性能指标,包括响应时间和平均负载等.为理解应用程序在生产环境中如何运行,就需要遵循一些 Java 性能指标. 在以前,当软件 ...

  3. MyBatis学习总结_02_使用MyBatis对表执行CRUD操作

    一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: 1 <?xml version="1.0&q ...

  4. centos 安装jdk

    不要使用yum 安装openjdk,他妈的就是一坑货 首先到官网下载jdk,http://www.oracle.com/technetwork/java/javase/downloads/jdk7-d ...

  5. flex 4 Filters

    <s:RectangularDropShadow id="dropShadow" blurX="10" blurY="10" alph ...

  6. linux kernel文件系统启动部分

    现在的kernel里,有个叫做ramfs的文件系统,会把initrd(或者ramdisk,为惯性叫法)里的东西挂载到early-rootfs里(即rootfs,是ramfs的一个特殊实例),执行一些在 ...

  7. 11.cadence.通孔类封装创建[原创]

    1.打开Pad Designer ---- ----- ---- ---- OK ------- ---- 回到Pad Designer internal:不管是几层板,中间层用这个就可以了: --- ...

  8. pythonhttp

    import urllib.requestimport http.cookiejar from urllib.error import URLError,HTTPError import urllib ...

  9. 【转】 xcode中常用快捷键图文并茂解释

    图文解释XCode常用快捷键的使用 分类: iOS开发经验技巧2012-06-07 10:21 12774人阅读 评论(6) 收藏 举报 xcodecommand工具eclipsedeletego 刚 ...

  10. Map和hash_map

    map和hash_map 今天在写拼流的程序时碰到一个问题,要根据流的四元组的结构信息映射到该流的数据.也就是我在网络数据包拼接的过程中,要根据包的地址和端口信息,对应到其对应的一个流的数据上去,把端 ...