Python面试题及详细答案150道(16-30) -- 数据结构篇
《前后端面试题
》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。
文章目录
- 一、本文面试题目录
- 16. 列表(List)和元组(Tuple)的区别是什么?
- 17. 如何实现列表去重?有哪些方法?
- 18. 字典(Dictionary)的特性是什么?Python3.7+中字典有什么新特性?
- 19. 如何遍历字典的键、值、键值对?
- 20. 集合(Set)的主要作用是什么?如何创建集合?
- 21. 列表推导式、字典推导式、集合推导式的语法及应用场景。
- 22. 什么是生成器(Generator)?它与列表有何区别?
- 23. 解释字符串的不可变性。
- 24. 字符串的常用方法有哪些?(如`split()`、`join()`、`strip()`等)
- 25. 如何判断一个字符串是否是回文?
- 26. 列表的`append()`和`extend()`方法有什么区别?
- 27. 如何实现两个列表的交集、并集、差集?
- 28. 什么是有序字典(OrderedDict)?在Python3.7+中是否还有必要使用?
- 29. 如何高效地反转一个列表或字符串?
- 30. 解释`enumerate()`函数的作用及用法。
- 二、150道Python面试题目录列表
一、本文面试题目录
16. 列表(List)和元组(Tuple)的区别是什么?
列表(List)和元组(Tuple)是Python中两种常用的序列类型,主要区别如下:
特性 | 列表(List) | 元组(Tuple) |
---|---|---|
语法 | 使用方括号 [] | 使用圆括号 () |
可变性 | 可变(可修改、添加、删除元素) | 不可变(创建后不能修改元素) |
内存占用 | 较大(需预留空间用于修改) | 较小(存储更紧凑) |
适用场景 | 元素需要动态变化的场景 | 元素固定不变的场景(如常量集合) |
常用操作 | append() 、insert() 、remove() 等 | 仅支持查询操作,无修改方法 |
示例:
# 列表(可变)
my_list = [1, 2, 3]
my_list.append(4) # 添加元素
my_list[0] = 100 # 修改元素
print(my_list) # [100, 2, 3, 4]# 元组(不可变)
my_tuple = (1, 2, 3)
# my_tuple.append(4) # 错误:'tuple' object has no attribute 'append'
# my_tuple[0] = 100 # 错误:'tuple' object does not support item assignment# 元组可以转换为列表进行修改
temp_list = list(my_tuple)
temp_list.append(4)
my_tuple = tuple(temp_list)
print(my_tuple) # (1, 2, 3, 4)
注意:元组的不可变性是指元素的身份(内存地址)不可变,如果元素是可变对象(如列表),其内部内容仍可修改:
tuple_with_list = (1, 2, [3, 4])
tuple_with_list[2].append(5) # 允许修改元组中的列表元素
print(tuple_with_list) # (1, 2, [3, 4, 5])
17. 如何实现列表去重?有哪些方法?
列表去重是常见需求,以下是几种常用方法:
-
使用集合(Set):最简单的方法,利用集合元素唯一性,但会打乱原有顺序(Python 3.7+中集合也保留插入顺序)
original_list = [1, 2, 2, 3, 3, 3, 4] unique_list = list(set(original_list)) print(unique_list) # [1, 2, 3, 4](顺序可能变化)
-
使用列表推导式:保留原有顺序
original_list = [1, 2, 2, 3, 3, 3, 4] unique_list = [] [unique_list.append(x) for x in original_list if x not in unique_list] print(unique_list) # [1, 2, 3, 4](保持原顺序)
-
使用
dict.fromkeys()
:Python 3.7+中字典保留插入顺序,去重同时保持顺序original_list = [1, 2, 2, 3, 3, 3, 4] unique_list = list(dict.fromkeys(original_list)) print(unique_list) # [1, 2, 3, 4](保持原顺序)
-
使用
itertools
模块:适合处理大型列表,效率较高from itertools import groupbyoriginal_list = [1, 2, 2, 3, 3, 3, 4] # 注意:groupby需要先排序 sorted_list = sorted(original_list) unique_list = [key for key, group in groupby(sorted_list)] print(unique_list) # [1, 2, 3, 4](排序后的顺序)
选择方法时需考虑:是否需要保持原顺序、列表大小、是否需要处理复杂元素等因素。
18. 字典(Dictionary)的特性是什么?Python3.7+中字典有什么新特性?
字典(Dictionary)的特性:
- 由键值对(key-value)组成,通过键快速访问值
- 键(key)必须是不可变类型(如字符串、数字、元组),且唯一;值(value)可以是任何类型
- 支持动态修改(添加、删除、更新键值对)
- 属于无序集合(Python 3.7之前)
示例:
person = {"name": "Alice","age": 30,"is_student": False
}# 访问值
print(person["name"]) # Alice# 添加新键值对
person["city"] = "New York"# 修改值
person["age"] = 31# 删除键值对
del person["is_student"]print(person) # {'name': 'Alice', 'age': 31, 'city': 'New York'}
Python 3.7+中字典的新特性:
-
保留插入顺序:字典会记住键值对的插入顺序,遍历字典时会按插入顺序返回
# Python 3.7+ d = {"a": 1, "b": 2, "c": 3} print(list(d.keys())) # ['a', 'b', 'c'](与插入顺序一致)
-
新增
dict
相关函数:dict.values()
和dict.items()
返回的视图对象支持reversed()
反向迭代for key in reversed(d):print(key) # c, b, a
-
性能优化:字典的内存使用更加高效,插入和查找速度有所提升
-
|
和|=
运算符:Python 3.9+支持用|
合并字典,|=
更新字典# Python 3.9+ d1 = {"a": 1, "b": 2} d2 = {"b": 3, "c": 4} d3 = d1 | d2 # 合并字典,相同键取后者值 print(d3) # {'a': 1, 'b': 3, 'c': 4}d1 |= d2 # 更新字典d1 print(d1) # {'a': 1, 'b': 3, 'c': 4}
19. 如何遍历字典的键、值、键值对?
字典提供多种遍历方式,可分别遍历键、值或键值对:
-
遍历键(key):
person = {"name": "Alice", "age": 30, "city": "New York"}# 方法1:直接遍历字典(默认遍历键) for key in person:print(key)# 方法2:使用keys()方法 for key in person.keys():print(key)
输出:
name age city
-
遍历值(value):使用
values()
方法for value in person.values():print(value)
输出:
Alice 30 New York
-
遍历键值对(key-value):使用
items()
方法for key, value in person.items():print(f"{key}: {value}")
输出:
name: Alice age: 30 city: New York
-
同时获取索引和键值对:结合
enumerate()
函数for index, (key, value) in enumerate(person.items()):print(f"{index}: {key} = {value}")
输出:
0: name = Alice 1: age = 30 2: city = New York
注意:在Python 3.7之前,字典遍历顺序是不确定的;Python 3.7+中,遍历顺序与插入顺序一致。
20. 集合(Set)的主要作用是什么?如何创建集合?
集合(Set)的主要作用:
- 存储唯一元素(自动去重)
- 高效进行成员关系测试(
in
操作) - 实现数学中的集合运算(交集、并集、差集等)
- 快速消除列表中的重复元素
创建集合的方法:
-
使用大括号
{}
:# 创建空集合不能用{},会被识别为字典 fruits = {"apple", "banana", "cherry"} print(fruits) # {'apple', 'banana', 'cherry'}(顺序不确定)# 自动去重 numbers = {1, 2, 2, 3, 3, 3} print(numbers) # {1, 2, 3}
-
使用
set()
函数:# 创建空集合 empty_set = set() print(type(empty_set)) # <class 'set'># 从其他可迭代对象创建 from_list = set([1, 2, 2, 3]) print(from_list) # {1, 2, 3}from_string = set("hello") print(from_string) # {'h', 'e', 'l', 'o'}(自动去重)from_tuple = set(("a", "b", "a")) print(from_tuple) # {'a', 'b'}
-
集合推导式:
# 创建1-10的偶数集合 even_numbers = {x for x in range(1, 11) if x % 2 == 0} print(even_numbers) # {2, 4, 6, 8, 10}
集合是无序的,不能通过索引访问元素,但支持添加、删除元素和各种集合运算。
21. 列表推导式、字典推导式、集合推导式的语法及应用场景。
推导式(Comprehension)是Python中创建序列的简洁语法,可快速生成列表、字典和集合。
-
列表推导式
- 语法:
[表达式 for 变量 in 可迭代对象 if 条件]
- 应用场景:快速生成列表,替代简单的
for
循环
示例:
# 生成1-10的平方列表 squares = [x**2 for x in range(1, 11)] print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]# 筛选偶数 even_numbers = [x for x in range(1, 21) if x % 2 == 0] print(even_numbers) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]# 嵌套循环 matrix = [[1, 2], [3, 4], [5, 6]] flattened = [num for row in matrix for num in row] print(flattened) # [1, 2, 3, 4, 5, 6]
- 语法:
-
字典推导式
- 语法:
{键表达式: 值表达式 for 变量 in 可迭代对象 if 条件}
- 应用场景:快速生成字典,或转换已有数据为字典
示例:
# 生成数字到其平方的映射 square_dict = {x: x**2 for x in range(1, 6)} print(square_dict) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}# 转换键值对 original = {"a": 1, "b": 2, "c": 3} reversed_dict = {v: k for k, v in original.items()} print(reversed_dict) # {1: 'a', 2: 'b', 3: 'c'}# 筛选字典项 filtered = {k: v for k, v in original.items() if v > 1} print(filtered) # {'b': 2, 'c': 3}
- 语法:
-
集合推导式
- 语法:
{表达式 for 变量 in 可迭代对象 if 条件}
- 应用场景:快速生成集合,自动去重
示例:
# 生成1-10的偶数集合 even_set = {x for x in range(1, 11) if x % 2 == 0} print(even_set) # {2, 4, 6, 8, 10}# 提取字符串中唯一的元音字母 vowels = {c for c in "hello world" if c in "aeiou"} print(vowels) # {'e', 'o'}# 去重并转换为大写 words = ["apple", "banana", "apple", "cherry"] unique_words = {word.upper() for word in words} print(unique_words) # {'APPLE', 'BANANA', 'CHERRY'}
- 语法:
推导式使代码更简洁高效,但复杂的推导式可能降低可读性,应适度使用。
22. 什么是生成器(Generator)?它与列表有何区别?
生成器(Generator) 是一种特殊的迭代器,用于按需生成值,而不是一次性创建所有值并存储在内存中。
创建生成器的方式:
- 使用生成器表达式(类似列表推导式,但用圆括号)
- 在函数中使用
yield
关键字
示例:
# 生成器表达式
gen = (x**2 for x in range(1, 6))
print(gen) # <generator object <genexpr> at 0x...># 遍历生成器
for num in gen:print(num) # 1, 4, 9, 16, 25# 生成器函数
def count_up_to(n):i = 1while i <= n:yield i # 每次调用返回一个值,并暂停函数执行i += 1generator = count_up_to(5)
print(next(generator)) # 1
print(next(generator)) # 2
for num in generator:print(num) # 3, 4, 5
生成器与列表的区别:
特性 | 生成器 | 列表 |
---|---|---|
内存占用 | 小(按需生成,不存储所有值) | 大(存储所有值) |
创建方式 | 生成器表达式或yield 函数 | 列表推导式或[] |
可迭代性 | 可迭代(一次性) | 可迭代(可多次遍历) |
访问方式 | 只能通过迭代(next() 或for 循环) | 可通过索引直接访问 |
适用场景 | 处理大量数据或无限序列 | 数据量小,需要随机访问 |
示例:处理大数据时的内存差异
# 列表:创建100万个元素,占用大量内存
large_list = [x for x in range(1, 1000001)]# 生成器:几乎不占用内存,按需生成
large_generator = (x for x in range(1, 1000001))
生成器特别适合处理大型数据集或无限序列,以及需要节省内存的场景。
23. 解释字符串的不可变性。
字符串的不可变性是指字符串创建后,其内容不能被修改。尝试直接修改字符串的某个字符会抛出错误。
示例:
s = "hello"
# s[0] = "H" # 错误:'str' object does not support item assignment
为什么字符串是不可变的?
- 安全性:作为字典键等哈希表元素时,不可变性确保哈希值不会改变
- 性能优化:字符串可以被安全地共享,无需复制
- 简化内存管理:Python可以对字符串进行缓存(如短字符串驻留)
如何"修改"字符串?
虽然不能直接修改字符串,但可以创建新的字符串:
s = "hello"# 方法1:字符串拼接
s1 = "H" + s[1:]
print(s1) # "Hello"# 方法2:使用字符串方法(返回新字符串)
s2 = s.replace("h", "H")
print(s2) # "Hello"# 方法3:转换为列表修改后再转回字符串
s_list = list(s)
s_list[0] = "H"
s3 = "".join(s_list)
print(s3) # "Hello"
注意:每次"修改"字符串都会创建新的字符串对象,原字符串保持不变:
s = "hello"
s_new = s.upper()
print(s) # "hello"(原字符串不变)
print(s_new) # "HELLO"(新字符串)
理解字符串的不可变性有助于编写更高效的代码,避免不必要的字符串复制操作。
24. 字符串的常用方法有哪些?(如split()
、join()
、strip()
等)
Python字符串提供了丰富的方法,以下是常用的一些:
-
split(sep=None, maxsplit=-1)
:按分隔符分割字符串,返回列表s = "apple,banana,cherry" print(s.split(",")) # ['apple', 'banana', 'cherry']s2 = "hello world how are you" print(s2.split(maxsplit=2)) # ['hello', 'world', 'how are you'](最多分割2次)
-
join(iterable)
:将可迭代对象中的字符串用原字符串连接fruits = ["apple", "banana", "cherry"] print(", ".join(fruits)) # "apple, banana, cherry" print(" ".join(fruits)) # "apple banana cherry"
-
strip([chars])
:去除字符串首尾指定字符(默认去除空白)s = " hello world " print(s.strip()) # "hello world"(去除首尾空格)s2 = "###hello###" print(s2.strip("#")) # "hello"(去除首尾#)
相关方法:
lstrip()
(仅去除左侧)、rstrip()
(仅去除右侧) -
大小写转换:
s = "Hello World" print(s.lower()) # "hello world"(全小写) print(s.upper()) # "HELLO WORLD"(全大写) print(s.title()) # "Hello World"(每个单词首字母大写) print(s.capitalize()) # "Hello world"(仅首字母大写)
-
replace(old, new, count=-1)
:替换字符串中的子串s = "hello hello world" print(s.replace("hello", "hi")) # "hi hi world"(全部替换) print(s.replace("hello", "hi", 1)) # "hi hello world"(只替换1次)
-
startswith(prefix)
和endswith(suffix)
:检查字符串是否以指定前缀/后缀开头/结尾s = "hello.txt" print(s.startswith("hello")) # True print(s.endswith(".txt")) # True print(s.endswith((".doc", ".txt"))) # True(检查多个选项)
-
find(sub, start=0, end=len(string))
和index(sub)
:查找子串位置s = "hello world" print(s.find("world")) # 6(找到返回索引) print(s.find("python")) # -1(找不到返回-1) # print(s.index("python")) # 错误:ValueError(找不到抛出异常)
-
format(*args, **kwargs)
:格式化字符串name = "Alice" age = 30 print("My name is {0}, I'm {1} years old".format(name, age)) print(f"My name is {name}, I'm {age} years old") # f-string更简洁
25. 如何判断一个字符串是否是回文?
回文是指正读和反读都相同的字符串(忽略大小写和非字母字符)。判断方法如下:
方法1:反转字符串比较
def is_palindrome(s):# 预处理:转为小写,只保留字母和数字cleaned = "".join(ch.lower() for ch in s if ch.isalnum())# 比较清理后的字符串和其反转return cleaned == cleaned[::-1]print(is_palindrome("A man, a plan, a canal: Panama")) # True
print(is_palindrome("race a car")) # False
print(is_palindrome("level")) # True
方法2:双指针法
def is_palindrome(s):left = 0right = len(s) - 1while left < right:# 移动左指针到下一个字母或数字while left < right and not s[left].isalnum():left += 1# 移动右指针到前一个字母或数字while left < right and not s[right].isalnum():right -= 1# 比较字符(忽略大小写)if s[left].lower() != s[right].lower():return Falseleft += 1right -= 1return Trueprint(is_palindrome("A man, a plan, a canal: Panama")) # True
print(is_palindrome("race a car")) # False
关键步骤:
- 预处理:过滤非字母数字字符,统一大小写
- 比较:
- 方法1简单直观,利用Python字符串切片
[::-1]
快速反转 - 方法2空间效率更高,无需创建新字符串
- 方法1简单直观,利用Python字符串切片
两种方法都能有效判断回文,方法1代码更简洁,方法2适合处理超长字符串(节省内存)。
26. 列表的append()
和extend()
方法有什么区别?
append()
和extend()
都是列表的添加元素方法,但功能不同:
-
append(item)
:将item
作为单个元素添加到列表末尾- 无论
item
是什么类型,都会被当作一个整体添加
- 无论
-
extend(iterable)
:将可迭代对象(如列表、元组、字符串)中的每个元素逐个添加到列表末尾- 只能接收可迭代对象作为参数
示例:
# 初始化列表
my_list = [1, 2, 3]# 使用append()
my_list.append(4)
print(my_list) # [1, 2, 3, 4](添加单个元素)my_list.append([5, 6])
print(my_list) # [1, 2, 3, 4, [5, 6]](列表作为单个元素添加)# 重置列表
my_list = [1, 2, 3]# 使用extend()
my_list.extend([4, 5])
print(my_list) # [1, 2, 3, 4, 5](添加可迭代对象中的元素)my_list.extend((6, 7))
print(my_list) # [1, 2, 3, 4, 5, 6, 7](元组元素被逐个添加)my_list.extend("89")
print(my_list) # [1, 2, 3, 4, 5, 6, 7, '8', '9'](字符串字符被逐个添加)
错误示例:
# extend()不能接收非可迭代对象
# my_list.extend(10) # 错误:'int' object is not iterable
总结:
- 当需要添加单个元素时,使用
append()
- 当需要添加另一个可迭代对象中的所有元素时,使用
extend()
27. 如何实现两个列表的交集、并集、差集?
可以通过将列表转换为集合,利用集合的运算实现列表的交集、并集和差集:
-
交集:两个列表中都存在的元素
list1 = [1, 2, 3, 4, 5] list2 = [4, 5, 6, 7, 8]# 方法1:使用集合的&运算符 intersection = list(set(list1) & set(list2)) print(intersection) # [4, 5](顺序可能不同)# 方法2:使用集合的intersection()方法 intersection = list(set(list1).intersection(set(list2))) print(intersection) # [4, 5]
-
并集:两个列表中所有不重复的元素
# 方法1:使用集合的|运算符 union = list(set(list1) | set(list2)) print(union) # [1, 2, 3, 4, 5, 6, 7, 8](顺序可能不同)# 方法2:使用集合的union()方法 union = list(set(list1).union(set(list2))) print(union) # [1, 2, 3, 4, 5, 6, 7, 8]
-
差集:在第一个列表中但不在第二个列表中的元素
# 方法1:使用集合的-运算符 difference = list(set(list1) - set(list2)) print(difference) # [1, 2, 3](顺序可能不同)# 方法2:使用集合的difference()方法 difference = list(set(list1).difference(set(list2))) print(difference) # [1, 2, 3]
-
对称差集:两个列表中不重叠的元素(并集减去交集)
# 方法1:使用集合的^运算符 symmetric_diff = list(set(list1) ^ set(list2)) print(symmetric_diff) # [1, 2, 3, 6, 7, 8](顺序可能不同)# 方法2:使用集合的symmetric_difference()方法 symmetric_diff = list(set(list1).symmetric_difference(set(list2))) print(symmetric_diff) # [1, 2, 3, 6, 7, 8]
注意:
- 集合转换会去除重复元素并改变顺序
- 如果需要保留原始顺序或重复元素,需使用列表推导式:
# 保留顺序的交集(包含重复) intersection_ordered = [x for x in list1 if x in list2] print(intersection_ordered) # [4, 5]
28. 什么是有序字典(OrderedDict)?在Python3.7+中是否还有必要使用?
有序字典(OrderedDict) 是collections
模块中的一个类,它保留了键值对的插入顺序,在Python 3.7之前用于解决普通字典无序的问题。
示例:
from collections import OrderedDict# 创建有序字典
od = OrderedDict()
od["a"] = 1
od["b"] = 2
od["c"] = 3# 遍历顺序与插入顺序一致
for key, value in od.items():print(key, value)
# 输出:
# a 1
# b 2
# c 3# 移动元素到末尾
od.move_to_end("a")
print(list(od.keys())) # ['b', 'c', 'a']# 弹出第一个元素
od.popitem(last=False) # 删除并返回第一个元素 ('b', 2)
Python 3.7+中是否还有必要使用OrderedDict?
Python 3.7+的普通字典也开始保留插入顺序,但OrderedDict仍有其独特功能:
move_to_end(key)
:将指定键值对移动到开头或末尾popitem(last=True)
:可以选择弹出最后一个或第一个元素- 相等性比较:OrderedDict比较时会考虑顺序,而普通字典不考虑
# Python 3.7+ d1 = {"a": 1, "b": 2} d2 = {"b": 2, "a": 1} print(d1 == d2) # True(普通字典不考虑顺序)od1 = OrderedDict({"a": 1, "b": 2}) od2 = OrderedDict({"b": 2, "a": 1}) print(od1 == od2) # False(OrderedDict考虑顺序)
因此,在Python 3.7+中:
- 仅需保留插入顺序时,普通字典足够
- 需要上述独特功能时,仍需使用OrderedDict
29. 如何高效地反转一个列表或字符串?
Python提供了多种方法反转列表或字符串,其中最简洁高效的是使用切片操作:
-
反转列表:
# 方法1:切片操作(创建新列表) my_list = [1, 2, 3, 4, 5] reversed_list = my_list[::-1] print(reversed_list) # [5, 4, 3, 2, 1]# 方法2:使用reversed()函数(返回迭代器) reversed_iterator = reversed(my_list) reversed_list = list(reversed_iterator) print(reversed_list) # [5, 4, 3, 2, 1]# 方法3:原地反转(修改原列表) my_list.reverse() print(my_list) # [5, 4, 3, 2, 1]
-
反转字符串:
# 方法1:切片操作(最简洁高效) my_str = "hello" reversed_str = my_str[::-1] print(reversed_str) # "olleh"# 方法2:使用reversed()函数 reversed_chars = reversed(my_str) reversed_str = "".join(reversed_chars) print(reversed_str) # "olleh"
效率对比:
- 切片操作(
[::-1]
):简洁高效,时间复杂度O(n),但会创建新对象 reversed()
函数:返回迭代器,适合处理大型序列,内存效率高- 列表的
reverse()
方法:原地反转,不创建新对象,节省内存
选择建议:
- 字符串反转:优先使用切片
[::-1]
- 列表反转:如需保留原列表用切片,无需保留原列表用
reverse()
方法,处理大型列表用reversed()
30. 解释enumerate()
函数的作用及用法。
enumerate()
函数用于将一个可迭代对象(如列表、元组、字符串)组合为一个索引序列,同时返回索引和对应的值,常用于需要获取元素索引的遍历场景。
语法:enumerate(iterable, start=0)
iterable
:可迭代对象start
:索引的起始值,默认为0
用法示例:
-
基本用法:
fruits = ["apple", "banana", "cherry"]# 不指定start(默认从0开始) for index, fruit in enumerate(fruits):print(f"{index}: {fruit}") # 输出: # 0: apple # 1: banana # 2: cherry# 指定start(从1开始) for index, fruit in enumerate(fruits, start=1):print(f"{index}: {fruit}") # 输出: # 1: apple # 2: banana # 3: cherry
-
与字符串一起使用:
s = "hello" for i, char in enumerate(s):print(f"Index {i}: {char}") # 输出: # Index 0: h # Index 1: e # Index 2: l # Index 3: l # Index 4: o
-
转换为列表:
numbers = [10, 20, 30] enumerated = list(enumerate(numbers)) print(enumerated) # [(0, 10), (1, 20), (2, 30)]
-
替代传统的索引遍历:
# 传统方式 for i in range(len(fruits)):print(f"{i}: {fruits[i]}")# 使用enumerate更简洁 for i, fruit in enumerate(fruits):print(f"{i}: {fruit}")
enumerate()
函数使代码更简洁、可读性更高,避免了手动管理索引变量的麻烦,是Python中遍历带索引元素的推荐方式。
二、150道Python面试题目录列表
文章序号 | Python面试题150道 |
---|---|
1 | Python面试题及详细答案150道(01-15) |
2 | Python面试题及详细答案150道(16-30) |
3 | Python面试题及详细答案150道(31-40) |
4 | Python面试题及详细答案150道(41-55) |
5 | Python面试题及详细答案150道(56-70) |
6 | Python面试题及详细答案150道(71-80) |
7 | Python面试题及详细答案150道(81-90) |
8 | Python面试题及详细答案150道(91-100) |
9 | Python面试题及详细答案150道(101-115) |
10 | Python面试题及详细答案150道(116-125) |
11 | Python面试题及详细答案150道(126-135) |
12 | Python面试题及详细答案150道(136-150) |