zoukankan      html  css  js  c++  java
  • CP学习笔记(2)

    原文第1章第6节

    Python允许定义一个函数返回一个代数式,同样的,也可以定义一个函数去引用其他函数。
    引用其他函数的函数就是高阶函数

    Lexical scope(词法定界)

    一个函数只能引用有限范围内的函数。其范围包括:定义本函数的同级框架,以及父级框架。
    TechTarget中国原创:词法定界(lexical scoping,有时候叫静态域)是许多编程语言约定使用的,变量只能在这套范围(按功能排列)内被一些已经定义了的代码段中调用(引用)。当被编译之后,这些范围将确定下来。变量定义用这种格式的有时候叫做私有变量。相反的,还有动态域(dynamic scoping)。动态域产生可以在定义变量的代码段外调用的变量。这样定义的变量也叫公共变量。
    一个栗子
    科学计算里常用到的 迭代法 可以提炼为一个calculate()函数包含有三个子函数:猜测函数guess()、更新函数update()、检验函数check()。

    # original version
    def improve(update, close, guess=default):
            while not close(guess):
                guess = update(guess)
            return guess
            
    # or self-defined
    def calculate(x, close_enough):
        y = guess(x)
        while check(y) > close_enough:
            y = update(y);
        return y
    

    Currying(柯里化)

    来自维基百科
    在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。这个技术由Christopher Strachey以逻辑学家哈斯凯尔·加里命名的,尽管它是Moses Schönfinkel和戈特洛布·弗雷格发明的。
    在直觉上,柯里化声称“如果你固定某些参数,你将得到接受余下参数的一个函数”。所以对于有两个变量的函数yx,如果固定了y=2,则得到有一个变量的函数2x。
    在理论计算机科学中,柯里化提供了在简单的理论模型中,比如:只接受一个单一参数的lambda演算中,研究带有多个参数的函数的方式。
    函数柯里化的对偶是Uncurrying,一种使用匿名单参数函数来实现多参数函数的方法。例如:

    var foo = function(a) {
    return function(b) {
    return a * a + b * b;
    }
    }

    >这样调用上述函数:(foo(3))(4),或直接foo(3)(4)。
    
    
    Python允许一个函数赋予多个独立的参数。例如,
    
    ```python
    def h(x,y):
        return x**2+y/3
    # define a currying function        
    def f(x):
        def g(y):
            return h(x,y**y)
        return g
    
    print f(2)(3)
    

    运行后返回:13

    Lambda表达式

    Lambda表达式允许表达式的嵌套,而无需单独命名引用。

    引自原文
    -- lambda ---------- x ------------- : -------------- f(g(x))
    "A function that -- takes x --- and returns -- f(g(x))"
    但是Lambda的多级嵌套虽然简洁,但不易于程序员的理解。例如:

    compose1 = lambda f,g: lambda x: f(g(x))

    
    ##一级函数
    一级函数可以是:    
    1. 指定有名称    
    2. 可以作为函数参数进行传递    
    3. 可以作为函数运行结果返回    
    4. 可以包含在数据结构当中(data structures)
    
    ##函数修饰符(Function Decorators)
    ```python
    >>> @trace
        def triple(x):
            return 3 * x
    >>> triple(12)
    ->  <function triple at 0x102a39848> ( 12 )
    36
    

    @trace表达式提示编译器对下面定义的函数的运算过程进行跟踪,上例等同于

    >>> def triple(x):
            return 3 * x
    >>> triple = trace(triple)
    

    更多有关函数修饰符的知识可以看这里

  • 相关阅读:
    python 包管理工具 pip 的配置
    Python 变量作用域 LEGB (下)—— Enclosing function locals
    Python 变量作用域 LEGB (上)—— Local,Global,Builtin
    2020 Java 面试题 小结 (答案慢慢补上,有错误请指出)
    mysql 根据日期(date)做年,月,日分组统计查询
    jvm指令
    正则表达式 分割地址 获取省市区详细地址
    .Net 异常记录
    WCF设计服务协议(一)
    plsql ORA-01789:查询块具有不正确的结果列数
  • 原文地址:https://www.cnblogs.com/rim99/p/5023637.html
Copyright © 2011-2022 走看看