美文网首页Python全栈工程师
17.1-高阶函数和柯里化

17.1-高阶函数和柯里化

作者: BeautifulSoulpy | 来源:发表于2019-09-18 21:14 被阅读0次

再强大的对手,也敌不过你无止尽的坚持,永远不要逃避问题,因为时间不会给弱者任何回报!

人不能自卑,自卑把自己看得太低,什么事都做不成。人不能自傲,自傲把自己看太高,最后没有人能看得起你。人最重要的是别太关注别人的眼光,不断和自己比,和自己较劲!

本章总结:

  1. 容器类型(列表、元组、字典等)可以比较大小,其他类型的对象比较的是内存地址;
    函数定义在内存中放一份, 内层函数函数名相当于局部变量(临时创建的);两次创建的都不一样;
  2. 函数参数列表里面,关键字key要的是函数,而不是函数的结果;
    str.lower('A')
    'A'.lower()

函数

1.函数在Python 中是一等公民
2.函数也是对象,可调用对象
3.函数可以作为不同变量、参数、返回值等等;

高阶函数

高阶函数:一个函数可以接收另一个函数作为参数,这样的函数叫做高阶函数;

1.数学形式 y=g(f(x))
2.在数学和计算机中,高阶函数应当至少满足下面一个条件的函数:接收一个或多个函数作为参数;输出一个参数;

1.inc函数 局部环境是临时创建的(相当于临时的); 两次函数的压栈 是 不一样的 ;
def counter(base):
    def inc(step=1):
        nonlocal base
        base += step
        return base
    return inc
fn1 = counter(5)
fn2 = counter(5)   #两 次 函数的压栈是不一样的;

#  没办法比较的内容,就比较 内存地址;
fn1 == fn2      |    False     # 没办法比较的内容,就比较 内存地址;
fn1 is fn2        |    False     # 比较 内存地址;

1.1  inc函数 是在全局环境中创建的(一直生效);
def inc(base, step=1):
    base += step
    return base

def counter(base):
    a = 1
    return inc
fn1 = counter(5)
fn2 = counter(5)



Python缓存了整数和短字符串,因此每个对象在内存中只存有一份,引用所指对象就是相同的,即使使用赋值;
函数在内存地址中,放一份;

(1) sorted()
sorted(iterable,key,reverse)
sorted(list1,key=函数)

  1. 返回一个新的列表,对一个可迭代对象的所有匀速排序,排序规则为key定义的函数,reverse表示是否排序翻转;
  2. sorted(lst,key=lambda x:6-x) # 返回新列表;
  3. list.sort(key=lambda x:6-x) #就地修改;
练习:模拟写一个 sorted 内建函数

写法1:
def sort(iterable, reverse=False):
    newlist = []
    for x in iterable:
        for i,y in enumerate(newlist):
            flag = x > y if reverse else x < y
            if flag:
                newlist.insert(i,x)
                break 
        else:
            newlist.append(x)
    return newlist

写法2:
def sort(iterable, reverse=False):
   
    def compare(a,b):
        return a > b
    
    newlist = []
    for x in iterable:
        for i,y in enumerate(newlist):
            flag = compare(x,y) if reverse else not compare(x,y)
            if flag:
                newlist.insert(i,x)
                break 
        else:
            newlist.append(x)
            
    return newlist

写法:3:
def sort(iterable, reverse=False, key=lambda a,b: a>b):
    
    newlist = []
    for x in iterable:
        for i,y in enumerate(newlist):
            flag = key(x,y) if reverse else not key(x,y)
            if flag:
                newlist.insert(i,x)
                break 
        else:
            newlist.append(x)
            
    return newlist

写法4:
def sort(iterable, reverse=False, key=str):
    
    newlist = []
    for x in iterable:
        for i,y in enumerate(newlist):
            flag = key(x) > key(y) if reverse else key(x) < key(y)
            if flag:
                newlist.insert(i,x)
                break 
        else:
            newlist.append(x)
            
    return newlist
sort([3,0,14,1])
----------------------------------
[0, 1, 3, 14]

  高阶函数总结:
1.有了高阶函数以后,可以将我们的逻辑抽象出来做出一个个参数;函数更加灵活;

(1) filter()
filter过滤: filter(function, iterable)
对iterable中的item依次执行function(item),将执行结果为True(!=0)的item组成一个List/String/Tuple(取决于iterable的类型)返回,False则退出(0),进行过滤;
  1. 过滤可迭代对象的元素,返回一个迭代器;
  2. function一个具有一个参数的函数,返回bool ;
  3. filter并不是立即返回(sorted是立即返回;) ,filter 返回生成器惰性求值
1. 过滤出数列中能被3整除的数字;
list(filter(lambda x: x%3 == 0, [1,9,55,150,-3,78,123]))
--------------------------------------------------------------------------
[9, 150, -3, 78, 123]

2. filter 返回生成器惰性求值的,
a = ((filter(lambda x: x%3 == 0, [1,9,55,150,-3,78,123])))

(2) map()
map(function,iterable)
对iterable中的item依次执行function(item),执行结果输出为list
map函数返回的是一个map对象 , 需要将其转化为列表输出

  1. 对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器;
list(map(str,range(1,6)))
['1', '2', '3', '4', '5']

list(map(lambda x:2*x+1, range(5)))
----------------------------------------------------
[1, 3, 5, 7, 9]

dict(map(lambda x:(x%5,x), range(500)))      # 字典有去重功能;
------------------------------------------------------
{0: 495, 1: 496, 2: 497, 3: 498, 4: 499}

集合方法;
{i for i in map(lambda x: x,range(5))}
set(map(lambda x: x,range(5)))
-------------------------------------------------------------
{0, 1, 2, 3, 4}

2. 柯里化Currying

柯里化定义:本来可以一次传入两个参数,柯里化之后,只需要传入一个函数了。
新函数返回一个以原有第二个参数作为参数的函数;
z=f(x,y) 转换成 z=f(x)(y)

通过嵌套函数就可以将函数转换成柯里化函数;

1. 函数柯里化Currying简单定义
def add(x,y):   # z = f(x,y)
    return x + y
print(add(4,5))


def add(x):    # z = f(x)(y)
    def fn(y):
        return x + y
    return fn
add(4)(5)           
---------------------------------------------------




相关文章

  • 17.1-高阶函数和柯里化

    再强大的对手,也敌不过你无止尽的坚持,永远不要逃避问题,因为时间不会给弱者任何回报! 人不能自卑,自卑把自己看得太...

  • React基础篇之高阶函数&函数柯里化

    高阶函数 函数柯里化

  • 初学函数式编程

    高阶函数(Higher-Order Function):高阶函数就是把函数作为参数的函数。 柯里化(Curryin...

  • JS函数柯里化

    在正式聊函数柯里化之前,我这里给大家补充下高阶函数的概念和应用: 1.1、什么是高阶函数?高阶函数英文叫 High...

  • javascript-柯里化2018-08-08

    柯里化 / 高阶函数 柯里化:将 f(x,y) 变成 f(x=1)(y) 或 f(y=1)x 重点!!!柯里化可以...

  • 06 高阶函数

    所谓高阶函数,就是将函数对象作为函数的参数或者函数的返回值,高阶函数是抽象必不可少的工具 柯里化和部分函数 函数其...

  • 柯里化、高阶函数、

    柯里化 高阶函数在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:**接受一个或多个函数作为输入:for...

  • 柯里化,高阶函数

    柯里化Currying: 柯里化:多参数函数变成接受单一参数并将【接受余下参数且返回结果的】新函数返回的技术。 柯...

  • curried function

    柯里化 haskell 趣学指南中在高阶函数这一章中提出了柯里化概念。举例max函数首先看max函数的类型 按照以...

  • Swift函数式编程与面向协议编程

    函数式编程(FP) 一、函数式编程(FP)-高阶函数 二、函数式编程(FP) - 柯里化(Currying) 三、...

网友评论

    本文标题:17.1-高阶函数和柯里化

    本文链接:https://www.haomeiwen.com/subject/zipeyctx.html