流畅的Python第五章总结

本文介绍了Python中的函数对象,包括它们作为对象的特性,如__doc__属性和可调用性。讨论了高阶函数如map和sorted的使用,并展示了如何使用匿名函数lambda。还探讨了可调用对象的概念,包括用户定义的函数、内置函数、方法等。最后,提到了函数参数注解和函数式编程的支持包如operator。
摘要由CSDN通过智能技术生成

流畅的Python

第五章总结

  1. 函数对象

函数是一个对象。本身是一个function类的实例。

>>> def factorial(n):
	'''returns n!'''
	return 1 if n < 2 else n*factorial(n-1)

>>> factorial(42)
1405006117752879898543142606244511569936384000000000
>>> factorial.__doc__
'returns n!'
>>> type(factorial)
<class 'function'>

__doc__属性用于生成对象的帮助文本。
dir()可查看对象的所有属性

还可以将函数赋给变量,通过变量名调用。map()函数返回一个可迭代对象,里面的元素是把第一个参数(函数)应用到第二个参数(可迭代对象)的各个元素上得到的结果。

  1. 高阶函数

接受函数为参数,或者把函数作为结果返回的函数是高阶函数。map就是一个,sorted也是。

>>> fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana']     
>>> sorted(fruits, key = len)
['fig', 'apple', 'cherry', 'banana', 'raspberry', 'strawberry']

再比如:先将参数反向再比较。

>>> reverse('testing')	      
'gnitset'
>>> sorted(fruits, key = reverse)	    
['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']

all(iterable)和any(iterable)也是内置的归约函数,如果iterable每个元素都是真值,返回True,all([ ])返回True;对于any()只要iterable中有元素是真值,返回True,any([ ])返回false。

  1. 匿名函数

lambda函数的定义体只能用纯表达式,不能有赋值语句,也不能使用while,try等。匿名函数很少用到。

  1. 可调用对象

调用运算符,即()。使用callable()查看一个对象能否被调用。python中有七种可调用对象。

  • 用户定义的函数
  • 内置函数
  • 内置方法
  • 方法
  • 类的实例(如果类定义了__call__方法)
  • 生成器函数

事实上任何对象都可以被调用,只要定义了__call__函数。

class test:
    def __init__(self, items):
        self._len = len(items)
        self._first = items[0]

    def the_last(self):
        try:
            return self._first, self._len
        except Error:
            print('chucuo')

    def __call__(self):
        return self.the_last()

test1 = test(range(3))
a = test1()
print(a)
print(callable(test1))
(0, 3)
True

函数参数前面有 * 和 ** 表示参数可能有多个,* 将参数存储为元组, ** 将参数存储为字典。

>>> def f1(a, *b, **c):
	print(a)
	print(b)
	print(c)
>>> f1(1, 2,  3,  e = 4, d = 4, f = 5)      
1
(2, 3)
{'e': 4, 'd': 4, 'f': 5}
  1. 函数注解

Python3提供了一种句法,用于为函数声明中的参数和返回值附加元数据。

def clip(text:str, max_len:'int > 0'=80) -> str:
    end = None
    if len(text) >max_len:
        space_before = text.rfind(' ', 0, max_len)
        if space_before >=0:
            end = space_before
        else:
            space_after = text.rfind(' ', max_len)
            if space_after >=0:
                end = space_after
    if end is None:
        end = len(text)
    return text[:end].rstrip()

函数的各个参数可以在:之后增加注解表达式。如果参数有默认值,注解放在参数名和= 之间。如果想注解返回值,在)和函数声明末尾的:之间添加 ->和一个表达式,表达式可以为任何类型,字符串或类,注解不会做任何处理,只是存储在函数的__annotations__属性中。

print(clip.__annotations__)
{'text': <class 'str'>, 'max_len': 'int > 0', 'return': <class 'str'>}
  1. 支持函数式编程的包
  • operator模块
    使用匿名函数和reduce函数计算阶乘
from functools import reduce

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

operator模块为多个算术运算符提供了对应的函数。

from functools import reduce
from operator import mul

def fact(n):
    return reduce(mul, range(1, n+1))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值