函数:
在Python中,定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。
- 递归函数,自身调用自身就是递归函数
定义默认参数
定义函数的时候,还可以有默认参数。
由于函数的参数按从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面:
默认参数必须指向不可变对象
如:
# OK:
def fn1(a, b=1, c=2):
pass
# Error:
def fn2(a=1, b):
pass
1. 高级特性:
切片:
list: L[A:B:C]
A,表起始。B表结尾。C表隔几个去一次,不填则为默认参数
tuple: 也可以切片,但是取出后仍是tuple类型迭代:
普通迭代:for … in .. :
没有索引的,只要是可以迭代的对象(字符串也可以迭代),都可以。
例如:dict默认迭代的是key值。
for value in d.itervalues() # 迭代
for k, v in d.iteritems()
- 判断对象是否可以迭代:
通过collections模块的Iterable类型判断:
from collections import Iterable
isinstance('abc', Iterable) # str是否可迭代
如果一个对象说自己可迭代,那我们就直接用 for 循环去迭代它,可见,迭代是一种抽象的数据操作,它不对迭代对象内部的数据有任何要求。
for 循环可作用的迭代对象远不止 list,tuple,str,unicode,dict等
for x, y in [(1, 1), (2, 4), (3, 9)]: #for里同时可以引用两个变量Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:
for i, value in enumerate(['A', 'B', 'C']):
enumerate()把list返回一个包含索引-value值得形式。
- 列表生成式L:
体会快速生成列表的方法
[x * x for x in range(1, 11) if x % 2 == 0]
[m + n for m in 'ABC' for n in 'XYZ']
[x * x for x in range(1, 11)]
生成器G:
列表元素按照某种算法推算出来,一边循环一边计算推算出后来的元素,可以节约大量空间创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。
generator是可迭代对象,直接用for可以遍历另外一种定义的方法:如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
跟函数不同的一点:变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
2.函数式编程:
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
高阶函数:
函数本身也可以赋值给变量,即:变量可以指向函数一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数map/reduce
map()函数接收两个参数,先是函数,后是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回reduce把一个函数作用在一个序列[x1, x2, x3…]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
filter()
filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素sorted()
接受两个参数,第一个是序列,默认参数从大到小,第二个参数是比较函数参数
sorted([‘bob’, ‘about’, ‘Zoo’, ‘Credit’], cmp_ignore_case)返回函数
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量匿名函数
不需要显式地定义函数,直接传入匿名函数更方便 关键字lambda表示匿名函数,冒号前面的x表示函数参数。
map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])
lambda x: x * x 就是
def f(x):
return x * x
装饰器
在面向对象(OOP)的设计模式中,decorator被称为装饰模式。OOP的装饰模式需要通过继承和组合来实现,而Python除了能支持OOP的decorator外,直接从语法层次支持decorator。Python的decorator可以用函数实现,也可以用类实现。
decorator可以增强函数的功能,定义起来虽然有点复杂,但使用起来非常灵活和方便。偏函数
简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单