函数是python中最主要也是最重要的代码组织和复用手段。作为最重要的原则,如果你要重复使用相同或非常相似的代码,就需要写一个函数。通过给函数起一个名字,还可以提高代码的可读性。
创建函数
函数使用def关键字声明,用return关键字返回值:
函数可以同时拥有多条return,如果到达函数末尾时没有遇到任何一个return语句,则返回None。 函数可以有一些位置参数(positional)和一些关键字参数(keyword)。关键字参数通常用于指定默认值或可选参数。在上面的函数中,x和y是位置参数,而z则是关键字参数。也就是说,该函数可以用这两种方式进行调用:
在函数中使用全局变量
匿名函数 lambda
Python支持一种被称为匿名的、或lambda函数。它仅由单条语句组成,该语句的结果就是返回值。它是通过lambda关键字定义的,这个关键字没有别的含义,仅仅是说“我们正在声明的是一个匿名函数”。
假设有一组字符串,你想要根据各字符串不同字母的数量对其进行排序:
柯里化:部分参数应用
柯里化(currying)是一个有趣的计算机科学术语,它指的是通过“部分参数应用”(partial argument application)从现有函数派生出新函数的技术。例如,假设我们有一个执行两数相加的简单函数:
通过这个函数,我们可以派生出一个新的只有一个参数的函数——add_five,它用于对其参数加5:
add_numbers的第二个参数称为“柯里化的”(curried)。这里没什么特别花哨的东西,因为我们其实就只是定义了一个可以调用现有函数的新函数而已。内置的functools模块可以用partial函数将此过程简化:
生成器
能以一种一致的方式对序列进行迭代(比如列表中的对象或文件中的行)是Python的一个重要特点。这是通过一种叫做迭代器协议(iterator protocol,它是一种使对象可迭代的通用方式)的方式实现的,一个原生的使对象可迭代的方法。比如说,对字典进行迭代可以得到其所有的键:
当你编写for key in some_dict时,Python解释器首先会尝试从some_dict创建一个迭代器:
迭代器是一种特殊对象,它可以在诸如for循环之类的上下文中向Python解释器输送对象。大部分能接受列表之类的对象的方法也都可以接受任何可迭代对象。比如min、max、sum等内置方法以及list、tuple等类型构造器:
生成器(generator)是构造新的可迭代对象的一种简单方式。一般的函数执行之后只会返回单个值,而生成器则是以延迟的方式返回一个值序列,即每返回一个值之后暂停,直到下一个值被请求时再继续。要创建一个生成器,只需将函数中的return替换为yeild即可:
调用该生成器时,没有任何代码会被立即执行:
直到你从该生成器中请求元素时,它才会开始执行其代码:
生成器表达式
另一种更简洁的构造生成器的方法是使用生成器表达式(generator expression)。这是一种类似于列表、字典、集合推导式的生成器。其创建方式为,把列表推导式两端的方括号改成圆括号: