文章目录
- Python语法面试题(一)
- 1.Python如何管理内存空间?
- 2. 变量名称前有单下划线,例如_test,说明适用时机。
- 3. 变量名称后有单下划线,例如dict_,说明适用时机。
- 4. 变量名称前后有双下划线,例如__test__,说明适用时机。
- 5. 变量名称前有双下划线,例如__test,说明适用时机。
- 6. 简述列表(list)和元组(tuple)的区别。
- 7. Python提供哪些内建可变和不可变的数据结构?
- 8. 列出Python内建的容器数据形态。
- 9. 列出Python序列(sequence)的数据类型。
- 10. 列出Python隐射(mapping)数据类型。
- 11. 请说明编码(encode)与译码(decode)。
- 12. 请说明find()和rfind()的差异。
- 13. 请说明index()和rindex()的差异。
- 14. 请说明列表(list)中append()和extend()方法的区别。
- 15. 请说明浅拷贝copy()和深拷贝deepcopy()应用在可变数据(如列表)的差异。
Python语法面试题(一)
1.Python如何管理内存空间?
Python使用私有堆积(heap)空间管理内存,所有Python对象和数据结构是在此空间存放,程序设计值无法存取此区间数据,该空间是由直译器(interpreter)操作。
有关Python对象的内存空间配置是由Python内存管理程序(memory manager)处理。
Python具有垃圾回收(garbage collection)功能,所谓的垃圾回收是指程序执行时,直译程序会定时主动回收不再需要的存储空间,将内存集中管理。这种机制可以减轻程序设计师的负担,减少犯错。
2. 变量名称前有单下划线,例如_test,说明适用时机。
这是一种私有变量、函数或方法名,在测试中或一般应用在不想直接被调用的方法可以使用单下划线开头的变量。
3. 变量名称后有单下划线,例如dict_,说明适用时机。
这种命名方式主要是避免与Python的关键词(built-in keywords)或内置函数(built-in functions)有相同的名称,例如max是求较大值的函数,若想建立max变量,可以将变量命名为max_。
4. 变量名称前后有双下划线,例如__test__,说明适用时机。
这是保留给Python内建(built-in)的变量或方法使用。
5. 变量名称前有双下划线,例如__test,说明适用时机。
也是私有方法或变量的命名,无法直接使用本名存取。
6. 简述列表(list)和元组(tuple)的区别。
列表特点如下:
-
元素是可变的,可以编辑元素内容;
-
速度比元组慢。
元组特点如下:
-
元素是不可变的,不可以编辑元素内容;
-
速度比列表块。
7. Python提供哪些内建可变和不可变的数据结构?
可变数据结构:列表(list)、字典(dict)、集合(set);
不可变数据结构:元组(tuple)、字符串(string)、数字(number)。
8. 列出Python内建的容器数据形态。
列表(list)、元组(tuple)、字典(dict)、集合(set)。
9. 列出Python序列(sequence)的数据类型。
列表(list)、元组(tuple)、字符串(str)、bytes数据(bytes)。
10. 列出Python隐射(mapping)数据类型。
字典(dict)。
11. 请说明编码(encode)与译码(decode)。
将字符串转成bytes数据称为编码(encode),所使用的的是encode()。
将bytes数据转成字符串称为译码,所使用的的是decode()。
12. 请说明find()和rfind()的差异。
find()方法可以执行字符串搜索,如果搜索到字符串会回传字符串的索引位置,如果没有找到则回传-1。
index = S.find(sub[,start[,end]]) #S代表被搜索字符串,sub是预搜索字符串
index是搜寻到时回传的索引值,start和end代表可以被搜寻字符串的区间,若是省略表示全部搜寻,如果没有找到则回传-1给index。
rfind()方法可以搜寻特定子字符串最后一次出现的位置。
index = S.rfind(sub[,start[,end]]) #S代表被搜索字符串,sub是预搜索字符串
index是搜寻到时回传的索引值,start和end代表可以被搜寻字符串的区间,若是省略表示全部搜寻,如果没有找到则回传-1给index。
13. 请说明index()和rindex()的差异。
index()方法可以应用在列表,也可以应用在字符串,index()可以回传搜寻字符的索引。rindex()则只能应用在字符串,可以回传搜寻字符串最后一次出现的索引位置。
14. 请说明列表(list)中append()和extend()方法的区别。
append():假设加入的是元素,可以将元素加在列表末端;假设加入的是列表,则所加入的列表将变成元素存在新的列表。
entend():只适合加入的是列表,可以将一个列表中的元素分解,并加入到另一个列表中。
list1 = ["a","b","c"]
list2 = ["d","e"]
list1.append(list2) #["a","b","c",["d","e"]]
list1.extend(list2) #["a","b","c","d","e"]
15. 请说明浅拷贝copy()和深拷贝deepcopy()应用在可变数据(如列表)的差异。
-
浅拷贝
- 假设
b=a.copy()
,a和b是独立的对象,但是它们的子对象是指向同一对象,也就是对象的子对象会连动。
a = [1,2,3,[4,5,6]] b = a.copy() print(id(a)==id(b)) #False print(id(a[0])==id(b[0])) #True # a增加元素观察结果 a.append(7) print(a,b) # a:[[1,2,3,[4,5,6]],7],b:[1,2,3,[4,5,6]] # a的子对象增加元素观察结果 a[3].append(7) print(a,b) # a:[1,2,3,[4,5,6,7]],b:[1,2,3,[4,5,6,7]]
- 上述执行结果表明a的子对象因为指向同一地址,所以同时增加7。
- 假设
-
深拷贝
- 假设
b = a.deepcopy()
,a和b以及其子对象皆是独立的对象,所以不受干扰,使用前需要import copy模块。
import copy a = [1,2,3,[4,5,6]] b = copy.deepcopy(a) print(id(a)==id(b)) #False print(id(a[0])==id(b[0])) #False a[3].append(7) a.append(8) print(a,b) # a:[1,2,3,[4,5,6,7],8],b:[1,2,3,[4,5,6]]
- 假设