函数是每个编程语言必备的代码组织方式,通过编写函数可以快速多次使用相同的代码段。函数可以接受一些参数,对其进行一些操作,可以返回需要的值。

命名空间、作用域和本地函数

每个Python程序运行的时候会创建一个命名空间,在这个空间内直接定义的变量都属于这个命名空间,这些变量被称为全局变量。每一个函数在被调用的时候,都会开辟一个专属于自己的命名空间,在这个命名空间里的变量被称作局部变量。
局部变量只能在它自己的命名空间里被使用,函数执行完成以后局部变量就会被销毁,所以在函数外不能调用函数内部变量,不过在函数内部,可以使用全局变量。
要注意的是,如果要给全局变量赋值,需要在函数内部使用global关键字进行声明。

返回多个值

和大多数其他编程语言不同,Python的函数可以有多个返回值,本质上是将这些返回值打包成元组,再通过元组拆包的方式获取这些值。

  1. def swap(a, b):
  2. return b, a

函数是对象

因为Python一切都是对象,函数自然也不例外。可以通过创建函数对象,便捷的调用函数,也可以将函数对象作为参数输入给别的函数。

  1. def function(x):
  2. pass
  3. a = function
  4. x = 1
  5. a(x) # 等同于fucntion(x)

*匿名(Lambda)函数

lambda表达式在不少编程语言中都有应用,用来创建简单的函数,这种函数一般不会很复杂,用的机会也不会很多。同样,lambda函数也可以创建为对象或者作为参数传给别的函数。

*柯里化:部分参数应用

表示通过提供某些参数默认值,从已有函数衍生出新的函数的方法。可以通过functools模块中的partial函数简化处理。

*生成器

对于序列来说,每次遍历的时候会生成迭代器对象,迭代器可以在循环等结构中向解释器生成对象的对象,也可以构造成其他序列对象。
生成器本质也是提供可遍历的对象,不过生成器的生成是惰性的,也就是说,生成器只会在每次遍历的时候,根据生成规则返回新的元素,而不是一次性返回完整的序列。

生成器表达式

与列表推导式相似,将中括号改成小括号,就变成了生成器表达式。

itertools模块

itertools模块包含了很多常用的生成器集合。

函数 描述
combinations(iterable, k) 根据iterable参数中的所有元素生成一个包含所有可能k元组的序列,忽略元素的顺序,也不进行替代
permutations(iterable, k) 根据iterable参数中的所有元素按顺序生成包含所有可能k元组的序列
groupby( iterable[, keyfunc]) 根据每一个独一的key生成元组
product(*iterable, repeat=1) 以元组的形式,根据输入的可遍历对象生成笛卡尔积,与嵌套的for循环类似

*错误和异常处理

Python程序执行失败的时候会抛出异常,并中断程序,但有时候需要通过抛出异常来对程序进行进一步的控制。通过try-except语句块可以捕获运行时产生的错误,如果发生了错误且被except捕获到,就会执行except里面的代码而不会直接终止程序。

IPython中的异常

IPython中会提供更多的错误信息,会进行报错追溯。