转自黑马程序员《Python面试宝典》http://bbs.itheima.com/thread-402667-1-1.html 可以下载PDF文件。
目录
Q6 range()和xrange()的区别。(Python2)
Q8 现在考虑有一个 jsonline 格式的文件 file.txt 大小约为 10K,之前处理文件的代码如下所示.
Q9 read、readline和readlines的区别?
Q11 在except中return后还会执行finally中的代码吗?如何抛出自定义异常?
Q19 说明os.path 和sys.path分别表示什么?
Q1 代码中要修改不可变数据会出现什么问题?抛出什么异常?
代码会报错,抛出TypeErrory异常
- 可变数据类型:列表list和字典dict,集合set
- 不可变数据类型:基本数据类型(int,float,string)元组tuple
>>> a=tuple((1,23,5,34)) >>> a[1]=22 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
Q2 不适用中间变量交换变量a,b的值。
方法1:
a=a+b b=a-b a=a-b
方法2:
a=a^b b=b^a a=a^b
方法3:
a,b=b,a
Q3 print调用的什么底层方法?
print方法默认调用sys.stdout.write方法,即往控制台打印字符串。
Q4 下面这段代码的输出结果是什么?请解释。
class Parent(object):
x=1
class Child1(Parent):
pass
class Child2(Parent):
pass
print(Parent.x,Child1.x,Child2.x)
Child1.x=2
print(Parent.x,Child1.x,Child2.x)
parent.x=3
print(Parent.x,Child1.x,Child2.x)
结果为:
111 #继承自父类的类属性x,所有都一样,指向同一块内存地址。
121 #Child1.x进行赋值,指向了新的内存地址。
323 #更改Parent.x, 指向了新的内存地址,Child3继承父类,也指向改地址。
Q5 input()函数
在Python3中,input()获取用户输入,不论用户输入什么,获取到的都是字符串类型。
在Python2中有raw_input() input(),raw_input()在Python3中的input()作用一样,input()输入什么数据类型,获取到的就是什么数据类型。
Q6 range()和xrange()的区别。(Python2)
两者用法相同,不同的是range返回的结果是一个列表,而xrange的结果是一个生成器,前者是直接开辟一块内存空间来保存列表,后者是边循环边使用,只有使用时才会开辟内存空间,所以当列表很长时,使用xrange性能要比range好,而range则是用空间来换取时间。
在Python3中range()相当于2中的xrange(),所以3中已经没有xrange()函数了。
Q7 4G内存如何读取一个5G的数据?
方法一:
可以通过生成器,分多次读取,每次读取比较少量的数据进行处理,处理结束后在一次读取后面的数据。
方法二:
可以通过Linux命令split切割成小文件,然后对数据进行处理,此方法效率比较高。可以按照行数切割,也可以按照文件大小切割。
Q8 现在考虑有一个 jsonline 格式的文件 file.txt 大小约为 10K,之前处理文件的代码如下所示.
def get_lines():
l = []
with open(‘file.txt’,‘rb’) as f:
for eachline in f:
l.append(eachline)
return l
if __name__ == ‘__main__’:
for e in get_lines():
process(e) #处理每一行数据
现在要处理一个大小为 10G 的文件,但是内存只有 4G,如果在只修改 get_lines 函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有哪些?
要考虑的问题:
内存只有4G无法一次性读入10G的文件,需要分批读入。分批读入数据要记录每次读入数据的位置。
要考虑每次读入数据的大小,太小就会在读取操作上花费过多的时间。
修改后的代码:
def get_lines(): l=[] with open('file.txt','rb') as f: data=f.readlines(6000) l.append(data) yield l
书中给的代码并不能循环迭代,修改如下。
def get_lines(): # l=[] flag=True with open('file.txt','rb') as f: while flag: data=f.readlines(1000) # l.append(data) if data: yield data else: flag=False
Q9 read、readline和readlines的区别?
read:读取整个文件
readline:读取一行,使用生成器方法。
readlines:读取整个文件到一个迭代器以便遍历。
Q10 补充缺失的代码。
def print_directory_contents(sPath):
'''
这个函数接收文件夹的名称作为输入参数。
返回该文件夹中文件的路径
以及其包含文件夹中文件的路径
'''
#请补充代码
完整代码如下,
#首先导入os库 import os def print_directory_contents(sPath): #os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。 #只支持在 Unix, Windows 下使用。 for sChild in os.listdir(sPath): #os.path.join(path1,path2,...)用于路径拼接文件路径 sChildPath=os.path.join(sPath,sChild) #os.path.isdir()函数判断是否为文件夹,是文件夹返回True. if os.path.isdir(sChildPath): print_directory_contents(sChildPath) else: print(sChildPath)
Q11 在except中return后还会执行finally中的代码吗?如何抛出自定义异常?
return之后依然执行finally中的代码。
用raise方法可以抛出自定义异常。
Q12 except的作用和用法。
try:
#except 要和try一起使用。
except:#捕获所有异常
except <异常名>:#捕获指定异常
except <异常1,异常2>