定义返回单值def my_abs(x): if x 0: return x else: return -x返回多值返回多值就是返回一个tupleimport math def move(x, y, step, angle0): nx x step * math.cos(angle) ny y - step * math.sin(angle) return nx, ny空函数def nop(): pass指定默认参数必选参数在前默认参数在后。默认参数需指向不可变对象默认参数值在函数定义时被计算def power(x, n2): s 1 while n 0: n n - 1 s s * x return s可变参数def calc(*numbers): sum 0 for n in numbers: sum sum n * n return sum调用可变参数的函数方法 calc(1, 2) 5 calc() 0 nums [1, 2, 3] calc(*nums) 14关键字参数def person(name, age, **kw): print name:, name, age:, age, other:, kw调用关键字参数的方法 person(Michael, 30) name: Michael age: 30 other: {} person(Bob, 35, cityBeijing) name: Bob age: 35 other: {city: Beijing} person(Adam, 45, genderM, jobEngineer) name: Adam age: 45 other: {gender: M, job: Engineer} kw {city: Beijing, job: Engineer} person(Jack, 24, **kw) name: Jack age: 24 other: {city: Beijing, job: Engineer}注参数定义的顺序必须是必选参数、默认参数、可变参数和关键字参数。对于任意函数都可以通过类似func(*args, **kw)的形式调用它无论它的参数是如何定义的。递归如果一个函数在内部调用自身本身这个函数就是递归函数。尾递归在函数返回的时候调用自身本身并且return语句不能包含表达式。高阶函数变量可以指向函数函数可以赋值给一个变量函数名也是变量函数名可以赋值其他值函数可以做为函数的参数高阶函数map(func, list)map()函数接收两个参数一个是函数一个是序列map将传入的函数依次作用到序列的每个元素并把结果作为新的list返回。 def f(x): ... return x * x ... map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) [1, 4, 9, 16, 25, 36, 49, 64, 81]reduce(func_with_two_params, list)reduce把一个函数作用在一个序列[x1, x2, x3…]上这个函数必须接收两个参数reduce把结果继续和序列的下一个元素做累积计算。reduce(f, [x1, x2, x3, x4]) #相当于 f(f(f(x1, x2), x3), x4) def add(x, y): ... return x y ... reduce(add, [1, 3, 5, 7, 9]) 25filter(func_return_bool, list)把传入的函数依次作用于每个元素然后根据返回值是True还是False决定保留还是丢弃该元素。def is_odd(n): return n % 2 1 filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]) # 结果: [1, 5, 9, 15]sorted对于两个元素x和y如果认为x y则返回-1如果认为x y则返回0如果认为x y则返回1 sorted([36, 5, 12, 9, 21]) [5, 9, 12, 21, 36]高阶函数用法def reversed_cmp(x, y): if x y: return -1 if x y: return 1 return 0 sorted([36, 5, 12, 9, 21], reversed_cmp) [36, 21, 12, 9, 5]函数做为返回值def lazy_sum(*args): def sum(): ax 0 for n in args: ax ax n return ax return sum f lazy_sum(1, 3, 5, 7, 9) f function sum at 0x10452f668 f() 25注每次调用lazy_sum()都会返回一个新的函数即使传入相同的参数。闭包def count(): fs [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 count() f1() 9 f2() 9 f3() 9原因是调用count的时候循环已经执行但是f()还没有执行直到调用其时才执行。所以返回函数不要引用任何循环变量或者后续会发生变化的变量。