《Python自然语言处理》学习笔记-第四章

来源:互联网 发布:淘宝店怎么上传图片 编辑:程序博客网 时间:2024/05/18 11:49

第四章:编写结构化程序

4.1 回到基础

赋值
(1)对于结构化对象,如链表,其赋值实际上是一个对象的引用。因此在使用与该对象相关的变量修改链表时,所有变量的值都会变化。
(2)关键是要明白通过一个对象引用修改一个对象与通过覆盖一个对象引用之间的区别。
(3)复制结构,而不复制任何对象引用使用copy.deepcopy()。需要import copy。

等式
(1)is操作符测试是否为同一个对象。
(2)==关系操作符判断的只是对象的类型和值是否一致,而is是判断是否为同一个对象。

条件语句
(1)在if语句的条件部分,一个非空字符串或链表被判定为真,而一个空字符串或链表判定为假。
(2)all()函数和any()函数可以应用到一个链表(或其他序列),来检查是否全部或任一项目满足一些条件。


4.2 序列

元组序列
(1)元组序列由逗号操作符构造,而且通常使用括号括起来。

序列类型上的操作
(1)可以在这些序列类型之间相互转换。
(2)tuple(s)将任何种类的序列转换成一个元组。
(3)list(s)将任何种类的序列转换成一个链表。
(4)使用join()函数将一个字符串链表转换成单独的字符串。
(5)FreqDist对象也可以使用list()函数转换成一个序列,且支持迭代。
(6)zip()函数取两个或两个以上的序列中的项目,将它们“压缩”打包成单个的配对链表。
(7)给定一个序列s,enumerate(s)返回一个包含索引和索引处项目的配对。
(8)可以指定想要分割数据的位置。

合并不同类型的序列
(1)下划线只是一个普通的python变量,我们约定可以用下划线表示我们不会使用其值的变量。
(2)一个链表是一个典型的具有相同类型的对象序列,它的长度是任意的。
(3)一个元组通常是不同类型的对象的集合,长度固定。经常用一个元组来保存一个记录:与一些实体相关的不同字段的集合。
(4)在Python中,列表是可变的,而元组是不可变的。也就是说,列表可以被修改,而元组不能被修改。

产生器表达式
(1)使用列表推导的好处在于,用它处理文本结构紧凑和可读性好。
(2)将列表推导插入到一些函数调用中时,如果不加方括号可以构成一个产生器表达式,比起加了方括号,产生器表达式会更高效。


4.3 风格问题

Python代码风格
(1)代码布局中每个缩进级别应使用4个空格。避免使用tab缩进,因为它可能由于不同的文本编辑器的不同解释而产生混乱。
(2)每行应少于80个字符长,如果必要的话,你可以在圆括号、方括号或花括号内换行,因为Python能够探测到该行与下一行是连续的。
(3)如果你需要在圆括号、方括号或大括号中换行,通常可以添加额外的括号,也可以在行尾需要换行的地方添加一个反斜杠。

过程风格与声明风格
计数器的一些合理用途


4.4 函数:结构化编程的基础

函数的输入和输出
(1)使用函数的参数传递信息给函数,参数是括号括起的变量和常量列表,在函数定义中跟函数名称之后。
(2)函数通常会通过return语句将其结果返回给调用它的程序。
(3)一般情况下,函数应该修改参数的内容或返回一个值,而不是两个都做。

参数传递
(1)需要理解Python的按值传递参数和按引用传递参数的区别。
(2)可以使用id()函数和is操作符来检查每个语句执行之后对象标识符是否发生变化。

变量的作用域
(1)名称解析的LGB规则:先本地(local),再全局(global),后内置(built-in)。

参数类型检查
(1)可以使用assert来判断某个条件是否成立,如果assert语句失败,将会产生一个不可忽视的错误而停止程序执行。这是一种防御性编程。

功能分解

文档说明函数
(1)docstring应该用一个三重引号引起来。
(2)docstring中可以包括一个doctest块,说明使用的函数和预期的输出。这些都可以使用Python的docutils模块自动测试。
(3)docstring中应当记录函数的每个参数的类型和返回类型。


4.5 更多关于函数

作为参数的函数
(1)Python提供了更多的方式来定义函数作为其它函数的参数,即所谓的lambda表达式。

累计函数
(1)使用yield语句可以使原本返回一个序列的函数变成一个生成器,使得程序更加高效。

高阶函数

参数的命名
(1)我们可以i通过名字引用参数,甚至可以给它们分配默认值以供调用程序没有提供该参数时使用。这些参数被称为关键字参数。
(2)如果将关键字参数和非关键字参数混合使用的话,必须确保未命名的参数在命名的参数前面。因为未命名参数是根据位置来定义的。
(3)我们可以定义一个函数,接受任意数量的未命名和命名参数,并通过一个参数链表*args和一个关键字参数字典**kwargs来访问它们。
(4)当*args作为函数参数时,它实际上对应函数所有的未命名参数。
(5)注意不要使用可变对象作为参数的默认值。


4.6 程序开发

Python模块的结构
(1)程序模块的目的是把逻辑上相关的定义和函数结合在一起,以方便重用和更高层次的抽象。
(2)一个模块可以包含用于创建和操纵一种特定数据结构的代码或者执行特定的处理任务。
(3)可以使用变量__file__定位你的系统中任一NLTK模块的代码。
(4)模块的一些变量和函数仅用于模块内部,它们的名字应该以下划线开头,这些名称将不会被导入。
(5)可以选择性地列出一个模块的外部可访问的名称,使用一个特殊的内置变量:__all__= [‘edit_distance’, ‘jaccard_distance’]

多模块程序

阅读全文
0 0