zoukankan      html  css  js  c++  java
  • 《Python核心编程》第二版第326页第十二章练习 续一 Python核心编程答案自己做的

    这是自己做的练习,可能有错误,欢迎讨论和各种优化重构方案。

    12-4.
    名称空间和变量作用域。名称空间和变量作用域有什么不同。
    【答案】
    名称空间(Namespaces)是名称(标识符)到对象的映射。名称空间分为局部名称空间(Local Namespaces),全局名称空间(Global Namespaces)和内建名称空间(Build-in Namespaces)。
    Build-in Namespaces首先被Python解释器加载成为Active Namespaces,由__buildins__模块中的名字构成。
    Global Namespaces随后加载为Active Namespaces,可以用globals()内建函数来判断某个名字是否属于全局名称空间。
    Local Namespaces在有需要时,也就是如果执行期间调用了某个函数时,被加载为Active Namespaces,可以用locals()内建函数来判断某个名字是否属于局部名称空间。
    变量(标识符)的作用域定义为其声明在程序里的作用范围(scope)。参见本书295页。定义在函数内的变量有局部作用域,而在一个模块中最高级别的变量有全局作用域。
    注意,所有局部空间的名称都在局部作用范围内。局部作用范围以外的的所有名称都在全局作用范围内。
    局部名称空间和作用域会随函数调用不断变化,全局名称空间不变。

    下面的图来自原书。加上了中文注释,和一些修改。仅供参考。

    image

    #本文来自博客园balian

    12-5.
    使用__import__()。
    (a)使用__import__把一个模块导入到你的名称空间。你最后使用了什么样的语法?
    (b)和上面相同,使用__import__()从指定模块导入特定的名字。
    【答案】
    (a)
    使用的语法是:
    __import__(module_name[, globals[, locals[, fromlist]]])
    代码如下:

    >>> sys = __import__('sys')
    >>> sys.modules.keys()
    ['copy_reg', 'sre_compile', 'locale', '_sre', 'functools', 'encodings', 'site', '__builtin__', 'sysconfig', 'operator', '__main__', 'types', 'encoding
    s.encodings', 'abc', 'encodings.cp437', '_weakrefset', 'errno', 'encodings.codecs', 'sre_constants', 're', '_abcoll', 'ntpath', '_codecs', 'nt', '_war
    nings', 'genericpath', 'stat', 'zipimport', 'encodings.__builtin__', 'warnings', 'UserDict', 'encodings.cp1252', 'sys', 'codecs', 'os.path', '_functoo
    ls', '_locale', 'signal', 'traceback', 'linecache', 'encodings.aliases', 'exceptions', 'sre_parse', 'os', '_weakref']
    >>>

    (b)【未完】感觉有些难度,概念理解上的问题,暂时押后。

    12-6.
    扩展导入。创建一个importAs()函数。这个函数可以把一个模块导入到你的名称空间,但使用你指定的名字,而不是原始名字。例如,调用newname = importAs('mymodule')会导入mymodule,但模块和它的所有元素都通过新名称newname或newname.attr访问。这是Python 2.0引入的扩展导入实现的功能。
    【答案】
    代码如下:

    >>> def importAs(modulename_string):
    ...     newname = __import__(modulename_string)
    ...     return newname
    ...
    >>> test = importAs('sys')
    
    >>> test.modules.keys()
    ['copy_reg', 'sre_compile', 'locale', '_sre', 'functools', 'encodings', 'site', '__builtin__', 'sysconfig', 'operator', '__main__', 'types', 'encoding
    s.encodings', 'abc', 'encodings.cp437', '_weakrefset', 'errno', 'encodings.codecs', 'sre_constants', 're', '_abcoll', 'ntpath', '_codecs', 'nt', '_war
    nings', 'genericpath', 'stat', 'zipimport', 'encodings.__builtin__', 'warnings', 'UserDict', 'encodings.cp1252', 'sys', 'codecs', 'os.path', '_functoo
    ls', '_locale', 'signal', 'traceback', 'linecache', 'encodings.aliases', 'exceptions', 'sre_parse', 'os', '_weakref']
    >>>

    【注】可以采用直接导入sys(import sys)的方法,比较dir(sys)和sys.modules.keys()以及对应的dir(test)和test.modules.keys()的输出结果来验证是否正确。

    12-7.
    导入钩子。研究PEP302的导入钩子机制。实现你自己的导入机制,允许编码你的模块(encryption、bzip2、rot13等),这样解释器会自动解码它们并正确导入。你可以参看zip文件导入的实现(参阅第12.5.7节)。
    【未完】感觉有些难度,概念理解上的问题,暂时押后。

    【推荐】
    一个大牛的blog
    http://eishn.blog.163.com/

    他也在做着本书的习题
    http://hi.baidu.com/%BA%DA%B3%A4%D6%B1%CF%FE%C3%C0%D1%E6v5/home

  • 相关阅读:
    MVC部分视图
    windows服务
    mvc中seeeion和cook的用法
    @Html.Raw()用法和Html.ActionLink的用法总结
    FileStream类的使用(文件流)
    简单工厂和工厂模式对比
    项目案例【Net Core】如何注入多个服务实现类
    快速查找所有存储过程/触发器中是否包含某个字符串
    TortoiseGit安装与配置
    C# 中==与Equals方法比较
  • 原文地址:https://www.cnblogs.com/balian/p/2634150.html
Copyright © 2011-2022 走看看