Python技术题1
1.技术面试题
(1)TCP与UDP的区别是什么?
答: TCP(传输控制协议)和 UDP(用户数据报协议)是 TCP/IP 协议族中两种重要的传输层协议,主要区别如下:
连接性:TCP 是面向连接的协议,通信前需通过三次握手建立连接,结束后通过四次挥手断开连接;UDP 是无连接的,通信前无需建立连接,直接发送数据。
可靠性:TCP 通过序号、确认重传、流量控制、拥塞控制等机制保证数据可靠传输,确保数据无丢失、无重复、按序到达;UDP 不提供这些机制,数据传输不可靠,可能丢失或乱序。
传输效率:TCP 因需处理连接管理和可靠性机制,传输效率较低;UDP 无需这些额外操作,传输效率高,延迟小。
数据边界:TCP 是字节流协议,不保留数据边界,接收方需自行处理数据拆分;UDP 是数据报协议,每个数据报都是独立的,保留数据边界。
适用场景:TCP 适用于对可靠性要求高的场景,如文件传输(FTP)、网页浏览(HTTP/HTTPS)、邮件发送(SMTP)等;UDP 适用于对实时性要求高、可容忍少量数据丢失的场景,如视频通话、音频流媒体、在线游戏等。
(2)DHCP和DNS的作用是什么?
答: DHCP(动态主机配置协议):主要作用是为网络中的设备动态分配 IP 地址及其他网络配置参数(如子网掩码、默认网关、DNS 服务器地址等)。通过 DHCP,网络管理员无需手动为每个设备配置 IP 地址,减少了配置错误,简化了网络管理,尤其适用于设备数量多、频繁变动的网络环境。
DNS(域名系统):作用是将人类易于记忆的域名(如www.example.com)转换为计算机可识别的 IP 地址(如 192.168.1.1)。因为计算机之间通信依靠 IP 地址,但域名更便于用户记忆,DNS 解决了 IP 地址难以记忆的问题,使得用户能通过域名便捷地访问网络资源。
(3)简述 Linux 文件系统的目录结构,其中/boot、/var、/usr目录的作用分别是什么?
答: Linux 文件系统采用树形结构,以根目录(/)为起点,各子目录按功能分类存放文件。主要目录包括 /(根目录)、/bin(基本命令二进制文件)、/sbin(系统管理命令二进制文件)、/etc(系统配置文件)、/home(普通用户主目录)、/root(超级用户主目录)、/lib(系统库文件)、/mnt(临时挂载点)、/media(可移动设备挂载点)等。
/boot:存放启动 Linux 系统所需的文件,如内核镜像文件、引导加载程序(GRUB)配置文件等,是系统启动的关键目录。 /var:用于存放经常变化的文件,如日志文件(/var/log)、邮件(/var/mail)、缓存文件(/var/cache)、数据库文件等。 /usr:是 Unix 系统资源的缩写,存放系统软件资源。其中 /usr/bin 存放用户常用命令,/usr/sbin 存放系统管理命令,/usr/lib 存放库文件,/usr/share 存放共享数据(如文档、图标等)。
(4)Linux系统突然无法访问外网,但内网通信正常。请列出至少 5 个可能的故障点及排查步骤。
答:
1.默认网关配置错误或失效: 排查步骤:使用ip route或route -n查看默认网关是否存在。若不存在,检查网关配置文件(如 /etc/sysconfig/network-scripts/ifcfg-*);若存在,尝试ping网关 IP,判断网关是否可达。 2.DNS 服务器配置问题: 排查步骤:查看 /etc/resolv.conf 文件,确认 DNS 服务器地址是否正确。使用nslookup或dig命令测试域名解析,如nslookup www.baidu.com,若无法解析,尝试更换 DNS 服务器(如公共 DNS 8.8.8.8)。 3.外网防火墙规则限制: 排查步骤:使用iptables -L或firewall-cmd --list-all查看防火墙规则,检查是否有阻止外网访问的规则。尝试临时关闭防火墙(如systemctl stop firewalld),测试是否能访问外网。 4.网络接口速率或双工模式不匹配: 排查步骤:使用ethtool 网卡名(如 eth0)查看网络接口状态,检查速率和双工模式是否与交换机匹配。若不匹配,通过ethtool -s 网卡名 speed 100 duplex full修改(需根据实际情况调整参数)。 5.ISP 或上级网络故障: 排查步骤:检查同网络中其他设备是否能访问外网,若均不能,可能是上级网络(如路由器、光猫)或 ISP 故障。尝试重启上级网络设备,或联系 ISP 确认故障。
2.HR面试题
(1)假如你成功入职,却发现直属领导能力远不如你,你会如何与他共事?
答: 首先,我会客观看待 “能力” 的定义,领导可能在管理协调、资源整合或行业经验等方面有我未察觉的优势,避免先入为主的判断。工作中,我会尊重领导的职权,主动沟通汇报工作进展,让领导了解我的工作思路和成果。若遇到专业问题,我会以请教的方式提出建议,用数据和事实支撑观点,协助领导做出决策。同时,我会聚焦工作目标,以团队利益为重,主动承担更多责任,确保任务顺利完成。此外,我会保持谦逊的态度,通过日常相处观察领导的优点,学习其可借鉴之处,共同成长。总之,我会以积极合作的心态共事,通过高效沟通和执行力,维护团队协作的稳定性,推动工作达成。
(2)你简历上的经历并不突出,我们为什么要选你?
答: 虽然我的简历经历可能不够 “亮眼”,但我认为自己有几个特质适合这个岗位:一是扎实的专业基础,在学校和实习中系统学习了相关技能(可结合岗位提及具体技能),并通过实际项目(如 XX 项目)积累了实践经验;二是强烈的学习能力和适应力,面对新任务能快速掌握要点,例如在之前的实习中,我用一周时间掌握了 XX 工具并独立完成了分配的任务;三是高度的责任心和团队意识,注重细节且乐于配合他人,确保工作质量。我相信这些特质能让我快速融入团队,为公司创造价值,也希望能在岗位上通过实际表现证明自己的能力。
(3)你还面试了哪些公司?
答: 目前我确实在同时接触几家公司,主要集中在与贵公司类似的行业领域,岗位也都是与我专业和职业规划相符的方向。这是因为我希望通过多方面的了解,找到最适合自己长期发展的平台。贵公司在 [提及公司优势,如技术实力、行业口碑、企业文化等] 方面的优势很吸引我,也是我重点考虑的对象。无论其他面试结果如何,我都会认真对待与贵公司的沟通,希望能有机会加入这个团队。
(4)如果你发现公司某项业务存在合规风险,但领导暗示‘别多管闲事’,你会怎么做?
答: 首先,我会再次核实合规风险的具体情况,收集相关依据(如法律法规条文、行业规范),确保判断的准确性。然后,我会选择合适的时机与领导单独沟通,客观说明风险的具体内容、可能造成的后果(如法律责任、品牌损失等),并提出可行的规避建议,让领导了解问题的严重性。若领导仍坚持,我会考虑风险的等级:若涉及重大违法违规,我会向上级部门或合规部门反映;若风险较轻,我会在职责范围内做好记录,同时继续关注事态发展,尽最大努力降低风险。合规是企业的生命线,也是我的职业底线,我会在维护团队和谐的前提下,坚守这一原则。
3.选择题
(1)以下哪个是合法的 Python 变量名?
A. 2var
B. _var
C. var@1
D. var-1
答: B
(2)表达式 True + 2
的结果是? A.True
B. 3
C. 2
D. TypeError
答: B
(3)以下哪个表达式会引发错误?
A."1" + "2"
B. [1, 2] + [3, 4]
C. (1, 2) + (3, 4)
D. {1, 2} + {3, 4}
答: D
(4)以下哪个是将字符串转换为整数的正确方法?
A. str(5)
B. int("5")
C. float("5")
D. bool("5")
答: B
(5)执行 print("Hello", "World", sep='-', end='!')
后,输出结果是?
A .Hello World
B. Hello-World
C. Hello-World!
D. Hello World!
答:C
(6)以下哪个运算符用于判断两个对象是否是同一个对象(内存地址相同)?
A. ==
B. !=
C. is
D. in
答: C
(7)执行 print(f"The result is {2 + 3}") ,输出结果是?
A. The result is {2 + 3}
B. The result is 5
C. The result is 2 + 3
D. 语法错误
答: B
(8)以下代码的输出结果是?
x = 5 if x > 3: print("A") elif x > 4: print("B") else: print("C")
A. A
B. B
C. C
D. 无输出
答: A
(9)以下代码是否存在错误?
A = 10 if A > 5: print("Big") elif A < 5: print("Small") else print("Medium")
A. 无错误
B. 缩进错误
C. else
后缺少冒号
D. elif
条件错误
答:C
(10)以下代码的输出结果是?
x = 0 if x: print("True") else: print("False")
A. True
B. False
C. 语法错误
D. 无输出
答: B
(11)以下代码的输出结果是?
A = 10 B = 20 if A > 5 and B < 15: print("条件1") elif A > 8 or B > 18: print("条件2") else: print("条件3")
A. 条件 1
B. 条件 2
C. 条件 3
D. 无输出
答: B
(12)以下代码的输出结果是?
A = 5 B = 10 if A > 3 or B / 0 > 0: print("A") else: print("B")
A. A
B. B
C. 语法错误
D. 运行时错误
答: A
4.问答题
(1)什么是 Python 的动态类型特性?举例说明。
答:Python 的动态类型特性指的是变量的类型不需要预先声明,且在程序运行过程中可以动态改变。即变量的类型由其当前赋值的对象决定,同一个变量可以在不同时刻指向不同类型的对象。
例如:
变量a初始值为整数,此数类型为int
a = 10 print(type(a)) # 输出:<class 'int'>
同一变量a赋值为字符串,类型动态变为str
a = "hello" print(type(a)) # 输出:<class 'str'>
再次赋值为列表,类型变为list
a = [1, 2, 3] print(type(a)) # 输出:<class 'list'>
(2)如何将字符串 "123" 转换为整数?如果字符串为 "12a3" 会发生什么?
答: 将字符串 "123" 转换为整数可以使用 int() 函数,例如:int("123"),结果为整数 123。
如果字符串为 "12a3",使用 int("12a3") 会抛出 ValueError 异常,因为字符串中包含非数字字符,无法直接转换为整数。错误信息类似:ValueError: invalid literal for int() with base 10: '12a3'。
(3)比较 Python 中的动态类型与静态类型语言(如 Java)的优缺点。
答: 动态类型(如 Python)与静态类型(如 Java)的优缺点对比如下:
对比维度 动态类型(Python) 静态类型(Java) 开发效率:优点:无需声明类型,代码简洁,开发速度快。 缺点:需预先声明类型,代码量较大,开发初期效率较低。 错误检测:缺点:类型错误仅在运行时暴露,调试成本可能较高。 优点:编译时即可检测类型错误,提前规避潜在问题。 灵活性:优点:变量可动态切换类型,适合快速迭代和原型开发。 缺点:类型固定,灵活性较低,修改类型需重构代码。 性能:缺点:运行时需动态检查类型,性能略低。 优点:编译时确定类型,可优化执行效率,性能较高。 可读性与维护性:缺点:大型项目中类型不明确,可能降低代码可读性和维护性。
(4)简述 input() 函数和 eval() 函数的区别,并举例说明它们的应用场景。
答: input () 函数:用于接收用户的键盘输入,无论输入内容是什么,均返回字符串类型。 应用场景:获取用户的文本输入(如用户名、密码、简单指令等)。 示例:name = input("请输入姓名:"),若用户输入 "Alice",则 name 为字符串 "Alice"。
eval () 函数:用于执行一个字符串表达式,并返回表达式的结果。它会将字符串解析为 Python 代码并执行。 应用场景:动态计算用户输入的数学表达式,或解析简单的结构化数据(如列表、字典的字符串表示)。 示例:result = eval("2 + 3 * 4"),结果为 14;lst = eval("[1, 2, 3]"),结果为列表 [1, 2, 3]。
两者的核心区别:input() 仅做输入接收,返回字符串;eval() 对字符串进行解析执行,返回执行结果。
(5)比较 == 运算符和 is 运算符的区别,并举例说明在什么情况下结果会不同。
答: 算符:用于判断两个对象的值是否相等(即内容是否一致)。 is 运算符:用于判断两个对象是否为同一个(即内存地址是否相同)。
在某些情况下,两者结果会不同,例如对于小整数以外的对象:
示例一:列表对象
a = [1, 2, 3] b = [1, 2, 3]
print(a == b) # True(值相等) print(a is b) # False(内存地址不同,是两个不同的列表对象)
示例二:字符串(长字符串)
c = "hello world" * 1000 d = "hello world" * 1000
print(c == d) # True(值相等) print(c is d) # False(内存地址不同,未触发字符串驻留机制)
(6)逻辑运算符 and、or、not 的运算规则是什么?请分别举例说明。
答:
Python 中逻辑运算符的运算规则如下:
and(与): 规则:当两个操作数都为真时,结果为真;否则为假。如果第一个操作数为假,直接返回第一个操作数(短路求值),否则返回第二个操作数。 示例:3 > 2 and 5 > 4 结果为 True;0 and 5 结果为 0(第一个操作数为假,直接返回 0)。 or(或): 规则:当两个操作数至少有一个为真时,结果为真;否则为假。如果第一个操作数为真,直接返回第一个操作数(短路求值),否则返回第二个操作数。 示例:3 > 5 or 5 > 4 结果为 True;0 or 5 结果为 5(第一个操作数为假,返回第二个操作数)。 not(非): 规则:对操作数取反,真变假,假变真。 示例:not True 结果为 False;not 0 结果为 True(0 视为假,取反为真)。
(7)当使用 input() 函数获取用户输入的数字时,如何将其转换为整数类型?如果用户输入的不是数字,会发生什么?
答: 将 input() 获取的数字转换为整数的方法:先通过 input() 接收字符串,再用 int() 函数转换。例如: num = int(input("请输入一个数字:"))。
如果用户输入的不是数字(如 "abc"、"12a3"),int() 函数会抛出 ValueError 异常,提示无法将字符串转换为整数。此时需要使用异常处理(如 try-except)来捕获错误,例如: try: num = int(input("请输入一个数字:")) print("输入的整数是:", num) except ValueError: print("输入错误,请输入有效的数字!")
(8)阅读以下代码,解释输出结果并说明原因。
x = 5 if x > 3: print("X 大于3") if x > 4: print("X 大于4") if x > 5: print("X 大于5")
答: X 大于3 X 大于4
(9)编写代码,计算三角形的三个角
题目描述
输入三角形的三个顶点坐标,并计算该三角形的三个角分别是多少(角度制)
$$
A=acos((a*a-b*b-c*c)/(-2*b*c)) \\ B=acos((b*b-a*a-c*c)/(-2*a*c)) \\ C=acos((c*c-b*b-a*a)/(-2*a*b)) \\
$$
其中a、b、c分别表示三条边,A、B、C分别表示三边对应的角
输入输出描述
输入六个数据,分别表示三角形三个顶点的坐标x1、y1、x2、y2、x3和y3,数据之间用空格分隔
输出三行,分别为A、B、C三个角的度数,结果保留两位小数
示例
输入:
1 1 6.5 1 6.5 2.5
输出:
15.26
90.00
74.74
答:
x1, y1, x2, y2, x3, y3 = map(float, input().split()) # 计算三角形三条边的长度(两点间距离公式) a = math.hypot(x2 - x3, y2 - y3) # a对应BC边(角A的对边) b = math.hypot(x1 - x3, y1 - y3) # b对应AC边(角B的对边) c = math.hypot(x1 - x2, y1 - y2) # c对应AB边(角C的对边) # 计算三个角的弧度(使用余弦定理) angle_A_rad = math.acos((a**2 - b**2 - c**2) / (-2 * b * c)) angle_B_rad = math.acos((b**2 - a**2 - c**2) / (-2 * a * c)) angle_C_rad = math.acos((c**2 - a**2 - b**2) / (-2 * a * b)) # 转换为角度制并保留两位小数 angle_A = math.degrees(angle_A_rad) angle_B = math.degrees(angle_B_rad) angle_C = math.degrees(angle_C_rad) # 输出结果 print(f"{angle_A:.2f}") print(f"{angle_B:.2f}") print(f"{angle_C:.2f}")
(10)编写代码,解2×2线程方程
题目描述
如有一个2×2的线程方程组:
$$
ax+by=e \\ cx+dy=f
$$
你可以使用克莱姆法则解该线性方程:
$$
x=\frac{ed-bf}{ad-bc},y=\frac{af-ec}{ad-bc}
$$
其中 $ad-bc$ 为判别式,如果为零则输出无解
输入输出描述
输入a、b、c、d、e、f六个数据,数据之间用空格分隔
输出两行,第一行x的解,第二行y的解,保留一位小数
示例1
输入:
9.0 4.0 3.0 -5.0 -6.0 -21.0
输出:
-2.0
3.0
示例2
输入:
1.0 2.0 2.0 4.0 4.0 5.0
输出:
无解
答:a,b,c,d,e,f =map(float,input("请输入六个数字:").split(" "))
discriminant =a * d - b * c
if discriminant != 0 :
x = (e * d - b * f) / discriminant
y = (a * f - e * c) / discriminant
print(f"x={x : .1f}")
print(f"y={y : .1f}")
else:
print("无解")