公司动态
Python面试必备:字符串、列表与字典操作精解
1. Python面试问题精选(21-40)解析作为Python开发者面试中经常会被问到各种基础知识和实际问题。这些问题不仅能检验你的Python功底也能反映你的编程思维和解决问题的能力。下面我将详细解析21-40题涵盖字符串处理、列表操作、字典使用等核心知识点。2. 字符串处理相关问题2.1 字符串大小写转换问题21将hello world转换为首字母大写Hello Worlds hello world result s.title() print(result) # 输出: Hello World注意title()方法会将每个单词的首字母大写其他字母小写。如果只需要第一个单词首字母大写可以使用capitalize()方法。问题22检测字符串是否只含数字# 方法1不包含正负号的情况 s 32323 print(s.isdigit()) # True # 方法2包含正负号的情况 import re s 123 print(bool(re.match(r^[-]?\d$, s))) # True2.2 字符串反转与格式化问题23反转字符串ilovechinas ilovechina reversed_s s[::-1] # 使用切片反转字符串 print(reversed_s) # 输出: anihcevoli问题24Python字符串格式化方式name Alice # 1. %s占位符 print(Hello %s % name) # 2. format()方法 print(Hello {}.format(name)) # 3. f-string (Python 3.6) print(fHello {name})提示f-string是Python 3.6引入的最新的字符串格式化方法性能最好可读性最强推荐使用。2.3 字符串空格处理问题25去除字符串开头和末尾的空格s adabdw stripped s.strip() print(stripped) # 输出: adabdw问题31去除字符串中多余空格只保留一个s 你好 中国 result .join(s.split()) print(result) # 输出: 你好 中国3. 列表操作相关问题3.1 列表去重与合并问题32列表去重alist [1, 2, 3, 1, 2] unique_list list(set(alist)) # 使用集合去重 print(unique_list) # 输出: [1, 2, 3]注意这种方法会改变原始顺序。如需保持顺序可以使用from collections import OrderedDict unique_list list(OrderedDict.fromkeys(alist))问题36合并两个列表a [1, 5, 7, 9] b [2, 2, 6, 8] # 方法1extend a.extend(b) print(a) # [1, 5, 7, 9, 2, 2, 6, 8] # 方法2切片赋值 a[len(a):] b print(a) # 方法3运算符 c a b print(c)3.2 列表展开与打乱问题35展开嵌套列表nested [[1, 2], [3, 4], [5, 6]] flat [item for sublist in nested for item in sublist] print(flat) # 输出: [1, 2, 3, 4, 5, 6]问题37打乱列表元素顺序import random a [1, 2, 3, 4, 5] random.shuffle(a) print(a) # 输出随机顺序如: [3, 1, 5, 2, 4]4. 字典操作相关问题4.1 字典排序与合并问题39按年龄排序字典列表people [ {name: alice, age: 38}, {name: bob, age: 18}, {name: Carl, age: 28} ] sorted_people sorted(people, keylambda x: x[age]) print(sorted_people) # 输出: [{name: bob, age: 18}, {name: Carl, age: 28}, {name: alice, age: 38}]问题40合并两个字典a {A: 1, B: 2} b {C: 3, D: 4} # 方法1update c {} c.update(a) c.update(b) # 方法2dict构造函数 c dict(a, **b) # 方法3解包(Python 3.5) c {**a, **b} # 推荐方式 print(c) # 输出: {A: 1, B: 2, C: 3, D: 4}4.2 字典生成与转换问题41使用生成式创建字典squares {x: x*x for x in range(6)} print(squares) # 输出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}问题42将元组转换为字典keys (a, b) values (1, 2) d dict(zip(keys, values)) print(d) # 输出: {a: 1, b: 2}5. 综合数据类型问题5.1 数据类型转换问题45tuple和list的转换# tuple转list t (1, 2, 3) l list(t) print(l) # 输出: [1, 2, 3] # list转tuple l [4, 5, 6] t tuple(l) print(t) # 输出: (4, 5, 6)问题47列表推导式改为生成器# 列表推导式 list_comp [i for i in range(3)] # 返回列表 print(list_comp) # 输出: [0, 1, 2] # 生成器表达式 gen_exp (i for i in range(3)) # 返回生成器对象 print(list(gen_exp)) # 输出: [0, 1, 2]5.2 编码与字节操作问题48字符串编码为bytes类型a hello b 你好 a_bytes a.encode(utf-8) b_bytes b.encode(utf-8) print(a_bytes) # 输出: bhello print(b_bytes) # 输出: b\xe4\xbd\xa0\xe5\xa5\xbd6. 操作类题目解析6.1 文件与日期操作问题52文件读取方法比较 read(): 读取整个文件内容为字符串 readline(): 每次读取一行 readlines(): 读取所有行并返回列表 with open(file.txt) as f: content f.read() # 整个内容作为字符串 with open(file.txt) as f: line f.readline() # 每次读取一行 with open(file.txt) as f: lines f.readlines() # 所有行作为列表问题56计算N天后的日期from datetime import datetime, timedelta def get_future_date(n): current datetime.strptime(20190530, %Y%m%d) future current timedelta(daysn) return future.strftime(%Y%m%d) print(get_future_date(2)) # 输出: 201906016.2 函数与闭包问题57返回乘法函数def multiplier(n): def wrapper(m): return n * m return wrapper times3 multiplier(3) print(times3(5)) # 输出: 15问题60with语句的使用# with语句确保文件正确关闭 with open(file.txt, r) as f: content f.read() # 文件在这里已经自动关闭7. 高级特性问题7.1 装饰器与垃圾回收问题63函数装饰器示例import time def time_it(func): def wrapper(*args, **kwargs): start time.time() result func(*args, **kwargs) end time.time() print(f{func.__name__} took {end-start:.2f} seconds) return result return wrapper time_it def slow_function(): time.sleep(2) slow_function() # 输出: slow_function took 2.00 seconds问题64Python垃圾回收机制Python主要使用引用计数机制进行内存管理每个对象维护一个引用计数当引用计数为0时对象被回收循环引用通过分代回收机制处理7.2 魔法方法与元类问题65__call__方法使用class Adder: def __call__(self, x, y): return x y add Adder() print(add(2, 3)) # 输出: 5问题70metaclass示例class SingletonMeta(type): _instances {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] super().__call__(*args, **kwargs) return cls._instances[cls] class Singleton(metaclassSingletonMeta): pass a Singleton() b Singleton() print(a is b) # 输出: True8. 正则表达式问题问题80匹配HTML标签内容import re html htmlh1www.baidu.com/html pattern rh1(.*?)/h1 match re.search(pattern, html) if match: print(match.group(1)) # 输出: www.baidu.com问题82匹配邮箱正则表达式import re pattern r^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$ email testexample.com print(bool(re.match(pattern, email))) # True9. 其他实用问题9.1 异常处理与调试问题92自定义异常示例class NameTooShortError(ValueError): pass def validate_username(username): if len(username) 4: raise NameTooShortError(Username too short) return True try: validate_username(abc) except NameTooShortError as e: print(fError: {e}) # 输出: Error: Username too short问题96断言使用场景def divide(a, b): assert b ! 0, 除数不能为零 return a / b print(divide(10, 2)) # 5.0 print(divide(10, 0)) # AssertionError: 除数不能为零9.2 实用函数与模块问题88enumerate使用示例fruits [apple, banana, cherry] for index, fruit in enumerate(fruits, start1): print(f{index}. {fruit}) 输出: 1. apple 2. banana 3. cherry 问题97lambda表达式应用# 排序字典按值 d {a: 2, b: 1, c: 3} sorted_items sorted(d.items(), keylambda x: x[1]) print(sorted_items) # 输出: [(b, 1), (a, 2), (c, 3)]10. 算法与数据结构问题10.1 查找与排序算法问题115二分查找实现def binary_search(arr, target): left, right 0, len(arr) - 1 while left right: mid (left right) // 2 if arr[mid] target: return mid elif arr[mid] target: left mid 1 else: right mid - 1 return -1 arr [1, 3, 5, 7, 9] print(binary_search(arr, 5)) # 输出: 2 print(binary_search(arr, 6)) # 输出: -1问题121快速排序实现def quicksort(arr): if len(arr) 1: return arr pivot arr[len(arr) // 2] left [x for x in arr if x pivot] middle [x for x in arr if x pivot] right [x for x in arr if x pivot] return quicksort(left) middle quicksort(right) print(quicksort([3,6,8,10,1,2,1])) # 输出: [1, 1, 2, 3, 6, 8, 10]10.2 链表操作问题125单链表反转class ListNode: def __init__(self, val0, nextNone): self.val val self.next next def reverse_list(head): prev None current head while current: next_node current.next current.next prev prev current current next_node return prev # 测试 head ListNode(1, ListNode(2, ListNode(3))) reversed_head reverse_list(head) while reversed_head: print(reversed_head.val, end ) # 输出: 3 2 1 reversed_head reversed_head.next11. 爬虫相关问题11.1 请求与响应处理问题130requests.content vs requests.textimport requests r requests.get(https://www.example.com) print(type(r.content)) # class bytes print(type(r.text)) # class str # content返回原始字节内容适合非文本内容如图片 # text返回解码后的字符串自动处理编码问题135常见反爬虫措施及应对User-Agent检测 - 随机更换User-AgentIP限制 - 使用代理IP池验证码 - 使用打码平台或机器学习识别请求频率限制 - 添加随机延迟JavaScript渲染 - 使用Selenium或Pyppeteer11.2 Scrapy框架问题132Scrapy工作流程引擎从调度器获取初始请求引擎将请求发送给下载器下载器获取响应并返回给引擎引擎将响应发送给Spider处理Spider解析响应返回Items或新的Requests引擎将Items发送给Item Pipeline处理将新的Requests发送给调度器重复上述过程直到没有新的请求问题141Scrapy与Scrapy-Redis区别Scrapy-Redis在Scrapy基础上添加了Redis支持实现了分布式调度请求去重数据共享断点续爬选择Redis是因为其高性能、支持持久化和丰富的数据结构。12. 网络编程问题12.1 TCP/UDP比较问题148TCP与UDP区别特性TCPUDP连接方式面向连接无连接可靠性可靠传输不可靠顺序保证顺序不保证速度较慢较快流量控制有无应用场景网页、邮件视频、游戏12.2 三次握手与四次挥手问题149TCP连接过程三次握手建立连接客户端发送SYN1, seqx服务端响应SYN1, ACK1, seqy, ackx1客户端发送ACK1, seqx1, acky1四次挥手断开连接主动方发送FIN1, sequ被动方响应ACK1, acku1被动方发送FIN1, seqv主动方响应ACK1, ackv1TIME_WAIT状态持续2MSL时间确保最后一个ACK到达并让网络中残留的报文段失效。13. 并发编程问题13.1 多线程与多进程问题152多线程、多进程与协程比较类型切换开销内存占用并行性适用场景多线程小小伪并行(GIL限制)I/O密集型多进程大大真并行CPU密集型协程极小极小单线程内并发高并发I/O问题153GIL全局解释器锁GIL是CPython解释器中的互斥锁同一时刻只允许一个线程执行Python字节码。这是因为CPython的内存管理不是线程安全的。GIL导致Python多线程在CPU密集型任务中无法充分利用多核优势但在I/O密集型任务中影响不大。13.2 线程池与IO多路复用问题151concurrent.futures线程池示例from concurrent.futures import ThreadPoolExecutor import time def task(n): time.sleep(1) return n * n with ThreadPoolExecutor(max_workers3) as executor: futures [executor.submit(task, i) for i in range(5)] for future in futures: print(future.result()) # 输出: 0, 1, 4, 9, 16问题155IO多路复用作用IO多路复用允许单个线程同时监控多个文件描述符当其中任意一个就绪时就能进行读写操作避免了多线程/多进程的开销。常见的实现有select、poll和epoll其中epoll性能最好适合高并发场景。14. Git相关问题问题160常用Git命令git init # 初始化仓库 git clone url # 克隆远程仓库 git add file # 添加文件到暂存区 git commit -m # 提交更改 git push # 推送到远程 git pull # 从远程拉取 git branch # 查看分支 git checkout # 切换分支 git merge # 合并分支 git log # 查看提交历史问题161查看某次提交内容# 先查看提交历史获取commit id git log # 查看特定提交的详细内容 git show commit_id # 查看最近一次提交的修改 git show HEAD # 查看最近n次提交的修改 git log -p -n