热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python第五章课后答案加注释_《fluentpython》第五章一等函数

一等对象编程语言理论家把“一等对象”定义为满足下述条件的程序实体:在运行是创建能赋值给变量或数据结构中的元素能作为参数传给函数-能作为函数的返回结果把函数当作对象函数

一等对象

编程语言理论家把“一等对象”定义为满足下述条件的程序实体:在运行是创建

能赋值给变量或数据结构中的元素

能作为参数传给函数 - 能作为函数的返回结果

把函数当作对象

函数都是function类的实例,类的方法是method类的实例(虽然经常会把方法称为函数)

def fun():

pass

class Foo:

def bar(self):

pass

print(type(fun))

>>>

print(type(Foo().bar))

>>>

高阶函数

接受函数为参数或者把函数作为结果返回的函数称为高阶函数。

在函数式编程范式中,最为人熟知的高阶函数有map(), filter(), reduce()

all()和any()

all(iterable), 如果iterable的每个值都为True,返回True any(iterable), 如果iterable存在一个值为True,返回True

匿名函数

使用lambda关键字创建匿名函数,格式为lambda [arg1 [,arg2,.....argn]]:expression,匿名函数的定义体中不能赋值,不能使用while和try语句。

我十分不喜欢用匿名函数,基本没有用过,即使是用高阶函数需要传递函数作为参数时,也是额外用def语句编写函数,所以一直对lambda理解不到位。

匿名函数这样理解:将arg x作为参数传递给expression,得到结果后返回。

Lundh提出的lambda表达式重构秘笈: - (1)编写注释,说明lambda表达式的作用 - (2)研究注释,用一个名称来概括注释 - (3)把lambda表达式改写成def,使用那个名称作为函数名 - (4)删除注释

可调用对象

使用callable()函数可判断是否为可调用对象。python中有7种可调用对象: - 用户使用def和lambda创建的函数 - 内置函数,使用C语言(CPython)实现的函数,如len或time.strftime - 使用C语言实现的方法,如dict.get - 方法,在类的定义体中定义的函数 - 类,调用类时会运行__new__方法创建一个实例,python没有new运算符,所以调用类相当于调用函数 - 定义了__call__()类的实例 - 生成器函数,使用yield关键字的函数或方法

L = [abs, str, 13]

print([callable(x) for x in L])

>>>[True, True, False]

函数内省

函数内省(function introspection)是在运行时进行的一种对象检测机制,用来查看某个对象内部信息,如类的type类型、属性、方法、事件等等。

(内省: 文言,意思是查看内部情况。华夏特色的翻译,恕我直言,把第一个叫这个名字的人拉出去斩了)

python中使用dir()可以获得对象的各种信息。

def fun():

pass

print(dir(fun))

>>>['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

获取关于参数的信息

以我目前水平不能理解作者讲的这些内容有什么作用

函数注解

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

return ''

函数声明中的各个参数可以在:之后增加注解表达式。如果参数有默认值,注解放在参数名和=号之间。如果想注解返回值,在)和函数声明末尾的:之间添加->和一个表达式。这个表达式可以是任何类型,在上面的例子中是str

注解不会做任何处理,只是存储在函数的__annotations__属性(一个字典)中

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

return ''

print(clip.__annotations__)

>>>{'text': , 'max_len': 'int > 0', 'return': }

支持函数式编程的包

from functools import reduce, mul

def fact1(n):

return reduce(lambda a, b: a*b, range(1, n+1))

def fact2(n):

return reduce(mul, range(1, n+1))

operator模块为多个算术运算符提供了对应的函数,从而避免编写lambda a, b: a*b这种平凡的匿名函数

itemgetter和attrgetter

operator模块中还有一类函数,能替代从序列中取出元素或读取对象属性的lambda表达式,如itemgetter和attrgetter

# 将students表按第二个属性升序排列

from operator import itemgetter

students = [

('xiao ming', 77, 180),

('lao wang', 75, 185),

('xiao qing', 100, 183),

]

res = sorted(students, key=itemgetter(1))

print(res)

attrgetter类似

methodcaller

methodcaller创建的函数会在对象上调用参数指定的方法

from operator import methodcaller

s = 'I am a pupil'

f = methodcaller('replace', ' ', '-')

print(f(s))

>>>I-am-a-pupil

functools.partial

from operator import mul

from functools import partial

f = partial(mul, 3)

print(f(7))

>>>21

固定第一个参数为3, 传入7则结果为21



推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
author-avatar
切尔小妹_288
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有