购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

| 第2章 |

Python语法面试题

问答2-1:Python是什么?

问答2-2:Pythonista是什么?

问答2-3:请简述Python的优点。

问答2-4:请简述Python的特色。

问答2-5:PEP 8是什么?

问答2-6:Pythonic是什么?

问答2-7:请简述静态语言(static language)和动态语言(dynamic language)。

问答2-8:何谓文字码语言(scripting language)?Python是不是属于文字码语言?

问答2-9:请说明PYTHONPATH环境变量功能。

问答2-10:请说明PYTHONSTARTUP环境变量功能。

问答2-11:请说明PYTHONCASEOK环境变量功能。

问答2-12:请说明PYTHONHOME环境变量功能。

问答2-13:请说明.py和.pyc文件的差异。

问答2-14:在Python的程序设计中,有哪些工具可以协助找寻错误(bug)?

问答2-15:Python如何管理内存空间?

问答2-16:变量名称前有单下画线,例如_test,请说明适用时机。

问答2-17:变量名称后有单下画线,例如dict_,请说明适用时机。

问答2-18:变量名称前后有双下画线,例如__test__,请说明适用时机。

问答2-19:变量名称前有双下画线,例如__test,请说明适用时机。

问答2-20:在IDLE环境使用Python时,单下画线有何特别意义?

问答2-21:请说明//的用法。

问答2-22:请说明Python的注释使用方式。

问答2-23:简述列表(list)与元组(tuple)的区别。

问答2-24:Python提供哪些内建可变(mutable)和不可变(immutable)的数据结构?

问答2-25:Python提供哪些数值(number)的数据?

问答2-26:请列出Python内建的容器数据形态。

问答2-27:请列出Python序列(sequence)的数据类型。

问答2-28:请列出Python映射(mapping)数据类型。

问答2-29:Python的名称空间(namespace)是指什么?

问答2-30:请说明如何获得变量的地址。

问答2-31:Python是否会区分大小写?

问答2-32:Python的数据形态转换是什么?请列出所有的数据形态转换函数。

问答2-33:有一个数学运算的字符串‘5×9+4’,应如何转换成计算结果并打印?

问答2-34:请说明Python的help( )和dir( )。

问答2-35:列出整数的方法。

问答2-36:列出列表的方法。

问答2-37:请说明int(‘5.5’)和int (5.5) 的执行结果。

问答2-38:使用一行指令,执行x、y值对调。

问答2-39:有一个字符串s = ‘abc is abc’,请使用一行指令将字符串s改为‘xyz is xyz’。

问答2-40:请说明何谓转义字符(escape character)。

问答2-41:请说明字符串前面加上r与b的功能。

问答2-42:请说明编码(encode)与译码(decode)。

问答2-43:请说明find( )和rfind( )的差异。

问答2-44:请说明index( )和rindex( )的差异。

问答2-45:请说明循环的continue和break运作方式。

问答2-46:有2个数字x、y,不可以使用max( )函数,请使用一行指令,可以得到最大值。

问答2-47:请说明列表(list)正索引与负索引的用法。

问答2-48:什么是切片(slicing)?

问答2-49:切片的应用。

问答2-50:请说明列表(list)中append( )和extend( )方法的区别。

问答2-51:请说明浅拷贝copy( )和深拷贝deepcopy( ) 应用在不可变数据的差异。

问答2-52:请说明浅拷贝copy( )和深拷贝deepcopy( )应用在可变数据的差异。

问答2-53:如何设定字符串的第1个字母是大写?

问答2-54:如何将字符串全部改成小写?

问答2-55:请问应该如何去掉字符串头尾空格?

问答2-56:请说明split( )方法。

问答2-57:请说明is的用法。

问答2-58:回答片段指令的输出结果。

问答2-59:请说明not的用法。

问答2-60:请说明in的用法。

问答2-61:什么是列表打包(packing)?

问答2-62:什么是元组(或列表)解包(unpacking)?

问答2-63:什么是可迭代对象?

问答2-64:请说明divmod(x,y)的用法,它的回传值数据形态如何?

问答2-65:请问如何将B字典元素合并到A字典内。

问答2-66:如何合并和删除字典?

问答2-67:请列出所有被列为逻辑值False的情况。

问答2-68:请说明any( )和all( )的区别。

问答2-69:Python的pass是什么?

问答2-70:什么是pickling和unpickling?

问答2-71:请简述redis和mysql的差异。

问答2-72:请说明AttributeError、ZeroDivisionError等错误原因。

面试实例ch2_1.py:转义字符的应用。

面试实例ch2_2.py:字符串前加上r的应用。

面试实例ch2_3.py:Unicode字符串与utf-8格式bytes数据的转换。

面试实例ch2_4.py:了解字符串的数据形态与内容。

面试实例ch2_5.py:find( )和rfind( )的说明。

面试实例ch2_6.py:列出段落内某一个字符串出现的次数。

面试实例ch2_7.py:删除字符串内的空格,使用replace( )。

面试实例ch2_8.py:删除字符串内的空格,使用split( )和join( )。

面试实例ch2_9.py:请说明数组和列表的差异。

面试实例ch2_10.py:索引实例解说。

面试实例ch2_11.py:切片应用。

面试实例ch2_12.py:说明append( )的用法。

面试实例ch2_13.py:说明extend( )的用法。

面试实例ch2_14.py:赋值(=)运算取代extend( )的应用。

面试实例ch2_15.py:浅拷贝、深拷贝与赋值(=)内存位置的观察。

面试实例ch2_16.py:将两种不同类型的字符串转成列表。

面试实例ch2_17.py:请说明join( )方法。

面试实例ch2_18.py:请说明sort( )和sorted( )的区别。

面试实例ch2_19.py:列表打包,然后打印结果。

面试实例ch2_20.py:enumerate( )打包的应用。

面试实例ch2_21.py:使用zip( )将列表打包,然后使用for … in解包。

面试实例ch2_22.py:使用enumerate将列表打包,然后使用for … in解包。

面试实例ch2_23.py:请用文字说明zip( )的用法,同时用程序解说。

面试实例ch2_24.py:请用文字说明enumerate对象,同时用程序解说。

面试实例ch2_25.py:什么是生成器(generators)?请举例说明。

面试实例ch2_26.py:divmod( )的应用。

面试实例ch2_27.py:取得此字典的键(key)。

面试实例ch2_28.py:取得此字典的值(value)。

面试实例ch2_29.py:取得此字典的键:值(key:value)的元组。

面试实例ch2_30.py:将fruits2字典元素整合到fruits1字典内。

程序实例ch2_31.py:使用del分别删除字典元素与字典。

面试实例ch2_32.py:删除字典的元素。

面试实例ch2_33.py:用不同数据调用函数3次。

面试实例ch2_34.py:列表转成字典应用1。

面试实例ch2_35.py:列表转成字典应用2。

面试实例ch2_36.py:元组转成字典应用。

面试实例ch2_37.py:客户数据的整理。

面试实例ch2_38.py:不使用集合的方法处理交集问题。

面试实例ch2_39.py:any( )方法的应用。

也许读者已经很熟悉Python语言,可以使用Python设计各类问题,但你熟悉的可能只是片面的知识。在面试时更着重考查对语言的全盘掌握,读者可由本章考题对Python语言概念进行全盘了解。

问答2-1:Python是什么?

解答:

Python是一种开放原始码(open source)、直译式(interpreted language)、可携式(portable)、面向对象的程序语言(object oriented programming language),具有模块(module)、多线程(threads)、异常处理(exceptions)以及自动内存管理功能(automatic memory management)。

问答2-2:Pythonista是什么?

解答:

Python资深工程师。

问答2-3:请简述Python的优点。

解答:

Python的优点是开放原始码(open source),任何人皆可以免费使用,许多人或单位为此建立模块免费供所有人使用,它方便、好用,内建数据结构,可以跨平台使用。

问答2-4:请简述Python的特色。

解答:

(1)Python是直译语言,所编写的程序代码执行前不用经过编译(compile)过程。

(2)Python是动态语言,所有变量使用前不需要宣告,例如下列是合法变量定义。

     x = 10
     x = 'Python'

(3)Python是一个面向对象的程序语言,语法本身有类(class)、继承(inheritance)、封装(encapsulation)等面向对象的概念与特色。

(4)Python是一个跨平台的程序语言。例如,在Windows操作系统下所设计的程序可以在Mac OS或Linux环境下执行。

(5)Python是一个多功能的程序语言,应用范围很广,如网站开发、数据科学、防黑客攻击、人工智能等。

问答2-5:PEP 8是什么?

解答:

PEP的全名是Python Enhancement Proposals,其中编号8是指程序设计风格,其内容包含一系列程序代码写作建议,主要目的是讲解如何设计更具可读性的程序。

问答2-6:Pythonic是什么?

解答:

表示所设计的Python程序是依照PEP 8的规范撰写,程序具有可读性。

问答2-7:请简述静态语言(static language)和动态语言(dynamic language)的差异,同时各列举3种语言,最后请告知Python是属于哪一种程序语言。

解答:

(1)静态语言(static language):有些程序语言的变量在使用前需要先宣告它的数据形态,这样编译程序(compile)可以在内存预留空间给这个变量。这个变量的数据形态经过宣告后,未来无法再改变,这类程序语言称为静态语言(static language),例如C、C++、Java。

(2)动态语言(dynamic language):有些程序语言的变量在使用前不必宣告它的数据形态,这样可以用比较少的程序代码完成更多工作,增加程序设计的便利性,这类程序在执行前不必经过编译(compile)过程,而是使用直译器(interpreter)直接直译(interpret)与执行(execute),这类程序语言称为动态语言(dynamic language),例如Python、Perl、Ruby。

Python是动态语言。

问答2-8:何谓文字码语言(scripting language)?Python是不是属于文字码语言?

解答:

有些程序语言的变量在使用前不必宣告它的数据形态,这样可以用比较少的程序代码完成更多工作,增加程序设计的便利性,这类程序在执行前不必经过编译(compile)过程,而是使用直译器(interpreter)直接直译(interpret)与执行(execute),这类的程序语言称为动态语言(dynamic language),动态语言也可以称作文字码语言(script language)。

Python是文字码语言(script language)。

问答2-9:请说明PYTHONPATH环境变量功能。

解答:

当启动Python直译器时,系统会自行建立一个PYTHONPATH路径列表,这个路径列表元素是各种未来可以import模块的路径。可以使用下列方式列出路径内容。

从中可以看到笔者计算机所列出的sys.path内容,当我们导入模块时,Python会依上述顺序往下搜寻所导入的模块,当找到第一个时就会导入。上述sys.path第0个元素是D:\Python interview\ch2,这是笔者所设计模块的目录,如果笔者不小心设计了相同系统模块,例如time,同时它的搜寻路径在标准Python链接库的模块路径前面,程序将无法存取标准链接库的模块。

问答2-10:请说明PYTHONSTARTUP环境变量功能。

解答:

当启动Python后,系统会找寻PYTHONSTARTUP的环境变量,然后执行此变量的文件。

问答2-11:请说明PYTHONCASEOK环境变量功能。

解答:

PYTHONCASEOK环境变量是在Windows中指示Python未来使用import导入模块时,可以找寻第1个不区分大小写的匹配项目。

问答2-12:请说明PYTHONHOME环境变量功能。

解答:

这是替代模块搜寻路径,通常嵌入在PYTHONSTARTUP和PYTHONPATH目录中,可以让模块库切换变得容易。

问答2-13:请说明.py和.pyc文件的差异。

解答:

.py文件是Python的原始程序文件,Python在执行.py文件时会将.py文件程序编码编译成.pyc文件,这样可以加快下次的执行。当我们在执行.py文件时,Python会先看有没有这个.py文件的.pyc文件,如果有会直接读此.pyc文件,否则就读取原先的.py文件。

不过执行一般的.py文件不会产生.pyc文件,只有import的.py文件才会产生.pyc文件。这个文件是存放在目前工作文件夹的__pycache__内。

问答2-14:在Python的程序设计中,有哪些工具可以协助找寻错误(bug)?

解答:

PyChecker或是Pylint。

PyChecker是Python程序代码的静态分析工具,可以找出程序的错误,同时对程序的复杂度和格式发出警告。

Pylint是高阶的Python程序代码分析工具,可以找出程序代码的错误,同时如果所设计的程序代码不符合PEP 8的标准也会被标示出来。

问答2-15:Python如何管理内存空间?

解答:

Python使用私有堆积(heap)空间管理内存,所有Python对象和数据结构是在此空间存放,程序设计师无法存取此区间数据,该空间是由直译器(interpreter)操作。

有关Python对象的内存空间配置是由Python内存管理程序(memory manager)处理。

Python具有垃圾回收(garbage collection)功能,所谓的垃圾回收是指程序执行时,直译程序会定时主动收回不再需要的存储空间,将内存集中管理。这种机制可以减轻程序设计师的负担,当然也就减少了程序设计师犯错的机会。

问答2-16:变量名称前有单下画线,例如_test,请说明适用时机。

解答:

这是一种私有变量、函数或方法,在测试中或一般应用在不想直接被调用的方法可以使用单下画线开头的变量。

问答2-17:变量名称后有单下画线,例如dict_,请说明适用时机。

解答:

这种命名方式主要是避免与Python的关键词(built-in keywords)或内建函数(built-in functions)有相同的名称,例如max是求较大值函数、min是求较小值函数,如果我们真的想建立max或min变量,可以将变量命名为max_或min_。

问答2-18:变量名称前后有双下画线,例如__test__,请说明适用时机。

解答:

这是保留给Python内建(built-in)的变量(variables)或方法(methods)使用。

问答2-19:变量名称前有双下画线,例如__test,请说明适用时机。

解答:

这也是私有方法或变量的命名,无法直接使用本名存取。

问答2-20:在IDLE环境使用Python时,单下画线有何特别意义?

解答:

代表前一个结果值。

问答2-21:请说明//的用法,有一道指令如下,请说明执行结果。

     x = 7.0 // 2.0
     print(x)

解答:

这是除法运算只保留整数,结果是3.0。

问答2-22:请说明Python的注释使用方式。

解答:

可以使用#字符,#符号后的叙述皆是注释。

另一种是使用docstrings当作注释,所谓docstrings是指3个单引号'''或双引号"""包含的内容。

问答2-23:简述列表(list)与元组(tuple)的区别,请以start_list、start_tuple为变量名称,为下列3个元素分别建立列表与元组。

     'James'、20、2000?

解答:

列表(list)的特点如下:

(1)元素是可变(mutable)的,可以编辑元素内容。

(2)速度比元组慢。

实例如下:

     start_list = ['James',20,2000]

元组(tuple)的特点如下:

(1)元素是不可变(immutable)的,不可以编辑元素内容。

(2)速度比列表快。

实例如下:

     start_tuple = ('James',20,2000)

问答2-24:Python提供哪些内建可变(mutable)和不可变(immutable)的数据结构?

解答:

Python内建可变(mutable)和不可变(immutable)数据结构分别如下:

可变数据结构:列表(list)、字典(dict)、集合(set)。

不可变数据结构:元组(tuple)、字符串(string)、数字(number)。

问答2-25:Python提供哪些数值(number)的数据?

解答:

整数(int);

浮点数(float);

复数(complex number);

布尔值(boolean)。

问答2-26:请列出Python内建的容器数据形态。

解答:

列表(list);

元组(tuple);

字典(dict);

集合(set)。

问答2-27:请列出Python序列(sequence)的数据类型。

解答:

列表(list);

元组(tuple);

字符串(str);

bytes数据(bytes)。

问答2-28:请列出Python映射(mapping)数据类型。

解答:

字典(dict)。

问答2-29:Python的名称空间(namespace)是指什么?

解答:

这是一个Python的名称系统(naming system),可以确保变量名称是唯一的,不会有冲突(conflicts)。

问答2-30:请说明如何获得变量的地址。

解答:

使用id( )。

问答2-31:Python是否会区分大小写?

解答:

是,例如:ABC、Abc、abc会被视为3个变量。

问答2-32:Python的数据形态转换是什么?请列出所有的数据形态转换函数。

解答:

所谓的数据形态转换是将一种数据强制转换成另一种数据格式。

int( ):可以将数据转换成整数。

float( ):可以将数据转换成浮点数(float)。

bin( ):可以将数据转换成二进制整数。

oct( ):可以将数据转换成八进制整数。

hex( ):可以将数据转换成十六进制整数。

ord( ):可以回传字符的Unicode码值。

list( ):可以将数据转换成列表。

tuple( ):可以将数据转换成元组。

dict( ):可以将数据转换成字典。

set( ):可以将数据转换成集合。

complex( ):可以将数据转换成复数。

问答2-33:有一个数学运算的字符串‘5×9+4’,应如何转换成计算结果并打印?

解答:

     print(eval('5*9+4'))

实例 :使用eval( )计算数学表达式的字符串。

问答2-34:请说明Python的help( )和dir( )。

解答:

help( ):可以列出各种内建函数、模块或模块内方法的使用说明。

dir( ):可以列出对象的方法。

实例1 :使用help( )列出print的使用说明。

实例2 :使用help( )列出format的使用说明。

实例3 :使用help( )列出‘sys’模块的使用说明,下列列出部分说明。

实例4 :使用dir( )列出字符串对象的方法。

实例5 :使用help( )列出字符串对象find( )函数的使用方法。

问答2-35:列出整数的方法。

解答:

问答2-36:列出列表的方法。

解答:

问答2-37:请说明int(‘5.5’)和int(5.5)的执行结果。

解答:

int(‘5.5’)出现错误。

int(5.5)输出5。

实例

问答2-38:使用一行指令,执行x、y值对调。

解答:

     x,y = y,x

实例 :验证执行x、y值对调的结果。

问答2-39:有一个字符串s =‘abc is abc’,请使用一行指令将字符串s改为‘xyz is xyz’。

解答:

     s.replace(abc,xyz)

实例 :验证字符串修改。

问答2-40:请说明何谓转义字符(escape character)。

解答:

在字符串使用中,如果字符串内有一些特殊字符,例如单引号、双引号等,必须在此特殊字符前加上“\”(反斜杠),才可正常使用,这种含有“\”符号的字符称转义字符。

相关的程序解说,请参考面试实例ch2_1.py。

问答2-41:请说明字符串前面加上r与b的功能。

解答:

在使用Python时,如果在字符串前加上r,可以防止转义字符被转义,相当于可以取消转义字符的功能。

字符串前加上b,这是bytes数据格式。

相关的程序解说,请参考面试实例ch2_2.py。

问答2-42:请说明编码(encode)与译码(decode)。

解答:

将字符串转成bytes数据称为编码(encode),所使用的是encode( )。

将bytes数据转成字符串称为译码,所使用的是decode( )。

相关的程序解说,请参考面试实例ch2_3.py。

问答2-43:请说明find( )和rfind( )的差异。

解答:

find( )方法可以执行字符串搜寻,如果搜寻到字符串会回传字符串的索引位置,如果没有找到则回传-1。

index是搜寻到时回传的索引值,start和end代表可以被搜寻字符串的区间,若是省略表示全部搜寻,如果没有找到则回传-1给index。

rfind( )方法可以搜寻特定子字符串最后一次出现的位置,它的语法如下:

index是搜寻到时回传的索引值,start和end代表可以被搜寻字符串的区间,若是省略表示全部搜寻,如果没有找到则回传-1给index。

相关的程序解说,请参考面试实例ch2_5.py。

问答2-44:请说明index( )和rindex( )的差异。

解答:

index( )方法可以应用在列表,也可以应用在字符串,index( )可以回传搜寻字符串的索引。rindex( )则只能应用在字符串,可以回传搜寻字符串最后一次出现的索引位置。

实例1 :验证index( )与rindex( )正确情况。

实例2 :说明index( )与rindex( )错误情况。

问答2-45:请说明循环的continue和break运作方式。

解答:

continue:在循环中,当满足特定条件时,程序不再往下执行,将控制权转移到循环开始处。

break:在循环中,当满足特定条件时,循环将中止,将控制权转移到循环区块后面的指令。

问答2-46:有2个数字x、y,不可以使用max( )函数,请使用一行指令,可以得到最大值。

解答:

     max_ = x if x > y else y

实例

问答2-47:请说明列表(list)正索引与负索引的用法,例如:有一个列表内容如下:

     x = [0,1,2,3,4,5,6,7,8,9]

请说明x[-1]、x[-3]、x[-5]可以得到什么结果。

解答:

对于正索引而言,索引0是第1个元素,索引1是第2个元素,其他依此类推。对于负索引而言,索引-1是倒数第1个元素,索引-2是倒数第2个元素,其他依此类推。

     x[-1]是9。
     x[-3]是7。
     x[-5]是5。

相关的程序解说,请参考面试实例ch2_10.py。

问答2-48:什么是切片(slicing)?Python常见的数据结构有字符串(string)、列表(list)、元组(tuple)、字典(dict)、集合(set),请说明哪些数据结构可以使用切片功能?

解答:

在设计程序时,常会需要取得前几个元素、后几个元素、某区间元素或是依照一定规则排序的元素,这个概念称为切片。

字符串、列表、元组可以使用切片功能。

问答2-49:有一个列表内容如下:

     x = [0,1,2,3,4,5,6,7,8,9]

当n=3时,请列出x[1,n]、x[:n]、x[:-n]、x[n:]、x[-n]、x[:]和x[::-1]的结果。

解答:

x[1:n]:取得列表索引1到索引n,此例是取[1:3],结果为[1,2]。

x[:n]:取得列表前n名,此例是取[:3],结果为[0,1,2]。

x [:-n]:取得列表不含最后n名,此例是[:-3],结果为[0,1,2,3,4,5,6]。

x [n:]:取得列表索引n到最后,此例是[3:],结果为[3,4,5,6,7,8,9]。

x [-n:]:取得列表后n名,此例是[-3:],结果为[7,8,9]。

x [:]:取得所有元素,结果为[0,1,2,3,4,5,6,7,8,9]。

x[::-1]:内容反转,结果为[9,8,7,6,5,4,3,2,1,0]。

相关的程序解说,请参考面试实例ch2_11.py。

问答2-50:请说明列表(list)中append( )和extend( )方法的区别。

解答:

append( ):假设加入的是元素,可以将元素加在列表末端。假设加入的是列表,则所加入的列表将变成元素存在新的列表。语法如下:

     x.append(data)  # 将data元素加在x列表内
     x.append(y)     # 假设y是列表,y将变成x的末端元素

extend( ):只适合加入的是列表,可以将一个列表当作元素加在列表末端。

相关的程序解说,请参考面试实例ch2_12.py和ch2_13.py。

问答2-51:请说明浅拷贝copy( )和深拷贝deepcopy( )应用在不可变数据(如数值、字符串)的差异。

对于不可变数据而言,浅拷贝、深拷贝与赋值(=)概念相同,变量具有相同地址,所以某一个数据更改,所有变量数据也会更改。

相关的程序解说,请参考面试实例ch2_15.py。

问答2-52:请说明浅拷贝copy( )和深拷贝deepcopy( )应用在可变数据(如列表)的差异。

解答:

浅拷贝

假设b=a.copy( ),a和b是独立的对象,但是它们的子对象元素是指向同一对象,也就是对象的子对象会连动。

实例1 :浅拷贝的应用,a增加元素观察结果。

实例2 :浅拷贝的应用,a的子对象增加元素观察结果。

从上述执行结果可以发现a的子对象因为指向同一地址,所以同时增加7。

深拷贝

假设b=deepcopy(a),a和b以及其子对象皆是独立的对象,所以未来不受干扰,使用前需要import copy模块,这是引用外部模块,未来会讲更多相关的应用。

实例3 :深拷贝的应用,并观察执行结果。

由上述可以得到b完全不会受到a影响,深拷贝是得到完全独立的对象。

问答2-53:如何设定字符串的第1个字母是大写?

解答:

字符串函数title( )可以设定字符串第1个字母是大写。

问答2-54:如何将字符串全部改成小写?

解答:

字符串函数lower( )可以设定字符串全部改成小写。

问答2-55:有一个字符串如下:

     string = '  Python  '

请问应该如何去掉头尾空格?

解答:

可以使用strip( )方法。

问答2-56:请说明split( )方法。

解答:

这个方法可以将字符串以空格或其他符号为分隔符,将字符串拆开,变成一个列表。

     str1.split( )         # 以空格当作分隔符将字符串拆开成列表
     str2.split(ch)        # 以ch字符当作分隔符将字符串拆开成列表

相关的程序解说,请参考面试实例ch2_16.py。

问答2-57:请说明is的用法。

解答:

可以用于比较两个对象是否相同,在此所谓相同并不只是内容相同,而是指对象变量指向相同的内存,对象可以是变量、字符串、列表、元组、字典。

实例 :了解is的操作。

问答2-58:有一个叙述如下:

     x = [ ]
     if x is None:
     print('It is None')
     else:
     print('It is not None')
     请问输出是什么?

解答:

     It is not None

问答2-59:请说明not的用法。

解答:

这是逻辑运算符,可以回传相反的布尔值(boolean)。

问答2-60:请说明in的用法。

解答:

可以用此判断一个对象是否属于另一个对象,然后回传布尔值(boolean)。

实例 :了解in的操作。

问答2-61:什么是列表打包(packing)?

解答:

情况1

在多重指定中,如果等号左边的变量较少,可以用“*变量”方式,将多余的右边内容,用列表方式打包给含*的变量。

实例1 :将多的内容打包给c。

上述c的结果是[3,4,5],变量内容打包时,不一定要在最右边,可以在任意位置。

实例2 :将多的内容打包给b。

上述b的结果是[2,3,4]。

情况2

Python也可以使用zip( )函数,针对多个列表元素的值进行打包,此时语法如下:

     zip(列表1,列表2,… )

相关的程序解说,请参考面试实例ch2_19.py。

情况3

Python的内建函数enumerate(可迭代对象[,start=0])其实也可以说是一个打包函数,这个函数是将索引值与列表元素做打包,默认索引值是从0开始,可以使用start参数设定索引值的起始值。

相关的程序解说,请参考面试实例ch2_20.py。

问答2-62:什么是元组(或列表)解包(unpacking)?

解答:

情况1

在多重指定中,等号左右两边也可以是容器,只要它们的结构相同即可。例如:有一个指令如下:

     x,y = (10,20)   # 元组解包
     x,y = [10,20]   # 列表解包

这称为元组解包(tuple unpacking)或列表解包(list unpacking),然后将元素内容设定给对应的变量。

实例1 :等号两边是容器的应用。

上述并不是将“1,2,3”设定给列表更改列表内容,而是将两边都解包,所以可以得到a,b,c分别是1,2,3。

情况2

如果列表(或元组)的元素是列表(或元组),则可以使用for循环执行解包。

相关的程序解说,请参考面试实例ch2_21.py和ch2_22.py。

问答2-63:什么是可迭代对象(iterators/iterable object),请举3个可迭代对象实例。

解答:

所谓的可迭代对象是指可以遍历或迭代的对象。

例如:列表(list)、元组(tuple)、字典(dict)皆是可迭代对象。

问答2-64:请说明divmod(x,y)的用法,它的回传值数据形态为何?

解答:

divmod(x,y)函数的第1个参数x是被除数,第2个参数y是除数,回传值是商和余数,数据形态是元组。

     商,余数 = divmod(被除数,除数)   # 函数方法

更严格地说,divmod( )的回传值是元组,所以我们可以使用元组方式取得商和余数。

相关的程序解说,请参考面试实例ch2_26.py。

问答2-65:请问如何将B字典元素合并到A字典内。

解答:

可以使用A.update(B)。

相关的程序解说,请参考面试实例ch2_30.py。

问答2-66:如何合并和删除字典?

解答:

可以使用update方法合并字典。

可以使用del方法删除字典元素或整个字典。

     del mydict           # 可以删除字典mydict
     del mydict["data"]   # 可以删除mydict字典的data为key的元素
     mydict.clear( )      # 可以删除字典所有元素

相关的程序解说,请参考面试实例ch2_31.py和ch2_32.py。

问答2-67:请列出所有被列为逻辑值False的情况。

解答:

     布尔值False;
     整数0       ;
     浮点数0.0;
     空字符串 ' ';
     空列表 [ ];
     空元组 ( );
     空字典 { };
     空集合 set( );
     None。
     至于其他的皆会被视为True。

问答2-68:请说明any( )和all( )的区别。

解答:

any(x):x是可迭代对象,只要一个对象不为空、0或False,就回传True。否则回传False。

all(x):x是可迭代对象,要所有对象不为"、0、False或是空对象,才回传True。否则回传False。

上述空列表和元组回传是True。

相关的程序解说,请参考面试实例ch2_39.py。

问答2-69:Python的pass是什么?

解答:

在设计程序尚未完成时,为了要侦错其他程序部分,在尚未完成的部分使用pass。

问答2-70:什么是pickling和unpickling?

解答:

pickle是Python的一种原生数据形态,pickle文件内部是以二进制格式存储数据存储,当数据以二进制方式存储时不方便人类阅读,但是这种数据格式最大的优点是方便保存,以及方便未来调用。

程序设计师可以很方便地将所建立的数据(例如字典、列表等)使用dump( )以pickle文件存储,这个过程称pickling。

程序设计师可以很方便地将pickle文件使用load( )复原文件原先的数据格式,这个过程称unpickling。

问答2-71:请简述redis和mysql的差异。

解答:

redis:这是非关系数据库,数据存储在内存,速度快。

mysql:这是关系数据库,数据存储在磁盘,访问速度相对较慢。

问答2-72:请说明AttributeError、Exception、FileNotFoundError、IOError、IndexError、KeyError、MemoryError、NameError、SyntaxError、SystemError、TypeError、ValueError、ZeroDivisionError的错误原因。

解答:

AttributeError:通常是指对象没有这个属性。

Exception:一般错误皆可使用。

FileNotFoundError:找不到open( )开启的文件。

IOError:在输入或输出时发生错误。

IndexError:索引超出范围区间。

KeyError:在映射中没有这个键。

MemoryError:需求内存空间超出范围。

NameError:对象名称未宣告。

SyntaxError:语法错误。

SystemError:直译器的系统错误。

TypeError:数据类型错误。

ValueError:传入无效参数。

ZeroDivisionError:除数为0。

面试实例ch2_1.py :转义字符的应用,这个程序第9行增加\t字符,所以can’t跳到下一个Tab键位置输出。同时有\n字符,这是换行符号,所以loving跳到下一行输出。

执行结果

程序实例ch2_2.py :字符串前加上r的应用。

执行结果

面试实例ch2_3.py :将字符串‘abc’和‘芝加哥’转成utf-8格式bytes数据,然后转回Unicode字符串。

执行结果

面试实例ch2_4.py :有一个字符串如下:

     data = '%.4f'%2.12345

请列出上述字符串的数据形态与内容,同时输出分别保留到小数第1、2、3位的结果。

执行结果

面试实例ch2_5.py :find( )和rfind( )的说明。

执行结果

面试实例ch2_6.py :列出段落内某一个字符串出现的次数,此例会找出CIA字符串出现的次数。

执行结果

面试实例ch2_7.py :删除字符串内的空格,使用replace( )。

执行结果

面试实例ch2_8.py :删除字符串内的空格,使用split( )和join( )。

执行结果

面试实例ch2_9.py :Python的array模块可以建立数组,list( )可以建立列表,请说明数组和列表的差异。

数组元素必须是相同的数据形态,因为数组元素的数据形态相同,所以占据的内存空间较少。一个列表可以拥有多个数据形态的数据,所需内存空间较大。

下列是用程序解说这道题的概念,在真正面试时不用撰写程序,只要说明清楚即可。

执行结果

面试实例ch2_10.py :索引实例解说。

执行结果

面试实例ch2_11.py :切片应用。

执行结果

面试实例ch2_12.py :说明append( )的用法,列表会单独成为一个列表的元素。

执行结果

面试实例ch2_13.py :说明extend( )的用法,列表元素会分解成另一个列表的元素。

执行结果

程序实例ch2_14.py :有一个extend( )语法如下:

     A.extend(B)

请使用赋值(=)运算取代,列出写法,同时用程序验证此结果。

执行结果

程序实例ch2_15.py :浅拷贝、深拷贝与赋值(=)应用在不可变量数据中时概念相同,变量具有相同地址,所以某一个数据更改,所有变量数据也会更改。

执行结果

面试实例ch2_16.py :将两种不同类型的字符串转成列表,其中str1使用空格当作分隔符,str2使用\当作分隔符(因为这是转义字符,所以使用\\),同时列出这两个列表的元素数量。

执行结果

面试实例ch2_17.py :请说明join( )方法,同时用程序验证。

基本上列表元素会用连接字符串组成一个字符串,它的语法格式如下:

连接字符串.join(列表)

执行结果

面试实例ch2_18.py :有一个列表如下,请说明sort( )和sorted( )的区别,同时用程序实例验证。

     data = [-5,3,-1,12,8]

使用sort( )方法没有返回值,但是原列表内容会更改。使用sorted( )方法返回值是排序后的内容,原列表内容不会更改。

执行结果

面试实例ch2_19.py :有一个cities列表,元素是地区名称;有一个populations列表,元素是人口数,单位是万。这个程序会执行列表打包,然后打印结果。

执行结果

上述第3行笔者建立populations列表时有4个元素,cities列表有3个元素,在列表打包时,如果有一个列表比较短,当比较短的列表打包到最后一个元素时,这个打包工作就会结束。

面试实例ch2_20.py :enumerate( )打包的应用。

执行结果

面试实例ch2_21.py :使用zip( )将列表打包,然后使用for … in解包。

执行结果

面试实例ch2_22.py :使用enumerate将列表打包,然后使用for … in解包。

执行结果

面试实例ch2_23.py :请用文字说明zip( )的用法,同时用程序解说。

解答:

这是一个内建函数,参数内容主要是2个或更多个可迭代(iterable)的对象,如果有多个对象(例如列表或元组),可以用zip( )将多个对象打包成zip对象,然后未来视需要将此zip对象转成列表或其他对象,例如元组。

执行结果

面试实例ch2_24.py :请用文字说明enumerate对象,同时用程序解说。

解答:

enumerate( )方法可以将iterable(迭代)类数值的元素用索引值与元素配对方式回传,返回的数据称enumerate对象,用这个方式可以为可迭代对象的每个元素增加索引值,这也可以称为元素打包,这对未来的数据应用是有帮助的。它的语法格式如下:

     obj = enumerate(iterable[,start = 0])      # 若省略start=设定,默认索引
值是0

下列程序会将列表数据转成enumerate对象,再将enumerate对象转成列表,start索引起始值分别为0和10。

执行结果

面试实例ch2_25.py :什么是生成器(generators)?请举例说明。

解答:

生成器可以返回一组可迭代项目的函数,例如下列一行代码可以产生1~10的平方列表。

     square = [n ** 2 for n in range(1,11)]

下列是使用生成器(generators)建立1~10的平方列表。

执行结果

面试实例ch2_26.py :说明divmod( )的应用。

面试实例ch2_27.py :假设字典名称是fruits,如何取得此字典的键(key)?请同时使用程序说明。

解答:

可以使用fruits.keys()。

下列是打印字典的键(key)。

执行结果

面试实例ch2_28.py :假设字典名称是fruits,如何取得此字典的值(value)?请使用程序说明。

解答:

可以使用fruits.values( )。

下列是打印字典的值(value)。

执行结果

面试实例ch2_29.py :假设字典名称是fruits,如何取得此字典的键:值(key:value)的元组?请使用程序说明。

解答:

可以使用fruits.items()。

下列是打印字典的键:值(key:value)。

执行结果

面试实例ch2_30.py :将fruits2字典元素整合到fruits1字典内,由于字典的键(key)是唯一,所以如果有重复的键,fruits2键的值会覆盖fruits1键的值。此例中,fruits1的Orange键值是30,经过update( ) 后fruits1的Orange键值将改为与fruits2相同,值是35。

执行结果

程序实例ch2_31.py :使用del分别删除字典元素与字典,当字典删除后,再打印字典时,由于字典已经不存在所以会产生错误。

执行结果

面试实例ch2_32.py :有一个字典内容如下,如何删除字典的‘Jan’。

     data = {'Jan':1,'Feb':2,'March':3}

执行结果

面试实例ch2_33.py :请指出下列程序代码的执行结果,这一题的重点是使用下列数据调用函数3次。

     myfun('Jan',1)
     myfun('Feb',2)
     myfun('March',3,{ })

执行结果

上述第2次调用myfun(‘Feb’,2)时,因为指向同一个地址,原先字典数据将保存,所以字典内有2笔数据。当第3次调用myfun(‘March’,3,{ })时,因为多了参数{ },这将是新的字典,所以字典内只有1笔数据。

面试实例ch2_34.py :有2个列表如下:

     str1 = ['a','b','c']
     str2 = [1,2,3]

请将上述2个列表处理成下列字典。

     ['a':1,'b':2,'c':3]

执行结果

面试实例ch2_35.py :有2个列表如下:

     str1 = ['a',1]
     str2 = ['b',2]

请将上述2个元组处理成下列字典。

     {'a':1,'b':2}

执行结果

面试实例ch2_36.py :有2个元组如下:

     str1 = ('a',1)
     str2 = ('b',2)

请将上述2个元组处理成下列字典。

     {'a':1,'b':2}

执行结果

面试实例ch2_37.py :一家公司有3个业务员搜集了全球的潜在客户数据,A业务员收集了亚洲的潜在客户数据存放在asia列表,B业务员收集了欧洲的潜在客户数据放在euro列表,C业务员收集了美洲的潜在客户数据放在america列表,由于所搜集的客户有些是跨国企业,因此即使在不同地点也会有客户重复的问题,请问应该如何设计程序让客户不会重复?

     asia = ['IBM','Google','Acer','Asus','TSMC']
     euro = ['Philip','HP','Simens','IBM','Google']
     america = ['HP','Microsoft','Google','IBM']

提示:其实这一题主要是考查读者懂不懂应用Python集合的概念。

执行结果

面试实例ch2_38.py :有2个列表内容如下:

     list1 = [1,2,3,4,5]
     list2 = [3,4,5,6,7]

请不要使用集合相关方法,列出上述的交集。

执行结果

面试实例ch2_39.py :考查any( )方法的应用,有了any( )方法有时可以让整个Python程序变得简洁易懂。

执行结果 VFqVmVMxKzPAuMMOehvCkNBZWgp/3f+pGUX5QJ/XbYElbg/z3zqBazXAznYj1j5I

点击中间区域
呼出菜单
上一章
目录
下一章
×