近期在读“流畅的Python”这本书,想把自己的读书笔记分享给大家,希望能帮到也对这本书感兴趣但是没时间看的各位。(文章中大部分的话和图片摘录总结自“流畅的Python”一书,以及python官方网站)
章节概述:Python中函数是一等对象,本章从函数为什么是一等对象的角度来介绍Python函数。
章节结构:
什么是一等对象
为什么函数是一等对象
函数式编程风格,高阶函数
使用高阶函数时,一次性的小型函数,匿名函数
可调用对象
具体内容:
什么是一等对象
一等对象是满足下述条件的程序实体:在运行时创建,能赋值给变量或者数据结构中的元素,能作为参数传给函数,能作为函数的返回结果。
函数是对象
我们可以在控制台中def function_example(n): 创建一个函数,所以函数满足运行时创建。
我们查看type(function_name),返回,说明function_example是function类的实例
我们也可以将function_example这个对象赋值给一个变量,比如variable_example = function_example
函数式编程风格,高阶函数
接收函数为参数,或者把函数作为结果返回的函数就是高阶函数(higher-order function)。比如map,filter,reduce,apply,sorted
例:sorted(list_example, key=len)
几个高阶函数的说明:
sun和reduce的通用思想是把某个操作连续应用到序列的元素上,累计之前的结果,把序列值归约成一个值。
all和any是内置的归约函数
map和filter返回生成器,因此他们的替代品是生成器表达式
使用高阶函数时,一次性的小型函数,匿名函数
匿名函数,lambda。匿名函数的定义体只能使用纯表达式,lambda定义体中不能赋值,也不能使用while,try等等
例:sorted(list_example,key=lambda word:word[::-1])
可调用对象
如何判断一个对象是否可调用,可以用内置的callable()函数判断。
可调用对象:
用户定义的函数:def/lambda
内置函数:len等
内置方法:dict.get等
方法:在类的定义体中定义的函数
类:调用类会先运行__new__创建一个实例,然后运行__init__初始化实例,然后把实例返回给调用方
类的实例:如果定义了__call__
生成器函数:使用yield关键字的函数或方法
如何把类的实例变成可调用的对象?实现call方法
函数内省:函数的属性
Python的参数处理机制
位置参数:位置参数是按位置顺序传参的。
关键字参数:函数定义时,如果有参数,则所有的形参名都是一个关键字,如果想通过关键字的方式传参,可以使用关键字=值得方式传参。
默认参数:在函数定义时就给参数传入了一个默认的参数值,如果函数调用时没有给这个参数传值,就使用默认值, 如果显式的传参了,就使用新传入的值代替默认值。
仅限关键字参数(Keyword-only argument):仅限关键字参数就是只能传入关键字参数,不能通过其他方式传参。仅限关键字参数不可缺省(除非有默认值),且只能强制性通过关键字传参。
可变参数:可变参数是一个形参可以接受多个实参,可变参数的传入数是不决定的,通常由函数调用方决定。
可变关键字参数:可变关键字参数 用 双星号+参数名表示, 可变关键字参数接收零个或多个关键字参数,并以字典的形式传入函数体,关键字为此字典的key,关键字绑定的值为value。如果可变关键字没有接收到任何参数, 则传入函数体一个空字典{}。~~~~
获取参数信息:函数__default__属性,这个元组中保存着定位参数和关键字参数的默认值,仅限关键字参数的默认值在__kwdefaults__里。
支持函数式编程的包
operator模块:位多个算术运算符提供了对应的函数
functools模块:提供了一系列高阶函数,比如reduce