1.代码中要修改不可变数据会出现什么问题?抛出什么异常?
代码会报错,抛出TypeErrory异常
- 可变类型 列表(list),字典(dict),集合(set)
不可变类型:数据类型(int,float,string),元组
a = tuplet(1,2,3)
a[1] = 3
TypeError: 'tuple' object does not support item assignment 类型错误:“tuple”对象不支持项分配
# 通过修改不可变类型的变量,会引起数据类型错误,所以在写代码的使用要注意,python是一种解释性语言,运行程序前并不需要编译
2.不用中间变量交换变量a,b的值。
方法 1
a = 3, b = 5
a = a +b a = 3+5=8
b = a - b b = 8 - 5 = 3
a = a - b a = 8- 3 = 5方法 2
a=a^b
b=b^a
a=a^b方法 3
a,b=b,a
python中经常使用这样方法
如果使用中间变量
c = a
a = b
b = c
3.print调用的什么底层方法?
print方法默认调用sys.stdout.write方法,即往控制台打印字符串。
4.下面这段代码的输出结果是什么?请解释。
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 继承来自父类的类属性,所以都指向同一块内存地址
121child.x 重新进行赋值,指向了新的内存地址
323 更改Parent.x, 指向了新的内存地址,Child3继承父类,也指向改地址。
5.input()函数
在Python3中,input()获取用户输入,不论用户输入什么,获取到的都是字符串类型。
在Python2中有raw_input() input(),raw_input()在Python3中的input()作用一样,input()输入什么数据类型,获取到的就是什么数据类型。
6. range()和xrange()的区别。(Python2)
两者用法相同,不同的是range返回的结果是一个列表,而xrange的结果是一个生成器,前者是直接开辟一块内存空间来保存列表,后者是边循环边使用,只有使用时才会开辟内存空间,所以当列表很长时,使用xrange性能要比range好,而range则是用空间来换取时间。
在Python3中range()相当于2中的xrange(),所以3中已经没有xrange()函数了。
7. 4G内存如何读取一个5G的数据?
方法一:
可以通过生成器,分多次读取,每次读取比较少量的数据进行处理,处理结束后在一次读取后面的数据。
方法二:
可以通过Linux命令split切割成小文件,然后对数据进行处理,此方法效率比较高。可以按照行数切割,也可以按照文件大小切割。
8 .现在考虑有一个 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():
flag = True
with open("file.txt","rb") as f:
data = f.readlines(1000)
if data:
yield data
else:
flag = False
def get_lines():
l=[]
with open('file.txt','rb') as f:
data=f.readlines(6000)
l.append(data)
yield l
9. read、readline和readlines的区别?
read:读取整个文件
readline:读取一行,使用生成器方法。
readlines:读取整个文件到一个迭代器以便遍历。
10.补充缺失的代码。
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)
11. 在except中return后还会执行finally中的代码吗?如何抛出自定义异常?
return之后依然执行finally中的代码。
用raise方法可以抛出自定义异常。
12. except的作用和用法。
try:
#except 要和try一起使用。
except:#捕获所有异常
except <异常名>:#捕获指定异常
except <异常1,异常2>:捕获异常1或者异常2
except<异常名>,<数据>:捕获指定异常及其附加的数据
except<异常1,异常2>,<数据>:捕获异常1或者异常2,及其附加的数据。
13. 有哪些常用的python标注库。
标准库:os操作系统;time时间;random随机;pymysql连接数据库;threading线程;multiprocessing进程;queue队列;math数学
第三方库:django,flask,requests,hashlib,md5,selenium,scrapy,xadmin。
常用的科学计算库:Numpy,Scipy,Pandas
可视化库:matplotlib
14.赋值、浅拷贝和深拷贝的区别。
在python中,对象的赋值就是简单的对象引用。如:
a=[1,2,3,“abc”,[‘hello’,567]]
b=a
此时a和b指向同一块内存地址,相当于把a的引用赋值给了b。
a is b,为True,id(a)=id(b)
赋值操作(包括对象作为参数、返回值)不会开辟新的内存空间,它只是赋值了对象的引用。修改了a,也就影响了b;修改了b也就意向了a。