python基础面试

*args和**kwargs:

*args接收可变数量的位置参数(元组)
**kwargs接收可变数量的关键字参数(字典)

grep查找a.txt文件中某字符,并打印该字符的位置.-n显示行号,-o仅输出匹配字符,-b显示字节偏移量

grep -nob '目标字符' a.txt

is和==的区别:

==
比较值是否相等;is比较内存地址(是否为同一对象)。
例:a = [1],b = [1],则a == b为True,a is b为False

None和空字符串""、空列表[]的区别?

| 特性   | None      | ""(空字符串) | [](空列表) |
| ---- | --------- | -------- | ------- |
| ‌类型‌ | NoneType  | str      | list    |
| ‌用途‌ | 标记未定义或缺失值 | 文本处理     | 动态集合    |
| ‌比较‌ | 必须用is     | 可用==     | 可用==    |
| ‌方法‌ | 无方法       | 支持字符串方法  | 支持列表方法  |

几种内置的数据类型

str、int、float、bool、list、dict、tuple

Python2与Python3中range()函数的区别(如返回类型、内存占用)

python2 返回list
python3 返回生成器

Python中的数据结构(队列、堆栈、hashmap之类的)

1. 队列(Queue)
队列是一种先进先出(FIFO)的数据结构。Python中可以使用queue模块中的Queue类来实现队列。

使用queue.Queue
import queue
 
q = queue.Queue()
q.put('item1')
q.put('item2')
print(q.get())  # 输出: item1
print(q.get())  # 输出: item2
2. 堆栈(Stack)
堆栈是一种后进先出(LIFO)的数据结构。Python中可以使用列表(list)来实现堆栈,通过列表的append()和pop()方法。

使用列表实现堆栈
stack = []
stack.append('item1')
stack.append('item2')
print(stack.pop())  # 输出: item2
print(stack.pop())  # 输出: item1
3. 哈希映射(HashMap/Dictionary)
哈希映射是一种存储键值对的数据结构,其中每个键映射到一个值。在Python中,字典(dict)是实现哈希映射的标准方式。

使用字典
d = {'key1': 'value1', 'key2': 'value2'}
d['key3'] = 'value3'
print(d['key1'])  # 输出: value1
print('key2' in d)  # 输出: True
del d['key2']
print(d)  # 输出: {'key1': 'value1', 'key3': 'value3'}
4. 优先队列(Heap)
优先队列是一种特殊的队列,其中每个元素都有优先级,元素按照优先级进行排序。Python中可以使用heapq模块来实现堆(heap)。

使用heapq实现优先队列
import heapq
 
heap = []
heapq.heappush(heap, (5, 'write code'))
heapq.heappush(heap, (1, 'sleep'))
heapq.heappush(heap, (4, 'eat'))
print(heapq.heappop(heap))  # 输出: (1, 'sleep')
5. 双端队列(Deque)
双端队列是一种允许从两端添加或删除元素的队列。Python中可以使用collections模块中的deque类来实现双端队列。

使用collections.deque
from collections import deque
 
d = deque(['item1', 'item2', 'item3'])
d.append('item4')  # 在右侧添加元素
d.appendleft('item0')  # 在左侧添加元素
print(d.pop())  # 输出: item4,从右侧弹出元素
print(d.popleft())  # 输出: item0,从左侧弹出元素

字典合并

# 方法1:update() 原地修改
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
dict1.update(dict2)  # dict1变为 {'a':1, 'b':3, 'c':4}

# 方法2:解包操作符(Python 3.5+)
merged = {**dict1, **dict2}  # 新建字典 {'a':1, 'b':3, 'c':4}

# 方法3:collections.ChainMap(逻辑合并)
from collections import ChainMap
chained = ChainMap(dict1, dict2)  # 不创建新字典

# 方法4:Python 3.9+ 合并运算符
merged = dict1 | dict2  # 新建字典 {'a':1, 'b':3, 'c':4}

列表去重

# 方法1:使用set() - 最简单但无序
original_list = [3, 5, 2, 3, 8, 5]
unique_list = list(set(original_list))
# 方法2:保持原始顺序(Python 3.7+)
unique_ordered = list(dict.fromkeys(original_list))

简述面向对象中__new__和__init__区别

__new__:

  负责创建对象。
  返回一个新对象的实例。
  是一个静态方法。
__init__:

  负责初始化对象的属性。
  不返回新对象,只返回 None。
  是一个实例方法。

collections模块中的defaultdict、OrderedDict、deque有什么用?

‌1. defaultdict(默认字典)‌
‌用途‌:自动处理字典中不存在的键,避免KeyError异常
‌核心功能‌:
初始化时需指定默认值工厂(如int、list、set或自定义函数
访问缺失键时自动生成默认值(如int对应0,list对应空列表[])
‌典型场景‌:
统计词频时无需手动初始化计数器
分组数据(如按类别存储多个条目)
‌2. OrderedDict(有序字典)‌
‌用途‌:保留键值对的插入顺序,适用于需要顺序一致性的场景
‌核心功能‌:
元素遍历顺序与插入顺序一致
支持move_to_end()方法调整键的位置
‌典型场景‌:
缓存淘汰策略(如LRU缓存
需要顺序记录的配置或日志处理
‌3. deque(双端队列)‌
‌用途‌:高效的两端插入/删除操作,适用于队列和栈结构
‌核心功能‌:
支持appendleft()、popleft()等操作,时间复杂度为O(1)
线程安全,适合多线程任务
‌典型场景‌:
广度优先搜索(BFS)算法
实时数据流处理(如滑动窗口)

list.sort()和sorted()的区别?

| 特性        | list.sort() | sorted()            |
| --------- | ----------- | ------------------- |
| ‌作用对象‌    | 仅限列表(原地修改)  | 任何可迭代对象(字符串、元组、字典等) |
| ‌返回值‌     | 无(直接修改原列表)  | 返回新排序后的列表           |
| ‌原数据是否改变‌ | 是           | 否                   |
| ‌方法类型‌    | 列表的成员方法     | 内置函数                |

列表的append()和extend()的区别?

方法	参数类型	结果行为	示例
append()	任意类型(单个元素)	将参数作为‌单个元素‌追加	[1, 2].append([3]) → [1, 2, [3]]
extend()	可迭代对象(如列表)	将参数‌展开合并‌到原列表	[1, 2].extend([3]) → [1, 2, 3]

如何遍历字典的键值对?d.items()

for key, value in d.items():
    print(key, value)  # 直接获取键值对

Python面向对象编程中常用的内置方法(魔法方法)

对象生命周期控制
__new__(cls):类实例化时首先调用的方法,负责创建并返回实例对象,常用于单例模式等场景
__init__(self):初始化方法,在__new__之后自动调用,用于设置对象初始属性
__del__(self):对象销毁时触发,用于资源清理操作
对象表示与转换
__str__(self):定义print(obj)或str(obj)时的输出内容
__repr__(self):返回对象的官方字符串表示,通常用于调试
__format__(self):控制format()函数的格式化输出
比较运算相关
__eq__(self, other):定义==运算符行为
__lt__(self, other)
__gt__(self, other):定义<和>比较
__le__(self, other)
__ge__(self, other):定义<=和>=比较
容器类型模拟
__len__(self):定义len()函数的返回值
__getitem__(self, key):实现下标访问(如obj[key])
__setitem__(self, key, value):实现下标访问(如obj[key])
__iter__(self):使对象可迭代
__next__(self):使对象可迭代
属性访问控制
__getattr__(self, name):访问不存在的属性时触发
__setattr__(self, name, value):设置属性时触发
__getattribute__(self, name):访问任何属性时都会触发
其他重要方法
__call__(self):使实例可像函数一样调用(如obj())
__enter__(self) :实现上下文管理器协议(with语句)
__exit__(self):实现上下文管理器协议(with语句)
__hash__(self):定义hash()函数的返回值

列表、字典、集合常用方法

列表

1	list.append(obj) 在列表末尾添加新的对象
2	list.count(obj) 统计某个元素在列表中出现的次数
3	list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4	list.index(obj) 从列表中找出某个值第一个匹配项的索引位置
5	list.insert(index, obj)将对象插入列表
6	list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
7	list.remove(obj) 移除列表中某个值的第一个匹配项
8	list.reverse() 反向列表中元素
9	list.sort( key=None, reverse=False) 对原列表进行排序
10	list.clear() 清空列表
11	list.copy() 复制列表

字典

1	dict.clear() 删除字典内所有元素
2	dict.copy() 返回一个字典的浅复制
3	dict.fromkeys() 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
4	dict.get(key, default=None) 返回指定键的值,如果键不在字典中返回 default 设置的默认值
5	key in dict 如果键在字典dict里返回true,否则返回false
6	dict.items() 以列表返回一个视图对象
7	dict.keys() 返回一个视图对象
8	dict.setdefault(key, default=None) 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
9	dict.update(dict2) 把字典dict2的键/值对更新到dict里
10	dict.values() 返回一个视图对象
11	dict.pop(key[,default]) 删除字典 key(键)所对应的值,返回被删除的值。
12	dict.popitem() 返回并删除字典中的最后一对键和值。

集合

| add()                         | 为集合添加元素                                         
| ----------------------------- | ----------------------------------------------- 
| clear()                       | 移除集合中的所有元素                                      
| copy()                        | 拷贝一个集合                                          
| difference()                  | 返回多个集合的差集                                       
| difference_update()           | 移除集合中的元素,该元素在指定的集合也存在。                          
| discard()                     | 删除集合中指定的元素                                      
| intersection()                | 返回集合的交集                                         
| intersection_update()         | 返回集合的交集。                                        
| isdisjoint()                  | 判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。         
| issubset()                    | 判断指定集合是否为该方法参数集合的子集。                            
| issuperset()                  | 判断该方法的参数集合是否为指定集合的子集                            
| pop()                         | 随机移除元素                                          
| remove()                      | 移除指定元素                                          
| symmetric_difference()        | 返回两个集合中不重复的元素集合。                                
| symmetric_difference_update() | 移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。 
| union()                       | 返回两个集合的并集                                       
| update()                      | 给集合添加元素                                         
| len()                         | 计算集合元素个数                                        
posted @ 2025-08-04 14:41  朝阳1  阅读(11)  评论(0)    收藏  举报