Python函数
匿名函数
匿名函数格式
lambda argument1, argument2,... argumentN : expression
def square(x):
return x**2
square(3)
# 等价于
square = lambda x: x**2
square(3)
map
# 将数组里的值都X2
l = [1, 2, 3, 4, 5]
new_list = map(lambda x: x * 2, l)
print(list(new_list))
filter
# 过滤数组,剩余偶数
l = [1, 2, 3, 4, 5]
new_list = filter(lambda x: x % 2 == 0, l)
print(list(new_list))
闭包
概念
引用Vamei 解释
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!
闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function);在面向对象编程中,我们见过对象(object)。函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性(reusability)。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。
不同的语言实现闭包的方式不同。Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范式中,已经多次看到Python使用对象来实现一些特殊的语法)。Python一切皆对象,函数这一语法结构也是一个对象。在函数对象中,我们像使用一个普通对象一样使用函数对象,比如更改函数对象的名字,或者将函数对象作为参数进行传递。
例子
函数是一个对象,所以可以作为某个函数的返回结果。
def line_conf():
def line(x):
return 2*x+1
return line # return a function object
my_line = line_conf()
print(my_line(5))
装饰器
装饰器内容引用自 python装饰器单例模式
例如有一个函数hello
def hello():
print 'hello'
现在想要在这个函数中添加一些调试信息, 可以直接在函数内部改动
def hello():
print 'hello'
print '[DEBUG] hello'
一个两个这样写可以, 但如果函数多了, 难免会有点麻烦, 还有可能遗漏, 这时候就可以用到装饰器了
def debug(func):
def wrapper():
print '[DEBUG]: the function in ', func.__name__
return func()
return wrapper
@debug
def hello():
print 'hello'
@debug
def hi():
print 'hi'
hello()
# [DEBUG]: the function in hello
# hello
hi()
# [DEBUG]: the function in hi
# hi
在debug函数中定义了一个wrapper函数, 它用于扩展传入函数func的功能,
return wrapper就是把扩展后的函数返回, 如果func有参数, 需要在wrapper的参数列表中声明
def debug(func):
def wrapper(*args, **kargs):
print '[DEBUG]: the function in ', func.__name__
return func(*args, **kargs)
return wrappe
@debug就是装饰器, 它相当于
hello = debug(hello)
了解完装饰器, 就可以用装饰器来写一个单例模式了
from functools import wraps
def Singleton(cls):
_instance = {}
@wraps(cls)
def _singlenton(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
return _instance[cls]
return _singlenton
@Singleton
class A():
pass
函数的迭代器与生成器(面试)
迭代器
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
l = [1, 2, 3, 4]
itr = iter(l) # 创建迭代器
print(next(itr)) # 使用next方法访问元素
print(next(itr))
输出>>
1
2
生成器
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
def generator(n):
print("第一次进入生成器打印")
while True:
if 0 <= n < 10:
yield n
n += 1
else:
break
print("到10结束")
for i in generator(0):
print(i)
输出>>
第一次进入生成器打印
0
1
2
3
4
5
6
7
8
9
到10结束