`
javatome
  • 浏览: 837182 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

第11章 函数和函数式编程(5)

 
阅读更多

11.7.3 偏函数应用

Currying能泛化成为偏函数应用(partial function application, PFA),这种函数将任意数量(顺序)的参数的函数转化成另一个带剩余参数的函数对象。

1. 简单的函数式例子

>>> from functools import partial
>>> intbase2 = partial(int, base = 2)
>>> intbase2("1010100010101010101010")
2763434
>>>

2. 警惕关键字

如果你创建了不带base关键字的偏函数,比如baseTwo-BAD = partial(int, 2),这可能会让参数以错误的顺序传入int(),因为固定参数的总是放在运行时刻参数的左边。

11.8 变量作用域

11.8.1 全局变量与局部变量

定义在函数内的变量有局部作用域,在一个模块中最高级别的变量有全局作用域。

全局变量的一个特征是除非被删除掉,否则它们的存活到脚本运行结束,且对于所有的函数,他们的值都是可以被访问的,然而局部变量,就像它们存放的栈,暂时地存在,仅仅只依赖于定义它们的函数现阶段是否处于活动。当一个函数调用出现时,其局部变量名为那个对象创建了,一旦函数完成,框架被释放,变量将会离开作用域。

>>> global_str = 'foo'
>>> def foo():
... local_str = 'bar'
... return global_str + local_str
...
>>>

当搜索一个标识符的时候,Python先从局部作用域开始搜索。如果在局部作用域内没有找到这个名字时,那么就一定会在全局域找到这个变量否则就会被抛出NameError异常。

仅仅通过创建一个局部变量来“隐藏”或者覆盖一个全局变量是有可能的。

如果在赋予局部变量值之前,你在函数中使用了这样的名字,你将会得到一个异常。

>>> global_str = 'foo'
>>> def foo2():
... global_str = 'bar'
... return global_str
...
>>> foo2()
'bar'
>>> def foo3():
... global_str
... print global_str
... global_str = 'bar'
... return global_str
...
>>> foo3()
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "<interactive input>", line 2, in foo3
UnboundLocalError: local variable 'global_str' referenced before assignment
>>>

11.8.2 global语句

为了明确地引用一个已命名的全局变量,必须使用global语句。global的语法如下:

global var1[, var2[, ...varN]]


>>> global_str = "GlobalSet"
>>> def foo():
... global global_str
... global_str = "LocalSet"
...
>>> print global_str
GlobalSet
>>> foo()
>>> print global_str
LocalSet
>>>

11.8.4 闭包

如果在一个内部函数里,对在外部作用域的变量进行引用,那么内部函数就被认为是闭包(closure)。定义在外部函数内的但由内部函数引用或者使用的变量称为自由变量。

闭包对于安装计算、隐藏状态和在函数对象和作用域中随意地切换是很有用的。

1.简单的闭包的例子

>>> def counter(start_at = 0):
... count = [start_at]
... def incr():
... count[0] +=1
... return count[0]
... return incr
...
>>> count1 = counter()
>>> count1()
1
>>>

11.8.5 作用域和lambda

那些声明为函数局部变量的lambda表达式在这个函数内是可以访问的;然而,在lambda语句中的表达式有和函数相同的作用域。你也可以认为函数和一个lambda表达式是同胞。

lambda表达式在foo()的局部作用域中创建,但它仅仅只能访问两个作用域:它自己的局部作用域和全局的作用域。

>>> def foo():
... y = 5
... bar = lambda y: x+y
... print bar(y)
... y = 9
... print bar(y)
...
>>> foo()
15
19
>>>

10.8.6 变量作用域和名称空间

>>> j, k = 1, 2
>>> def procl():
... j, k = 3, 4
... print j,' ', k
... k = 5
...
>>> def procl2():
... j = 6
... procl()
... print j,' ', k
...
>>> k = 7
>>> procl()
3 4
>>> print j, ' ', k
1 7
>>> j = 8
>>> procl2()
3 4
6 7
>>> print j, ' ', k
8 7
>>>


分享到:
评论

相关推荐

    《python核心编程》第十一章:函数和函数式编程1

    《Python核心编程》第十一章深入探讨了函数和函数式编程的概念,这在第二章的基础之上进行了扩展。在Python中,函数不仅仅是一个简单的代码块,它们具有丰富的特性和功能,如多样的调用方式、参数类型和函数式编程...

    一本关于JavaScript中函数式编程的书

    JavaScript中的函数式编程是一种强大的编程范式,它源自数学中的函数理论,强调将计算视为函数的求值,而不是状态的变化或指令的序列。在JavaScript中,函数式编程可以帮助我们写出更简洁、可读性强且易于测试的代码...

    现代C++函数编程模式

    现代C++函数编程模式是C++11及后续版本引入的一种增强编程范式的特性,它使得C++在传统的面向对象编程之外,增加了函数式编程的能力。这种编程风格强调使用不可变数据、高阶函数和惰性计算,尤其适用于处理多线程...

    Swift 函数式编程高清正版

    Swift函数式编程是一种将函数作为一等公民的编程范式,它强调程序的数据流和变换,而不是对状态和可变数据的操作。在Swift中,函数式编程的思想与面向对象编程和命令式编程相结合,提供了丰富的工具和概念来帮助...

    JavaScript函数式编程1

    在JavaScript中,由于其动态类型和第一类函数特性,使得函数式编程成为可能。下面将详细介绍一些核心的函数式编程概念和在JavaScript中的应用。 1. **第一类函数**:在JavaScript中,函数是一种值,可以被赋给变量...

    函数式编程.md

    函数式编程是一种编程范式,强调使用函数来构建软件。它将计算视为数学函数的评估,并避免改变状态和可变数据。下面将详细阐述文件内容中提到的函数式编程的核心概念: ### 函数概念 在编程中,函数是一组定义如何...

    第三周-第11章节-Python3.5-函数与函数式编程1.avi

    第三周-第11章节-Python3.5-函数与函数式编程1.avi

    Python核心编程(第二版)PDF高清 part1 共2部分

    第11章 函数和函数式编程 第12章 模块 第13章 面向对象编程 第14章 执行环境 第2部分 高级主题 第15章 正则表达式 第16章 网络编程 第17章 网络客户端编程 第18章 多线程编程 第19章 图形用户界面编程 第...

    scala编程中文pdf

    第9章函数式编程214 第10 章集合242 第11 章列表、数组、映射、集及其他315 第12 章文件和进程367 第13 章Actors 和并发401 第14 章命令行任务440 第15 章Web 服务.475 第16 章数据库和持久化510 第17 章与Java 交互...

    delphi函数参考大全第11章

    - 接口是一种引用类型,定义一组方法签名,用于实现多继承和契约式编程。 以上就是Delphi函数参考大全第11章涵盖的主要内容,这些知识点构成了Delphi编程中的重要部分,理解和掌握它们将极大地提升开发者在Delphi...

    Python核心编程 第二版

    第11章 函数和函数式编程 第12章 模块 第13章 面向对象编程 第14章 执行环境 第2部分 高级主题 第15章 正则表达式 15.1 引言/动机 15.2 正则表达式使用的特殊符号和字符 15.2.1 用管道符号(|)匹配多个...

    Table_map_log_event内容详解.pdf

    新的日期和时间API 246 第四部分 超越Java 8 第13章 函数式的思考 262 第14章 函数式编程的技巧 275 第15章 面向对象和函数式编程的混合:Java 8和Scala的比较 299 第16章 结论以及Java的未来 313

    《Python编程从入门到实践(第2版)》第1章到第11章练习题答案,简洁,简单

    7. 函数式编程:Python支持高阶函数、闭包和匿名函数(lambda表达式),这使得Python可以进行函数式编程,提高代码的简洁性和可读性。 8.面向对象编程:Python支持类和对象的概念,通过封装、继承和多态实现面向...

    编程思想14章构造函数的初始化表达式

    在C++编程中,构造函数是一种特殊的成员函数,它的主要任务是初始化类的对象。构造函数的初始化表达式是创建对象时执行的关键步骤,用于设置新对象的状态。在第14章“构造函数的初始化表达式”中,我们将深入探讨这...

    UNIX网络编程 卷1:套接字联网API

    第11章 名字与地址转换 第三部分 高级套接字编程 第12章 IPv4与IPv6的互操作性 第13章 守护进程和inetd超级服务器 第14章 高级I/O函数 第15章 Unix域协议 第16章 非阻塞式I/O 第17章 ioctl操作 第18...

    Python 核心编程 第二版

     第11章 函数和函数式编程   11.1 什么是函数?   11.2 调用函数   11.3 创建函数   11.4 传递函数   11.5 Formal Arguments   11.6 可变长度的参数   11.7 函数式编程   11.8 变量作用域...

    Functional Programming in C#

    这一章深入研究了如何通过组合和转换现有函数来创建新的函数,这是函数式编程中一个非常强大的概念。 #### 第15章:可选值 可选值处理是函数式编程中避免空指针异常和错误传播的关键技术。本章讲解了如何在C#中有效...

    java8stream源码-java8:Java8——函数式编程

    java8流源码java8 Java 8 —— 函数式编程 介绍 该存储库包含例如 Java 8 In ...章函数式编程技术 第 15 章混合 OOP 和 FP:比较 Java 8 和 Scala 第 16 章结论和 Java 的下一步 例如在 Java 8 Lambd

Global site tag (gtag.js) - Google Analytics