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

‘‘‘
时间: 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. 编写函数的通用设计规则是什么?

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

时间: 2024-10-12 10:42:19

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

第十九章 函数的高级话题

''' void Fun0(CRITICAL_SECTION* p) { LeaveCriticalSection(p); } auto Fun1 = [](CRITICAL_SECTION* p){LeaveCriticalSection(p);}; CRITICAL_SECTION Cs; shared_ptr<CRITICAL_SECTION> pShareCs(&Cs, [](CRITICAL_SECTION* p){LeaveCriticalSection(p);}); un

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

首先来看一个json文件的读取.书中给出了一个json样例.该json文件有700多K,数据量充足,适合本章的例子.文件的具体内容可以在http://www.oreilly.com/pub/sc/osconfeed上查看.首先先下载数据生成json文件. def load():     url='http://www.oreilly.com/pub/sc/osconfeed'     JSON="osconfeed.json"     if not os.path.exists(JSO

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

''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点笔记”“本章习题” - 标题1,二级标题用- 标题2,笔记大纲标题.习题题目- 加粗,16px ''' 重点笔记 摘要 while语句,提供了编写通用循环的一种方法 for语句,用它来遍历序列对象内的元素,并对每个元素运行一个代码块 一. While 循环While循环是Python语言中最通用的迭

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

''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容(每天看42页内容,可以保证月底看完此书) ''' 摘要 Python程序可以分解成模块.语句.表达式和对象: 程序由模块构成: 模块包含语句: 语句包含表达式: 表达式建立并处理对象. 一. 为什么使用内置类型  #了解即可 内置对象使程序更容易编写 内置对象是扩展的组件 内置对象往往比定制的数据结构更高效 内置对象是语言的标准的一部分 二. Py

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

''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书)“重点笔记”“本章习题” - 标题1,二级标题用- 标题2,笔记大纲标题.习题题目- 加粗,16px ''' 重点笔记 : 摘要 动态类型是Python语言灵活性的根源(尤其是其提供的多态性) 一. 缺少类型声明语句的情况 在Python中,类型是在运行过程中自动决定的,而不是通过代码声明. 二. 变量.对

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

''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点笔记”“本章习题” - 标题1,二级标题用- 标题2,笔记大纲标题.习题题目- 加粗,16px ''' 重点笔记 一.赋值语句 通过赋值语句,吧对象赋给一个名词,特性如下: 赋值语句建立对象引用值 变量名在首次赋值时会被创建 变量名在引用前必须先赋值 执行隐式赋值的一些操作 二. Python3.0

流畅python学习笔记:第十四章:迭代器和生成器

迭代器和生成器是python中的重要特性,本章作者花了很大的篇幅来介绍迭代器和生成器的用法. 首先来看一个单词序列的例子: import re re_word=re.compile(r'\w+') class Sentence(object):     def __init__(self,text):         self.text=text         self.word=re_word.findall(text)     def __getitem__(self, item):   

《Python 学习手册4th》 第十六章 函数基础

''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点笔记”“本章习题” - 标题1,二级标题用- 标题2,笔记大纲标题.习题题目- 加粗,16px ''' 重点笔记 摘要 函数是Python为了代码最大程度的重用和最小化代码冗余而提供的最基本的程序结构.一. 为何使用函数 最大化的代码重用和最小化代码冗余 流程的分解 本章习题: 1. 编写函数有什么

《Python 学习手册4th》 第十二章 if

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