python知识点

1、Python的数据类型都有哪些?
答:整数,浮点数,字符串,布尔,空值,变量,常量

2、Python中列表和元组有什么区别?

参考博客:Python列表和元组的详细区别_藤藤菜的专栏-CSDN博客_元组和列表的区别

答:列表是动态数组,它们可变且可以重设长度(改变其内部元素的个数)。

元组是静态数组,它们不可变,且其内部数据一旦创建便无法改变。
元组缓存于Python运行时环境,这意味着我们每次使用元组时无须访问内核去分配内存。
这些区别结实率两者在设计哲学上的不同:
列表可被用于保存多个互相独立对象的数据集合
元组用于描述一个不会改不安的事务的多个属性

3、Python中的局部变量和全局变量是什么?
参考博客:吐血总结!50道Python面试题集锦(附答案)_python学习者的博客-CSDN博客_python面试题
答:全局变量:在函数外或全局空间中声明的变量称为全局变量。这些变量可以由程序中的任何函数访问。局部变量:在函数内声明的任何变量都称为局部变量。此变量存在于局部空间中,而不是全局空间中。

4、方法:__init__()是否可以有返回值?
参考博客:

吐血总结!50道Python面试题集锦(附答案)_python学习者的博客-CSDN博客_python面试题
答:不允许有返回值。如果你的__init__过于复杂有可能要提前结束的话,使用单独的return就好,不要带返回值。

5、如何在python中写注释?
参考博客:

吐血总结!50道Python面试题集锦(附答案)_python学习者的博客-CSDN博客_python面试题
答:Python中的注释以#字符开头。也可以使用doc-strings(三重引号中包含的字符串)进行注释。

6、len()函数有什么作用?返回值是什么类型?
参考博客:

吐血总结!50道Python面试题集锦(附答案)_python学习者的博客-CSDN博客_python面试题
答:len()函数可用于确定字符串,列表,数组等的长度。返回值为int类型

7、strip()有什么作用?
参考:《Python基础教程》(第三版)
答:方法strip()将字符串开头和末尾的空白(但不包括中间的空白)删除,并返回删除后的结果。

8、众所周知,python是一个对于书写格式有一定要求的语言,python是如何分隔方法与类的?
参考:《python编程:从入门到实践》
答:可以使用空行来组织代码,但是不要滥用。在类中,可以使用一个空行来分隔方法;而在模块中,可以使用两个空行来分隔类。

9、with open .... as与单纯的open()最大的区别是什么?
参考:《python编程:从入门到实践》
答:关键字with使得我们不需要像open方法一样在访问文件后将其关闭(使用close方法)。如果程序存在bug,导致close()语句未执行,文件将不会关闭,而不妥善的关闭文件可能会导致数据丢失或者受损。
10、读取文件,将文件缓存到内存时一般有哪几种方式?
参考:《python编程:从入门到实践》
答:可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。

11、写入文件时,open()方法的第二个实参有哪些模式?如果不传入第二个实参以什么模式打开文件?
参考:《python编程:从入门到实践》
答:读取模式:(‘r')
写入模式:('w')
附加模式:('a')
读写模式:('r+')
​不传参会以只读模式打开文件

12、python中异常处理的作用有哪些?
参考:《python编程:从入门到实践》
答:python使用被称为异常的特殊对象来管理程序执行期间发生的错误,每当发生让python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续执行;如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告,而这些traceback一般不会使程序使用者有良好的使用体验。因此在使用了异常处理后,即便出现异常,程序也将继续运行;显示你编写好的有好的错误消息,而不是令用户迷惑的traceback

13、函数input()的工作原理是什么?
参考:《python编程:从入门到实践》
答:函数input()让程序暂停运行,等待用户输入一些文本。获取用户输入后,Python将其存储在一个变量中,以方便使用。

14、python2和python3的获取输入区别?
参考:《python编程:从入门到实践》
答:python2.7应该使用函数raw_input()来提示用户输入。这个函数与python3中的input()一样,将输入解读为字符串。

15、能够在列表中添加元素的方法有哪些?区别是什么?
参考:《python编程:从入门到实践》
答:append()方法:在列表最后一项添加元素
insert()方法:在列表中插入一个元素

1、Python导入模块的方法有哪两种?

参考:《Dive Into Python》

答:from module import 以及 import module

2、函数__init__()与传统意义上的构造函数区别是什么?

参考:《Dive Into Python》        

答:__init__在类的实例创建后被立即调用。它可能会引诱你称之为类的构造函数,但这种说法并不正确。说它引诱,是因为它看上去像(按照习惯,__init__是类中第一个定义的方法),行为也  像(在一个新创建的类实例中,它是首先被执行的代码),并且叫   起来也像(“init”当然意  味着构造的本性)。说它不正确,是因为对象在调用 __init__时已经被构造出来了,你已经有了一个对类的新实例的有效引用。但 __init__是在 Python中你可以得到的最接近构造函数的东西,并且它也扮演着非常相似的角色。

3、导入模块时,Python的搜索路径是什么?

参考:《Dive Into Python》        

答:当导入一个模块时,Python在几个地方进行搜索。明确地,它会对定义在 sys.path中的目录逐个进行搜索。它只是一个list (列表),可以容易地查看它或通过标准的list方法来修改它。

4、Python导入模块的两种方式有哪些区别?

参考:《Dive Into Python》        

答:from UserDict import UserDict与 import module语法很相似,但是有一个重要的区别:UserDict被直接导入到局部名字空间去了,所以它可以直接使用,而不需要加上模块名的限定。你可以导入独立的项或使用 from module import *来导入所有东西。

5、from UserDict import UserDict的应用场景有哪些?

参考:《Dive Into Python》        

答:如果你要经常访问模块的属性和方法,且不想一遍又一遍地敲入模块名,使用 from module import。
如果你想要有选择地导入某些属性和方法,而不想要其它的,使用 from module import。
如果模块包含的属性和方法与你的某个模块同名,你必须使用 import module来避免名字冲突。

6、如何在Python中对类进行实例化?

参考:《Dive Into Python》        

答:在 Python中对类进行实例化很直接。要对类进行实例化,只要调用类 (就好像它是一个函数),传入定义在 __init__方法中的参数。返回值将是新创建的对象。

7、子类在对父类方法进行重写时是否有限制?如果有,请列举出来。

参考:《Dive Into Python》        

答:在子类中,任何方法都可能被重写,也就是说重新实现,这一点与Java(除了其“final”方法之外)是相同的。

8、专用类方法与普通的类方法调用方式是相同的吗?如果不是,不同点在哪里?

参考:《Dive Into Python》        

答:除了普通的类方法,Python类还可以定义专用方法。专用方法是在特殊情况下或当使用特别语法时由 Python替你调用的,而不是在代码中直接调用 (像普通的方法那样)。

9、如何在Python中定义一个类?

参考:《Dive Into Python》        

答:在 Python中定义类很简单。就像定义函数,没有单独的接口定义。只要定义类,然后就可以开始编码。Python类以保留字class开始,后面跟着类名。从技术上讲,有这些就够了,因为一个类并非必须从其它类继承。

10、任意Python类的第一个参数是什么?

参考:《Dive Into Python》        

答:习惯上,任何 Python类方法的第一个参数 (对当前实例的引用) 都叫做self。这个参数扮演着C++或 Java中的保留字this的角色,但 self在 Python中并不是一个保留字,它只是一个命名习惯。虽然如此,也请除了 self之外不要使用其它的名字,这是一个非常坚固的习惯。

11、Python与其他语言如JAVA的Function Overloading有哪些区别?

参考:《Dive Into Python》        

答:Java和 Powerbuilder支持通过参数列表的重载,也就是 一个类可以有同名的多个方法,但这些方法或者是参数个数不同,或者是参数的类型不同。其它语言(最明显  如 PL/SQL) 甚至支持通过参数名的重载,也就是 一个类可以有同名的多个方法,这些方法有相同类型,相同个数的参数,但参数名不同。Python两种都不支持,总之是没有任何形式的函数重载。一个 __init__方法就是一个 __init__方法,不管它有什么样的参数。每个类只能有一个 __init__方法,并且如果一个子类拥有一个 __init__方法,它总是覆盖父类的 __init__方法,甚至子类可以用不同的参数列表来定义它。

12、专用方法__repr__()的作用是什么?

参考:《Dive Into Python》        

答:__repr__是一个专用的方法,在当调用 repr(instance)时被调用。repr函数是一个内置函数,它返回一个对象的字符串表示。它可以用在任何对象上,不仅仅是类的实例。你已经对 repr相当熟  悉了,尽管你不知道它。在交互式窗口中,当你只敲入一个变量名,接着按ENTER,Python使用 repr来显示变量的值。

13、专用方法__cmp__()的作用是什么?

参考:《Dive Into Python》        

答:__cmp__在比较类实例时被调用。通常,你可以通过使用 ==比较任  意两个Python对象,不只是类实例。有一些规则,定义了何时内置数据类型被认为是相等的,例如,字典在有着全部相同的关键字和值时是相等的。对于类实例,你可以定义__c mp__方法,自已编写比较逻辑,然后你可以使用==来比较你的类,Python将会替你调用你的 __cmp__专用方法。

14、Python有哪些私有概念?

参考:《Dive Into Python》        

答:私有函数:不可以从它们的模块外面被调用
私有类方法:不能够从它们的类外面被调用
私有属性:不能够从它们的类外面被访问

15、Python如何表明一个函数,类方法或属性是私有的?

参考:《Dive Into Python》        

答:与大多数的语言不同,一个Python函数,方法,或属性是私有还是公有,完全取决于它的名字。如果一个 Python函数,类方法,或属性的名字以两个下划线开始(但不是结束),它是私有的;其它所有的都是公有的。Python没有类方法保护的概念(只能用 于它们自已的类和子类中)。类方法或者是私有(只能在它们自已的类中使用) 或者是公有(任何地方都可使用)。

1、在Python中实现工厂有几种方式?

参考:《Python面向对象编程指南》

答:

        a 定义一个函数,返回不同类的对象;

        b 定义一个类,包含了创建对象的方法。这是完整的工厂设计模式,正如设计模式书中提到的,在类似Java这样的语言里,工厂类层次结构是必需的,因为语言本身并不支持可以脱离类而单独存在的函数。

2、python中常用的哈希库有哪些?分别有什么作用?

参考:《Python面向对象编程指南》

答:

        Python中有两个哈希库。其中,hashlib可以提供密码级别的哈希函数,zlib模块包含两个高效的哈希函数:adler32()和crc32()。对于相对简单的值,我们不使用这些内置的函数,对于复杂的或者很大的值,这些内置的函数可以提供很大的帮助。

3、python中等价性比较有哪几个层次?

参考:《Python面向对象编程指南》

答:

        哈希值相等:这意味两个对象可能相等。哈希值是判断两个对象有可能相等的快捷方式。如果哈希值不同,两个对象不可能相等,也不可能是同一个对象。
        比较结果相等:这意味着两个对象的哈希值已经是相等的,这个比较用的是==运算符。如果结果相等,那么两个对象有可能是同一个。
                IDD相等:这意味着两个对象是同一个对象。它们的哈希值相同,并且使用==的比较结果相等,这个比较用的是is运算符。

4、什么情况下,需要使用__eq__()和__hash__()方法来定义相等性测试和哈希值?

参考:《Python面向对象编程指南》

答:

        (1) 不可变对象:这些是不可以修改的无状态类型对象,例如tuple、namedtuple和frozenset。我们针对这种情况有两个选择。
            a 不用自定义__hash__()和__eq__()。这意味着直接使用继承而来的行为。这种情况下,__hash__()返回一个简单的函数代表对象的ID值,然后__eq__()比较对象的ID值。默认相等性测试的行为有时候比较反常。我们的应用程序可能会需要Card(1,Clubs)的两个实例来测试相等性和计算哈希值,但是默认情况下这不会发生。
            b 自定义__hash__()和__eq__()。请注意,这种自定义必须是针对不可变对象。
        (2) 可变对象:这些都是有状态的对象,它们允许从内部修改。设计时,我们有一个选择如下。自定义__eq__(),但是设置__hash__为None。这些对象不可以用作dict的键和set中的项目。

5、在数通和核心网领域的python使用者不可避免的会接触到bytes()函数,那么根据bytes()参数不通,行为有什么差别?

参考:《Python面向对象编程指南》

答:

        bytes(integer):返回一个不可变的字节对象,这个对象包含了给定数量的0x00值。
        bytes(string):这个版本会将字符串编码为字节。其他的编码和异常处理的参数会定义编码的具体过程。
        bytes(something):这个版本会调用something.__bytes__()创建字节对象。这里不用编码或者错误处理参数。

6、__del__()最常见的用途是什么?

参考:《Python面向对象编程指南》

答:

        确保文件被关闭。

        通常,包含文件操作的类都会有类似下面这样的代码。__del__ = close这会保证__del__()方法同时也是close()方法。

7、__new__方法最主要的用途是什么?

参考:《Python面向对象编程指南》

答:

        初始化不可变对象。

        __new__()方法中允许创建未初始化的对象。这允许我们在__init__()方法被调用之前先设置对象的属性。由于不可变类的__init__()方法很难重载,因此__new__方法提供了一种扩展这种类的方法。

8、__new__()方法的是如何实现的?

参考:《Python面向对象编程指南》

答:

        return super().__new__(cls )将调用基类的__new__()方法创建对象。这个工作最终委托给了object.__new__(),这个方法创建了一个简单的空对象。除了cls以外,其他的参数和关键字最终都会传递给__init__()方法,这是Python定义的标准行为。

9、默认情况下,创建任何类内部的属性都支持哪些操作?

参考:《Python面向对象编程指南》

答:

        创建新属性。

        为已有属性赋值。

        获取属性的值。

        删除属性。

10、关于特性有几种基本设计模式?

参考:《Python面向对象编程指南》

答:

        主动计算(Eager Calculation):每当更新特性值时,其他相关特性值都会立即被重新计算。
        延迟计算(Lazy calculation):仅当访问特性时,才会触发计算过程。

11、一个抽象基类具有哪些特性?

参考:《Python面向对象编程指南》

答:

        抽象意味着这些类中不包括我们需要的所有方法的定义。为了让它成为一个真正有用的子类,我们需要提供一些方法定义。
        基类意味着其他类会把它当作基类来使用。
        抽象类本身提供了一些方法的定义。更重要的是,抽象基类为缺失的方法函数提供了方法签名。子类必须提供正确的方法来创建符合抽象类定义的接口的具体类。

12、抽象基类在哪些情况下会被使用到?

参考:《Python面向对象编程指南》

答:

        当我们自定义类时,使用抽象基类作为基类。
        我们在一个方法中使用抽象基类来确保一种操作是可行的。
        我们在诊断信息或者异常中使用抽象基类来指出一种操作为什么不能生效。

13、collections.abc模块提供了很多抽象基类,这些抽象基类中只包含一个特殊方法的基类有哪些?

参考:《Python面向对象编程指南》

答:

        Container基类要求子类实现__contains__()方法,这个特殊方法实现了in运算符。
        Iterable基类要求子类实现__iter__()方法。for语句、生成器表达式和iter()函数都需要使用这个方法。
        Sized基类要求子类实现__len__()方法。len()函数需要使用这个方法,它也很稳妥地实现了__bool__()方法,但是这个方法不是必需的。
        Hashable基类要求子类实现__hash__()方法。hash()函数需要使用这个方法,如果这个方法被实现了,就意味着当前对象是不可变的。

14、python中常用的6种集合函数以及他们的功能?

参考:《Python面向对象编程指南》

答:

        namedtuple()函数会创建允许包含可命名属性的tuple类,我们可以使用这个函数而不是额外完整地定义一个仅仅为属性值命名的类。
        deque(注意这种不规则的拼写方式)是一个双端队列,
        一个类似list的集合,但是可以在任何一段快速地进行增加和弹出操作。可以用这个类的其中一部分属性来创建常规的栈或队列。
        在一些情况下,我们可以使用ChainMap,而不是合并不同的映射。这是一个将多个映射连接起来的方法。一个OrderedDict集合是会保持所有元素原始插入顺序的一种映射。
        defaultDict(注意这种不规则的拼写方式)是dict的一个子类,它内部使用一个工厂函数为所有没有值的键提供默认值。
        Counter也是一个dict的子类,它可以被用来统计对象,进而创建频率表。但是,它实际上是一个更复杂的数据结构,通常我们称为多重集合(multiset)或者包(bag)。

15、当使用容器和集合时,设计原则有哪几个步骤?

参考:《Python面向对象编程指南》

答:

        1.考虑序列、映射和集合的内置版本。
        2.考虑collections模块中的库扩展和一些其他的集合类型,例如heapq、bisect和array。
        3.考虑组合使用现有的类定义。在许多情况下,一个tuple对象的list或者是包含list的dict就已经提供了必需的功能。
        4.考虑扩展前面提到的某个类来提供额外的方法或者属性。
        5.考虑用封装一个现有结构的方式作为提供额外方法或者属性的另一个途径。
        6.最后,考虑实现一个新的数据结构。

1、匿名函数lambda的作用是什么?

参考:《Python学习手册(第四版)》

答:

        就像def一样,这个表达式创建了一个之后能够调用的函数,但是它返回了一个函数而不是将这个函数赋值给一个变量名。这也就是lambda有时叫做匿名(也就是没有函数名)的函数的原因。实际上,它们常常以一种行内进行函数定义的形式使用,或者用作推迟执行一些代码。

2、匿名函数lambda与def的区别有哪些?

参考:《Python学习手册(第四版)》

答:

        lambda是一个表达式,而不是一个语句。因为这一点,lambda能够出现在Python语法不允许def出现的地方——例如,在一个列表常量中或者函数调用的参数中。此外,作为一个表达式,lambda返回了一个值(一个新的函数),可以选择性地赋值给一个变量名。相反,def语句总是得在头部将一个新的函数赋值给一个变量名,而不是将这个函数作为结果返回。
        lambda的主体是一个单个的表达式,而不是一个代码块。这个lambda的主体简单得就好像放在def主体的return语句中的代码一样。简单地将结果写成一个顺畅的表达式,而不是明确的返回。因为它仅限于表达式,lambda通常要比def功能要小:你仅能够在lambda主体中封装有限的逻辑进去,连if这样的语句都不能够使用。这是有意设计的——它限制了程序的嵌套:lambda是一个为编写简单的函数而设计的,而def用来处理更大的任务。

3、匿名函数lambda应用场景有哪些?

参考:《Python学习手册(第四版)》

答:

        通常来说,lambda起到了一种函数速写的作用,允许在使用的代码内嵌入一个函数的定义。它们完全是可选的(你总是能够使用def来替代它们),但是在你仅需要嵌入小段可执行代码的情况下它们会带来一个更简洁的代码结构。
        lambda通常用来编写跳转表(jump table),也就是行为的列表或字典,能够按照需要执行相应的动作。
        当需要把小段的可执行代码编写进def语句从语法上不能编写进的地方时,lambda表达式作为def的一种速写来说是最为有用的。

4、lambda主体中的代码遵循什么样的作用域查找法则?

参考:《Python学习手册(第四版)》

答:

        lambda表达式引入的一个本地作用域更像一个嵌套的def语句,将会自动从上层函数中、模块中以及内置作用域中(通过LEGB法则)查找变量名。

5、回调处理器中lambda如何产生其作用?

参考:《Python学习手册(第四版)》

答:

        回调处理器常常在一个注册调用(registrationcall)的参数列表中编写成单行的lambda表达式,而不是使用在文件其他地方的一个def来定义,之后引用那个变量名。

6、lambda的主体是否可以是某条语句?

参考:《Python学习手册(第四版)》

答:

        lambda的主体必须是单个表达式(而不是一些语句),因此我们仅能将有限的逻辑封装到一个lambda中。

7、什么是递归函数

参考:《Python学习手册(第四版)》

答:

        递归函数即直接或间接地调用自身以进行循环的函数。它允许程序遍历拥有任意的、不可预知的形状的结构。递归甚至是简单循环和迭代的替换,尽管它不一定是最简单的或最高效的一种。

8、在Python3.0中,如何能够给函数对象附加注解信息—与函数的参数和结果相关的任意的用户定义的数据?

参考:《Python学习手册(第四版)》

答:

        Python为声明注解提供了特殊的语法,但是,它自身不做任何事情;注解完全是可选的,并且,出现的时候只是直接附加到函数对象的__annotations__属性以供其他用户使用。

9、调用一个注解过的函数,当注解出现的时候python会做出什么样的动作?

参考:《Python学习手册(第四版)》

答:

        Python将它们收集到字典中并且将它们附加给函数对象自身。参数名变成键,如果编写了返回值注解的话,它存储在键"return"下,而注解键的值则赋给了注解表达式的结果。

10、映射函数map与列表解析有什么不同?

参考:《Python学习手册(第四版)》

答:

       map对每一个元素都应用了函数调用而不是任意的表达式。因为这点限制,从某种意义上来说,它成为了不太通用的工具。尽管如此,在某些情况下,目前map比列表解析运行起来更快(也就是说,当映射一个内置函数时),并且它所编写的代码也较少。

11、什么是函数式编程

参考:《Python学习手册(第四版)》

答:

       在Python内置函数中,map函数是用来进行函数式编程的这类工具中最简单的内置函数代表:函数式编程的意思就是对序列应用一些函数的工具。例如,基于某一测试函数过滤出一些元素(filter),以及对每对元素都应用函数并运行到最后结果(reduce)。由于range和filter都返回可迭代对象,在Python 3.0中,它们需要list调用来显示其所有结果。

12、编写函数的通用设计规则是什么?

参考:《Python学习手册(第四版)》

答:

       函数通常应该较小,尽可能自包含,拥有单一的、统一的用途,并且与输入参数和返回值等其他部分通信。如果期待修改的话,它们可以使用可变的参数来与结果通信,并且一些类型的程序暗含其他的通信机制。

13、比较和对比map、filter和reduce。

参考:《Python学习手册(第四版)》

答:

       这3个内置函数都对一个序列(可迭代)对象以及集合结果中的各项应用另一个函数。map把每一项传递给函数并收集结果,filter收集那些函数返回一个True值的项,并且reduce通过对一个累加器和后续项应用函数来计算一个单个的值。和其他两个函数不同,reduce在Python 3.0的functools模块中可用,而不是在内置作用域中可用。

14、什么是函数注解,如何使用它们?

参考:《Python学习手册(第四版)》

答:

       函数注解在Python 3.0及其以后的版本中可用,并且是函数的参数及其结果的语法上的修饰,它会收集到分配给函数的__annotations__属性的一个字典中。Python在这些注解上没有放置语义含义,而是直接将其包装,以供其他工具潜在地使用。

15、使用lambda时都要注意哪些方面?

参考:《Python学习手册(第四版)》

答:

       lambda允许“内联”小单元可执行代码,推迟其执行,并且以默认参数和封闭作用域变量的形式为其提供状态。使用lambda不是必需的,我们总可以编写一条def来替代它,并且用名称来引用该函数。lambda很方便,以嵌套小段的推迟的代码,这些代码不可能在程序的某处用到。它们通常出现在GUI这样的基于回调的程序中,并且它们与map和filter这些期待一个处理函数的函数工具密切相关。

1、什么是可迭代对象?

参考:《Python学习手册(第四版)》

答:

        “可迭代对象”的概念在Python中是相当新颖的,但它在语言的设计中很普遍。基本上,这就是序列观念的通用化:如果对象是实际保存的序列,或者可以在迭代工具环境中(例如,for循环)一次产生一个结果的对象,就看做是可迭代的。总之,可迭代对象包括实际序列和按照需求而计算的虚拟序列。

2、在Python中,可以用于从左至右的扫描对象的迭代工具主要有哪些?

参考:《Python学习手册(第四版)》

答:

      for循环、列表解析、in成员关系测试以及map内置函数等。

3、在遍历任意一个可迭代对象时,如何确认何时可以离开此次遍历?

参考:《Python学习手册(第四版)》

答:

        Python中有一个概念叫迭代协议,内容即为:有__next__方法的对象会前进到下一个结果,而在一系列结果的末尾时,则会引发StopIteration。在Python中,任何这类对象都认为是可迭代的。任何这类对象也能以for循环或其他迭代工具遍历,因为所有迭代工具内部工作起来都是在每次迭代中调用__next__,并且捕捉StopIteration异常来确定何时离开。

4、for循环和列表解析直接有什么关系?

参考:《Python学习手册(第四版)》

答:

        两者都是迭代工具。列表解析是执行常见for循环任务的简明并且高效的方法:对可迭代对象内所有元素应用一个表达式,并收集其结果。你可以把列表解析转换成for循环,而列表解析表达式的一部分的语法看起来就像是for循环的首行。

5、举出Python中的4种迭代环境。

参考:《Python学习手册(第四版)》

答:

        Python中的迭代环境包括for循环、列表解析、map内置函数、in成员关系测试表达式以及内置函数sorted、sum、any和all。这个分类也包括了内置函数list和tuple、字符串join方法以及序列赋值运算。所有这些都使用了迭代协议(next方法)来一次一个元素逐个遍历可迭代对象。

6、如今从一个文本文件逐行读取行的最好的方法是什么?

参考:《Python学习手册(第四版)》

答:

        如今从文本文件中读取文本行的最佳方式是不要刻意去读取:其替代方法是,在迭代环境中打开文件,诸如for循环或列表解析中,然后,让迭代工具在每次迭代中执行该文件的next方法,自动一次扫描一行。从代码编写的简易性、执行速度以及内存空间需求等方面来看,这种做法通常都是最佳方式。

7、列表解析放在方括号和圆括号中有什么区别?

参考:《Python学习手册(第四版)》

答:

        方括号中的列表解析会一次在内存中产生结果列表。当位于圆括号中时,实际上是生成器表达式:它们有类似的意义,但不会一次产生结果列表。与之相对比的是,生成器表达式会返回一个生成器对象,用在迭代环境中时,一次产生结果中的一个元素。

8、生成器和迭代器有什么关系?

参考:《Python学习手册(第四版)》

答:

        生成器是支持迭代协议的对象:它们有__next__方法,重复前进到系列结果中的下个元素,以及到系列尾端时引发例外事件。在Python中,我们可以用def、加圆括号的列表解析的生成器表达式以及以类定义特殊方法__iter__来创建生成器对象(本书稍后讨论),通过它们来编写生成器函数。

9、如何分辨函数是否为生成器函数?

参考:《Python学习手册(第四版)》

答:

        生成器函数在其代码中的某处会有一个yield语句。除此之外,生成器函数和普通函数语法上相同,但是,它们由Python特别编译,以便在调用的时候返回一个可迭代的对象。

10、yield语句是做什么的?

参考:《Python学习手册(第四版)》

答:

        当有了yield语句时,这个语句会让Python把函数特定的编译成生成器;当调用时,会返回生成器对象,支持迭代协议。当yield语句运行时,会把结果返回给调用者,让函数的状态挂起。然后,当调用者再调用__next__方法时,这个函数就可以重新在上次yield语句后继续运行。生成器也可以有return语句,用来终止生成器。

11、map调用和list comprehension有什么关系?比较并对比两者。

参考:《Python学习手册(第四版)》

答:

        map调用类似于列表解析,两者都会收集对序列或其他可迭代对象中每个元素应用运算后的结果(一次一个项目),从而创建新列表。其主要差异在于,map会对每个元素应用函数,而列表解析则是应用任意的表达式。因此,列表解析更通用一些,可以像map那样应用函数调用表达式,但是,map需要一个函数才能应用其他种类的表达式。列表解析也支持扩展语法,例如,嵌套for循环和if分句从而可以包含内置函数filter的功能。

12、生成器函数与常规函数有一个不同点在于生成器函数可以状态挂起,生成器函数是如何实现状态挂起的?

参考:《Python学习手册(第四版)》

答:

        生成器函数和常规函数之间的主要的代码不同之处在于,生成器yields一个值,而不是返回一个值。yield语句挂起该函数并向调用者发送回一个值,但是,保留足够的状态以使得函数能够从它离开的地方继续。当继续时,函数在上一个yield返回后立即继续执行。从函数的角度来看,这允许其代码随着时间产生一系列的值,而不是一次计算它们并在诸如列表的内容中送回它们。

13、生成器函数协议中的send方法有什么作用?

参考:《Python学习手册(第四版)》

答:

        send方法生成一系列结果的下一个元素,这一点就像__next__方法一样,但是它也提供了一种调用者与生成器之间进行通信的方法,从而能够影响它的操作。

        send方法使得值可以通过调用G.send(value)发送给一个生成器G。之后恢复生成器的代码,并且生成器中的yield表达式返回了为了发送而传入的值。如果提前调用了正常的G.__next__()方法(或者其对等的next(G)),yield返回None。

14、为什么说生成器是单迭代器对象?

参考:《Python学习手册(第四版)》

答:

        生产器函数和生成器表达式自身都是迭代器,并由此只支持一次活跃迭代——不像一些内置类型,我们无法有在结果集中位于不同位置的多个迭代器。一个生成器的迭代器是生成器自身(实际上,在一个生成器上调用iter没有任何效果)。

15、列表解析与手动的for循环语句有什么区别?

参考:《Python学习手册(第四版)》

答:

        列表解析比手动的for循环语句运行的更快(往往速度会快一倍),因为它们的迭代在解释器内部是以C语言的速度执行的,而不是以手动Python代码执行的,特别是对于较大的数据集合,这是使用列表解析的一个主要的性能优点。

1、什么是客户端/服务器架构?即C/S架构。

参考:《Python核心编程》(第三版)

答:

        对于不同的人来说,它意味着不同的东西,这取决于你问谁以及描述的是软件还是硬件系统。在这两种情况中的任何一种下,前提都很简单:服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多请求。

2、套接字分为哪两类套接字?分别基于哪种协议?

参考:《Python核心编程》(第三版)

答:

        a、面向连接的套接字:通常基于TCP/IP协议

        b、无连接的套接字:主要基于UDP协议

3、socket.socket()函数中有一个参数socket_type,该参数有什么作用,参数取值都有哪些?

参考:《Python核心编程》(第三版)

答:

        socket_type参数叫做套接字类型,用于区分当前套接字属于面向连接或是无连接哪种套接字,其中为了创建 TCP 套接字,必须使用 SOCK_STREAM 作为套接字类型。创建UDP套接字,必须使用SOCK_DGRAM作为套接字类型。

4、请简述套接字常见方法。

参考:《Python核心编程》(第三版)

答:

 

5、socket()中的close方法有什么作用?

参考:《Python核心编程》(第三版)

答:

        一旦进入服务器的无限循环之中,我们就(被动地)等待客户端的连接。当一个连接请求出现时,我们进入对话循环中,在该循环中我们等待客户端发送的消息。一般来说上述循环不会跳出,因此close()永远不会被执行,它只是用来提醒读者,如果写了一个处理程序来考虑一个更加优雅的退出方式,正如前面讨论的,那么应该调用close()方法。

6、如何优雅地退出和调用服务器close()方法?

参考:《Python核心编程》(第三版)

答:

        在开发中,创建这种“友好的”退出方式的一种方法就是,将服务器的while循环放在一个try-except语句中的except子句中,并监控EOFError或KeyboardInterrupt异常,这样你就可以在except或finally字句中关闭服务器的套接字。在生产环境中,你将想要能够以一种更加自动化的方式启动和关闭服务器。在这些情况下,需要通过使用一个线程或创建一个特殊文件或数据库条目来设置一个标记以关闭服务。

7、除了socket.socket()函数意外,socket模块还提供了哪些用于网络应用开发的属性?

参考:《Python核心编程》(第三版)

答:

8、SocketServer是标准库中的一个高级模块,他的作用有哪些?

参考:《Python核心编程》(第三版)

答:

        SocketServer(Python 3.x中重命名为socketserver),它的目标是简化很多样板代码,它们是创建网络客户端和服务器所必需的代码。

9、SocketServer提供了哪些常用类?

参考:《Python核心编程》(第三版)

答:

10、SocketServer 请求处理程序的默认行为是什么?

参考:《Python核心编程》(第三版)

答:

        SocketServer 请求处理程序的默认行为是接受连接、获取请求,然后关闭连接。由于这个原因,我们不能在应用程序整个执行过程中都保持连接,因此每次向服务器发送消息时,都需要创建一个新的套接字。这种行为使得TCP服务器更像是一个UDP服务器。然而,通过重写请求处理类中适当的方法就可以改变它。

11、Twisted作为一个完整的事件驱动的网络框架应用场景有哪些?

参考:《Python核心编程》(第三版)

答:

        Twisted既能使用也能开发完整的异步网络应用程序和协议。它提供了大量的支持来建立完整的系统,包括网络协议、线程、安全性和身份验证、聊天/ IM、DBM及RDBMS数据库集成、Web/因特网、电子邮件、命令行参数、GUI集成工具包等。

12、select模块在配合socket模块使用时有哪些作用?

参考:《Python核心编程》(第三版)

答:

        select模块提供了select()函数,该函数管理套接字对象集合。它所做的最有用的一个事情就是接收一套套接字,并监听它们活动的连接。select()函数将会阻塞,直到至少有一个套接字已经为通信做好准备,而当其发生时,它将提供一组准备好读信息的集合(它还可以确定哪些套接字准备好写入,虽然它不像前一种操作那么常见)。

13、在创建服务器方面,async*和SocketServer模块应用场景有哪些?

参考:《Python核心编程》(第三版)

答:

        在创建服务器方面,async*和SocketServer模块都提供更高级的功能。它们以socket和/或select模块为基础编写,能够使客户端/服务器系统开发更加迅速,因为它们已经自动处理了所有的底层代码。你需要做的所有工作就是以自己的方式创建或继承适当的基类。正如前面所提到的,SocketServer 甚至提供了将线程或新进程集成到服务器的功能,它提供了一个更像并行处理的客户端请求的流程。

14、请简洁的解释什么是Concurrence 。

参考:《Python核心编程》(第三版)

答:

        Concurrence 是一个更现代化的网络框架,它是荷兰社交网络 Hyves 的后台引擎。Concurrence是一个搭配了libevent的高性能I/O系统,libevent是一个低级事件回调调度系统。Concurrence是一个异步模型,它使用轻量级线程(执行回调)以事件驱动的方式进行线程间通信和消息传递工作。

15、套接字。TCP和UDP之中,哪种类型的服务器接受连接,并将它们转换到独立的套接字进行客户端通信?

参考:《Python核心编程》(第三版)

答:

        TCP

1、使用多线程以及类似Queue的共享数据结构的时候可以规划成几个执行特定函数的线程?

参考:《Python核心编程》(第3版)

答:

        UserRequestThread

        RequestProcessor

        ReplyThread

2、接问题1,每个线程有什么作用?

参考:《Python核心编程》(第3版)

答:

        UserRequestThread:负责读取客户端输入,该输入可能来自 I/O 通道。程序将创建多个线程,每个客户端一个,客户端的请求将会被放入队列中。

        RequestProcessor:该线程负责从队列中获取请求并进行处理,为第3个线程提供输出。

        ReplyThread:负责向用户输出,将结果传回给用户(如果是网络应用),或者把数据写到本地文件系统或数据库中。

3、在多线程环境中,Python代码的执行原理是什么?

参考:《Python核心编程》(第3版)

答:

        Python代码的执行是由Python虚拟机(又名解释器主循环)进行控制的。Python在设计时是这样考虑的,在主循环中同时只能有一个控制线程在执行,就像单核 CPU系统中的多进程一样。内存中可以有许多程序,但是在任意给定时刻只能有一个程序在运行。同理,尽管 Python 解释器中可以运行多个线程,但是在任意给定时刻只有一个线程会被解释器执行。

4、接问题3,Python虚拟机按照哪种方式执行?

参考:《Python核心编程》(第3版)

答:

        对Python虚拟机的访问是由全局解释器锁(GIL)控制的。这个锁就是用来保证同时只能有一个线程运行的。在多线程环境中,Python虚拟机将按照下面所述的方式执行。

        1.设置GIL。

        2.切换进一个线程去运行。

        3.执行下面操作之一。

                a.指定数量的字节码指令。

                b.线程主动让出控制权(可以调用time.sleep(0)来完成)。

        4.把线程设置回睡眠状态(切换出线程)。

        5.解锁GIL。

        6.重复上述步骤。

5、Python提供了哪些模块用来支持多线程编程?

参考:《Python核心编程》(第3版)

答:

        Python提供了thread、threading和Queue模块等;

        程序是可以使用thread和threading模块来创建与管理线程。thread模块提供了基本的线程和锁定支持;而threading模块提供了更高级别、功能更全面的线程管理。使用Queue模块,用户可以创建一个队列数据结构,用于在多线程之间进行共享。我们将分别来查看这几个模块,并给出几个例子和中等规模的应用。

6、请简述thread与threading模块的使用选择以及使用场景。

参考:《Python核心编程》(第3版)

答:

        推荐使用更高级别的threading模块,而不使用thread模块;

        threading模块更加先进,有更好的线程支持,并且thread模块中的一些属性会和threading模块有冲突。另一个原因是低级别的 thread 模块拥有的同步原语很少(实际上只有一个),而threading模块则有很多。避免使用 thread 模块的另一个原因是它对于进程何时退出没有控制。当主线程结束时,所有其他线程也都强制结束,不会发出警告或者进行适当的清理。如前所述,至少threading模块能确保重要的子线程在进程退出前结束。

        我们只建议那些想访问线程的更底层级别的专家使用thread模块。为了强调这一点,在Python3中该模块被重命名为_thread。你创建的任何多线程应用都应该使用threading模块或其他更高级别的模块。

7、thread模块提供了哪些常用的线程函数以及LockType锁对象的方法?

参考:《Python核心编程》(第3版)

答:

8、 简述threading模块提供了哪些类与可用的对象。

参考:《Python核心编程》(第3版)

 

9、 threading模块是如何避免thread模块所产生的“当主线程退出时,所有子线程都将终止,不管它们是否仍在工作”的情况的?

参考:《Python核心编程》(第3版)

答:

        threading 模块支持守护线程,其工作方式是:守护线程一般是一个等待客户端请求服务的服务器。如果没有客户端请求,守护线程就是空闲的。如果把一个线程设置为守护线程,就表示这个线程是不重要的,进程退出时不需要等待这个线程执行完成。服务器线程远行在一个无限循环里,并且在正常情况下不会退出。

10、threading模块是如何将一个线程设置为守护线程的?

参考:《Python核心编程》(第3版)

答:

        要将一个线程设置为守护线程,需要在启动线程之前执行如下赋值语句:thread.daemon = True(调用thread.setDaemon(True)的旧方法已经弃用了)。同样,要检查线程的守护状态,也只需要检查这个值即可(对比过去调用 thread.isDaemon()的方法)。一个新的子线程会继承父线程的守护标记。整个Python程序(可以解读为:主线程)将在所有非守护线程退出之后才退出,换句话说,就是没有剩下存活的非守护线程时。

11、threading模块中的thread类主要包含了哪些属性和方法?

参考:《Python核心编程》(第3版)

答:

12、使用Thread类,可以有哪些方法来创建线程?

参考:《Python核心编程》(第3版)

答:

        创建Thread的实例,传给它一个函数。

        创建Thread的实例,传给它一个可调用的类实例。

        派生Thread的子类,并创建子类的实例。

13、锁有哪几种状态?他们的行为有哪些?

参考:《Python核心编程》(第3版)

答:

        锁有两种状态:锁定和未锁定。而且它也只支持两个函数:获得锁和释放锁。

        当多线程争夺锁时,允许第一个获得锁的线程进入临界区,并执行代码。所有之后到达的线程将被阻塞,直到第一个线程执行结束,退出临界区,并释放锁。此时,其他等待的线程可以获得锁并进入临界区。不过请记住,那些被阻塞的线程是没有顺序的(即不是先到先执行),胜出线程的选择是不确定的,而且还会根据Python实现的不同而有所区别。

14、Queue/queue模块常用的属性都有哪些?

参考:《Python核心编程》(第3版)

答:

15、除了thread、threading以及Queue模块,与线程相关的标准库模块还有哪些?

参考:《Python核心编程》(第3版)

答:

1、Web客户端与服务器端交互使用的特定语言/协议是什么?

参考:《Python核心编程》(第三版)

答:

        HTTP(HyperText Transfer Protocol,超文本传输)。HTTP是TCP/IP的上层协议,这意味着HTTP协议依靠TCP/IP来进行低层的交流工作。它的职责不是发送或者递消息(TCP/IP协议处理这些),而是通过发送、接受HTTP消息来处理客户端的请求。

2、HTTP协议是有状态协议还是无状态协议?具体表现如何?

参考:《Python核心编程》(第三版)

答:

        HTTP 属于无状态协议,因为其不跟踪从一个客户端到另一个客户端的请求信息,这点很像现在使用的客户端/服务器架构。服务器持续运行,但是客户端的活动以单个事件划分的,一旦完成一个客户请求,这个服务事件就停止了。客户端可以随时发送新的请求,但是新的请求会处理成独立的服务请求。由于每个请求缺乏上下文,因此你可能注意到有些 URL 中含有很长的变量和值,这些将作为请求的一部分,以提供一些状态信息。另一种方式是使用“cookie”,即保存在客户端的客户状态信息。

3、在因特网上传输的数据当中,其中一部分会比较敏感。而在传输过程中,默认没有加密服务。在这种情况下,如何确保信息传输安全?

参考:《Python核心编程》(第三版)

答:

        为了对传输数据进行加密,需要在普通的套接字上添加一个额外的安全层,称为安全套接字层(Secure SocketLayer,SSL),用来创建一个套接字,加密通过该套接字传输的数据。开发者可以决定是否使用这个额外的安全层。

4、Python中的urllib模块有什么作用?

参考:《Python核心编程》(第三版)

答:

        使用urllib模块下载或者访问Web上信息的应用程序(使用urllib.urlopen()或者urllib.urlre trieve())就是简单的Web客户端。其所要做的只是为程序提供一个有效的Web地址。

5、一个完整的URL中都包含有哪些组件?

参考:《Python核心编程》(第三版)

答:

6、一个完整的URL格式是什么样子?

参考:《Python核心编程》(第三版)

答:

6、URL的组件:net_loc都包含有哪些关键参数/信息?

参考:《Python核心编程》(第三版)

答:

7、 net_loc组件的字符串格式是什么样子?

参考:《Python核心编程》(第三版)

答:

        user:passwd@host:port

        在这4个组件中,host名是最重要的。port号只有在Web服务器运行其他非默认端口号上时才会使用(如果不确定所使用的端口号,可以参见第2章)。用户名和密码只有在使用FTP连接时候才有可能用到,而即便使用FTP,大多数的连接都是匿名的,这时不需要用户名和密码。Python 支持两种不同的模块,两者分别以不同的功能和兼容性来处理 URL。一种是urlparse,另一种是urllib。

8、urlpasrse 模块提供了哪些用于处理 URL 字符串的基本功能?

参考:《Python核心编程》(第三版)

答:

        urlparse()、urlunparse()和urljoin()。

9、urlpasrse和urlunparse()有什么作用?

参考:《Python核心编程》(第三版)

答:

        urlparse()将URL字符串拆分成前面描述的一些主要组件。其语法结构如下。

        urlparse (urlstr, defProtSch=None, allowFrag=None)

        urlparse()将urlstr解析成一个6元组(prot_sch,net_loc,path,params,query,frag)。前面已经描述了这里的每个组件。如果urlstr中没有提供默认的网络协议或下载方案,defProtSch会指定一个默认的网络协议。allowFrag标识一个URL是否允许使用片段。下边是一个给定URL经urlparse()后的输出。

        urlparse.urlunparse()

        urlunparse()的功能与urlpase()完全相反,其将经urlparse()处理的URL生成urltup这个6元组(prot_sch, net_loc, path, params, query, frag),拼接成URL并返回。因此可以用如下方式表示其等价性:

        urlunparse(urlparse(urlstr)) ≡ urlstr

10、urlparse.urljoin()有什么作用?

参考:《Python核心编程》(第三版)

答:

        在需要处理多个相关的URL时我们就需要使用urljoin()的功能了,例如,一个Web页中可能会产生一系列页面URL。urljoin()的语法是如下。

        urljoin (baseurl, newurl, allowFrag=None)

        urljoin()取得根域名,并将其根路径(net_loc 及其前面的完整路径,但是不包括末端的文件)与newurl连接起来。

11、urllib.urlopen()都包含有哪些文件类型对象的方法?

参考:《Python核心编程》(第三版)

答:

12、 urllib模块中的核心函数都有哪些?

参考:《Python核心编程》(第三版)

答:

13、urllib模块通过什么来支持开放的HTTP连接?

参考:《Python核心编程》(第三版)

答:

        urllib模块通过安全套接字层(SSL)支持开放的HTTP连接(socket模块的核心变化是增加并实现了SSL)。httplib模块支持使用“https”连接方案的URL。除了那两个模块以外,其他支持SSL的模块还有imaplib、poplib和smtplib。

14、HTMLParse 模块中的HTMLParse类有哪些作用?

参考:《Python核心编程》(第三版)

答:

        HTMLParser.HTMLParser用于替换htmllib.HTMLParser。因为前者更简单,可以从更底层的视角观察页面,且可以处理XHTML。而后者比较老,且基于sgmllib模块(意味着必须理解复杂的标准通用标记语言(Standard Generalized Markup Language,SGML),因此也更加复杂。

15、python中常用的Web服务器模块和类都有哪些?

参考:《Python核心编程》(第三版)

答:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值