我面的是od的python开发岗,有需要的同学可以参考一下。
首先是自我介绍,主要是让面试官对你有个整体的了解,讲一下会哪些技能,做过哪些项目等等。
下面就开始问一些八股文了
1、python中有哪些数据类型
整型、浮点型、布尔型、字符串、列表、元组、字典、集合
2、列表和元组有哪些差别
列表是一种可变的数据类型,可以使用 [] 进行创建, 元组是一种不可变类型,可以使用 () 进行创建,列表用于需要修改元素的场景,元组用于不需要对修改元素的场景。
3、python中的异常处理机制
python中主要是通过try-except语句来处理异常。
try-except
语句
-
try
块:包含可能引发异常的代码。如果在try
块中的任何地方抛出了异常,Python将立即跳转到匹配的except
块,而try
块内剩余的代码将不会执行。 -
except
块:用于捕获和处理特定类型的异常。可以指定捕获的异常类型,如果未指定则捕获所有异常。异常对象通常存储在变量e
中,可以在except
块中使用它来获取异常信息。 -
else
块(可选):在try
块中没有引发异常时执行的代码。它通常用于处理没有异常时的额外逻辑。 -
finally
块(可选):无论是否发生异常,最终都会执行的代码块。通常用于清理工作,例如释放资源或确保某些操作的完成。
try:
# 可能会引发异常的代码块
# 如果异常发生,后续代码将不会执行
pass # 这里可以是任何可能引发异常的代码
except ExceptionType as e:
# 异常处理代码块
# 当try块中引发了指定类型的异常时执行
# e为异常对象,包含异常信息
pass # 这里处理异常的逻辑
else:
# 可选的else块
# 当try块中没有引发异常时执行
pass
finally:
# 可选的finally块
# 无论是否发生异常,最终都会执行
pass
使用raise
语句可以引发一个指定的异常。它允许程序员在程序运行时主动生成异常,从而可以在特定情况下中断程序的正常执行流,并进入异常处理流程。
def validate_age(age):
if age < 0:
raise ValueError("Age cannot be negative")
if age < 18:
raise PermissionError("You must be at least 18 years old")
return True
try:
validate_age(-1)
except ValueError as e:
print(f"ValueError: {e}")
except PermissionError as e:
print(f"PermissionError: {e}")
4 、python中with语句的了解?
with
语句在Python中用于简化资源管理,确保资源在使用后被正确释放,例如文件、网络连接和锁。with语句的基本结构如下:
with context_manager as var:
# 使用var进行一些操作
pass
在这个结构中,context_manager
是一个实现了上下文管理协议的对象。上下文管理协议包括两个方法:
__enter__(self)
: 在进入with
块时被调用。__exit__(self, exc_type, exc_val, exc_tb)
: 在退出with
块时被调用,无论是否发生异常。
with语句用法
with
语句最常见的用法之一是处理文件操作。使用with
语句可以确保文件在使用完后被正确关闭。
# 写文件
with open('example.txt', 'w') as file:
file.write('First line.\n')
file.write('Second line.')
# 读文件
with open('example.txt', 'r') as file:
content = file.read()
print("File content after writing:")
print(content)
# 追加文件
with open('example.txt', 'a') as file:
file.write('\nAppended line.')
# 读文件
with open('example.txt', 'r') as file:
content = file.read()
print("File content after appending:")
print(content)
可以通过实现__enter__
和__exit__
方法来创建自定义的上下文管理器。例如,下面是一个简单的计时器上下文管理器:
import time
class Timer:
def __enter__(self):
self.start = time.time()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.end = time.time()
self.interval = self.end - self.start
print(f'Elapsed time: {self.interval:.2f} seconds')
# 使用自定义上下文管理器
with Timer() as t:
# 执行一些操作
time.sleep(2)
# Elapsed time: 2.00 seconds
with
语句通过简化资源管理和确保资源在使用后被正确释放,提高了代码的可读性和可靠性。
5、python中的多线程用法?
在Python中,多线程可以通过threading
模块来实现。多线程允许程序同时执行多个操作,提高程序的效率和响应速度。
import threading
# 定义线程要执行的函数
def print_numbers():
for i in range(10):
print(i)
# 创建线程对象
thread = threading.Thread(target=print_numbers)
# 启动线程
thread.start()
# 等待线程完成
thread.join()
在多线程环境中,多个线程可能会同时访问共享资源,导致竞争条件和数据不一致问题。可以使用线程同步机制来解决这些问题,例如Lock
。
import threading
# 定义全局变量
counter = 0
lock = threading.Lock()
# 定义线程要执行的函数
def increment_counter():
global counter
for _ in range(1000000):
with lock: # 获取锁,使用with语句确保锁在使用后可以被释放
counter += 1 # 访问共享资源
# 创建多个线程
threads = []
for i in range(2):
thread = threading.Thread(target=increment_counter)
threads.append(thread)
thread.start()
# 等待所有线程完成
for thread in threads:
thread.join()
print(f'Final counter value: {counter}')
下面就是手撕代码环节了
手撕代码是在力扣上做题,给我面试的面试官人还挺好,选了几道题,都是一步步开始加大难度。
刷了四道题,最后一道时间来不及,给了出题思路
35、205、347、494
参考连接