2019-05-10
1.##
在函数的执行过程中,yield语句会把你需要的值返回给调用生成器的地方,然后退出函数,下一次调用生成器函数的时候又从上次中断的地方开始执行,而生成器内的所有变量参数都会被保存下来供下一次使用。
def fib(max):
a, b = 0, 1
while a < max:
yield a
a, b = b, a + b
for i in fib(1000):
print(i)
2.
我们已经知道,可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
MapReduce: Simplified Data Processing on Large Clusters
3.
map():
将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回
def f(x):
return x * x
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
reduce():
把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
from functools import reduce
def add(x, y):
return x + y
reduce(add, [1, 3, 5, 7, 9])
25
filter():
接收一个函数和序列,把传入的函数作用于每个元素,然后根据返回值true or false决定保留还是丢弃!!!该函数返回的也是一个iterator,例去除所有的素数:
def all():
x=0
while true:
sort()###
给一个列表进行排序。例如:
sorted(['bob', 'about', 'Zoo', 'Credit'],
key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']
*args###
*args 用来将参数打包成tuple给函数体调用
**kwargs###
**kwargs 打包关键字参数成dict给函数体调用
闭包###
我们可以将闭包理解为一种特殊的函数,这种函数由两个函数的嵌套组成,且称之为外函数和内函数,外函数返回值是内函数的引用,此时就构成了闭包。
def addx(x):
def adder(y):
return x + y
return adder
c = addx(8)
type(c)
<type 'function'>
c._name_
'adder'
c(10)
18
lambda###
lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值。lambda语句构建的其实是一个函数对象
对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题
foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
print filter(lambda x: x % 3 == 0, foo)
函数对象&&装饰器###
函数对象有一个name属性,可以拿到函数的名字:
def okiu():
pass
f=okiu()
print(f._name_)okiu
装饰器:在不影响内部函数的功能的时候,为其添加额外功能!!!
它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。
def use_logging(func):
def wrapper():
logging.warn("%s is running" % func.__name__)
return func()
return wrapper
@use_logging
def foo():
print("i am foo")
foo()
偏函数###
int2 = functools.partial(int, base=2)
柯里化
柯里化指的就是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数
def add(x,y):
print(x+y)
def new_add(x):
def inner(y):
print(x+y)
return inner
add(4,5)
new_add(4)(5)