Python高阶函数

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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,917评论 0 8
  • Python语言特性 1 Python的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def...
    伊森H阅读 3,083评论 0 15
  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,628评论 1 118
  • Python语言特性 1 Python的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def...
    时光清浅03阅读 504评论 0 0
  • Ezzy 共享汽车,町町单车都是共享行业的试水者,也均光荣的做了炮灰。虽然创始人都觉得自己是很牛逼的产品...
    4点半的恩赐阅读 119评论 0 0