Python常见面试题的详解8
1. 变量作用域和查找规则(LEGB)
- 作用域层级:
-
Local:函数内部作用域
-
Enclosing:闭包函数外层作用域
-
Global:模块全局作用域
-
Built-in:内置命名空间
- 查找顺序:L → E → G → B
- 关键特性:
global声明修改全局变量
nonlocal修改闭包外层变量
函数参数属于局部作用域
python
x = 'global'
def outer():x = 'outer'def inner():nonlocal x # 修改闭包变量x = 'inner'inner()print(x) # 输出 'inner'
- 要点:
Python 中有四种作用域:局部作用域(Local,L)、闭包函数外的函数中作用域(Enclosing,E)、全局作用域(Global,G)、内置作用域(Built - in,B)。变量查找顺序遵循 LEGB 规则,即先在局部作用域查找,若未找到则到闭包函数外的函数中作用域查找,接着是全局作用域,最后是内置作用域。在嵌套函数中,内层函数可以访问外层函数的变量,但默认情况下不能修改。如果需要修改,可以使用 nonlocal 关键字。在模块中定义的变量属于全局作用域,但在函数内部如果使用 global 关键字,可以修改全局变量的值。
- 示例:
python
def outer():x = 10def inner():nonlocal xx = 20inner()print(x) # 输出 20outer()
2. 用三种方式将字符串 "789" 转换成 789 ,不使用内置 api,例如 int()
python
# 方法1:ASCII码计算
def str_to_int(s):num = 0for c in s:num = num*10 + (ord(c) - ord('0'))return num# 方法2:逐位乘累加
def str_to_int(s):return sum((ord(c)-48)*10**i for i,c in enumerate(reversed(s)))# 方法3:递归实现
def str_to_int(s, acc=0):return acc if not s else str_to_int(s[1:], acc*10 + (ord(s[0])-48))
- 要点:
可以使用 ASCII 码和乘法,加法运算,通过循环和位运算,使用递归这些方法可以实现对字符串和整数之间转换。在一些对性能要求较高且不允许使用内置函数的场景下,这些手动实现的转换方法会更有优势。
- 示例:
python
# 方法一:利用 ASCII 码和乘法、加法运算
def str_to_int_1(s):result = 0for char in s:result = result * 10 + (ord(char) - ord('0'))return result# 方法二:通过循环和位运算
def str_to_int_2(s):num = 0for i in range(len(s)):digit = ord(s[i]) - ord('0')num = (num << 3) + (num << 1) + digitreturn num# 方法三:使用递归
def str_to_int_3(s):if len(s) == 0:return 0return str_to_int_3(s[:-1]) * 10 + (ord(s[-1]) - ord('0'))print(str_to_int_1("789"))
print(str_to_int_2("789"))
print(str_to_int_3("789"))
3. 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
- 要点:
- 暴力枚举法,通过两层循环遍历数组,找到满足条件的两个数。
- 使用哈希表,遍历数组时,记录每个元素及其索引,同时检查目标值与当前元素的差值是否已在哈希表中。
- 在处理大规模数组时,哈希表的优势会更加明显。该问题还可以扩展到找出数组中三个数、四个数之和等于目标值的情况。
- 示例:
python
# 方法一:暴力枚举法
def twoSum_1(nums, target):for i in range(len(nums)):for j in range(i + 1, len(nums)):if nums[i] + nums[j] == target:return [i, j]# 方法二:使用哈希表
def twoSum_2(nums, target):num_dict = {}for i, num in enumerate(nums):complement = target - numif complement in num_dict:return [num_dict[complement], i]num_dict[num] = inums = [1, 2, 3, 4]
target = 3
print(twoSum_1(nums, target))
print(twoSum_2(nums, target))
4. 用三种方式统计一个文本中单词频次最高的 10 个单词
- 要点:
- 使用字典手动统计单词频次,然后对字典按值排序。
- 使用
collections.Counter类,可以方便地统计元素的频次。 - 结合
defaultdict和heapq模块,利用堆排序找出前 10 个高频单词。 -
在处理大规模文本时,
collections.Counter是比较高效的选择,因为它的实现经过了优化。而使用heapq模块可以在不排序整个单词频次字典的情况下找出前 10 个高频单词,在内存使用上可能更有优势。
- 示例:
python
import collections
import heapqtext = "apple banana apple cherry banana apple"# 方法一:使用字典手动统计
word_count = {}
for word in text.split():if word in word_count:word_count[word] += 1else:word_count[word] = 1
sorted_words = sorted(word_count.items(), key=lambda item: item[1], reverse=True)[:10]
print(sorted_words)# 方法二:使用 collections.Counter
counter = collections.Counter(text.split())
print(counter.most_common(10))# 方法三:结合 defaultdict 和 heapq
from collections import defaultdict
word_freq = defaultdict(int)
for word in text.split():word_freq[word] += 1
heap = [(-freq, word) for word, freq in word_freq.items()]
heapq.heapify(heap)
top_10 = [heapq.heappop(heap) for _ in range(min(10, len(heap)))]
result = [(word, -freq) for freq, word in top_10]
print(result)
5. 请写出一个函数满足以下条件:该函数的输入是一个仅包含数字的 list,输出一个新的 list,其中每一个元素要满足以下条件:
- 该元素是奇数
- 该元素在原
list中是在奇数的位置(index是奇数)
- 要点:
使用列表推导式遍历原列表,筛选出满足条件的元素。可以定义一个函数应用于数据处理中,例如从一系列测量数据中筛选出特定位置的奇数测量值。对于不同的数据类型或更复杂的筛选条件,可以对该函数进行扩展。
- 示例:
python
def filter_list(lst):return [lst[i] for i in range(1, len(lst), 2) if lst[i] % 2 != 0]nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(filter_list(nums))
6. 使用单一的列表生成式来产生一个新的列表
- 要点:
列表生成式可以结合条件判断、循环等操作,以简洁的语法生成新列表。列表生成式不仅可以用于生成简单的数值列表,还可以用于处理嵌套列表、字符串列表等。在处理复杂的数据结构时,合理使用列表生成式可以使代码更加简洁易读。
- 示例:
生成一个包含 1 到 10 的平方的列表:
python
squares = [i ** 2 for i in range(1, 11)]
print(squares)
7. 用一行代码生成 [1,4,9,16,25,36,49,64,81,100]
python
squares = [x**2 for x in range(1,11)] # [1,4,9,...,100]
- 要点:
使用列表生成式 [x ** 2 for x in range(1, 11)] 可以在一行代码中完成列表的生成。可以通过修改 range 的参数和表达式,生成不同规律的列表。例如,生成 2 到 20 的偶数的平方列表:[x ** 2 for x in range(2, 21, 2)]。
8. 输入某年某月某日,判断这一天是这一年的第几天
- 要点:
- 先判断该年是否为闰年,闰年 2 月有 29 天,平年 2 月有 28 天。
- 然后累加每个月的天数,直到输入的月份,再加上输入的日期。
- 可以将该功能封装成一个函数,方便在不同的程序中调用。同时,可以添加输入验证,确保输入的日期是合法的。
- 示例:
python
def day_of_year(year, month, day):days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):days_in_month[1] = 29total_days = sum(days_in_month[:month - 1]) + dayreturn total_daysyear = 2024
month = 3
day = 15
print(day_of_year(year, month, day))
9. 两个有序列表l1,l2,对这两个列表进行合并不可使用 extend
- 要点:
使用双指针法,分别遍历两个列表,比较指针所指元素的大小,将较小的元素添加到新列表中,直到其中一个列表遍历完,然后将另一个列表剩余的元素依次添加到新列表中。在处理多个有序列表的合并时,可以使用归并排序的方法,将多个列表两两合并。
- 示例:
python
def merge_lists(l1, l2):merged = []i, j = 0, 0while i < len(l1) and j < len(l2):if l1[i] < l2[j]:merged.append(l1[i])i += 1else:merged.append(l2[j])j += 1while i < len(l1):merged.append(l1[i])i += 1while j < len(l2):merged.append(l2[j])j += 1return mergedl1 = [1, 3, 5]
l2 = [2, 4, 6]
print(merge_lists(l1, l2))
10. 给定一个任意长度数组,实现一个函数让所有奇数都在偶数前面,而且奇数升序排列,偶数降序排序,如字符串 '123456789',变成 '135798642'
- 要点:
- 先将数组中的奇数和偶数分别提取出来。
- 对奇数列表进行升序排序,对偶数列表进行降序排序。
- 最后将排序后的奇数列表和偶数列表合并。
- 可以定义一个函数应用于数据排序和整理的场景中,对于不同的数据类型(如整数列表、字符串列表等),可以进行相应的修改。
- 示例:
python
def sort_array(arr):odd_nums = [int(i) for i in arr if int(i) % 2 != 0]even_nums = [int(i) for i in arr if int(i) % 2 == 0]odd_nums.sort()even_nums.sort(reverse=True)result = [str(i) for i in odd_nums + even_nums]return ''.join(result)arr = '123456789'
print(sort_array(arr))
相关文章:
Python常见面试题的详解8
1. 变量作用域和查找规则(LEGB) 作用域层级: Local:函数内部作用域 Enclosing:闭包函数外层作用域 Global:模块全局作用域 Built-in:内置命名空间 查找顺序:L → E → G → B关…...
Deepseek R1模型本地化部署与API实战指南:释放企业级AI生产力
摘要 本文深入解析Deepseek R1开源大模型的本地化部署流程与API集成方案,涵盖从硬件选型、Docker环境搭建到模型微调及RESTful接口封装的完整企业级解决方案。通过电商评论分析和智能客服搭建等案例,展示如何将前沿AI技术转化为实际生产力。教程支持Lin…...
node.js + html调用ChatGPTApi实现Ai网站demo(带源码)
文章目录 前言一、demo演示二、node.js 使用步骤1.引入库2.引入包 前端HTML调用接口和UI所有文件总结 前言 关注博主,学习每天一个小demo 今天是Ai对话网站 又到了每天一个小demo的时候咯,前面我写了多人实时对话demo、和视频转换demo,今天…...
sql语言语法的学习
sql通用语法 sql分类 DDL(操作数据库和表) 操作数据库 操作表_查询 操作表_创建 举例: 操作表_删除 操作表_修改 DML(增删改表中数据) DML添加数据 DML删除数据 DML修改数据 DQL 单表查询 基础查询 条件查询 案例演示: 排序查询 聚合函数 分组查询…...
力扣 最长递增子序列
动态规划,二分查找。 题目 由题,从数组中找一个最长子序列,不难想到,当这个子序列递增子序列的数越接近时是越容易拉长的。从dp上看,当遍历到这个数,会从前面的dp选一个最大的数加上当前数,注意…...
【linux】在 Linux 服务器上部署 DeepSeek-r1:70b 并通过 Windows 远程可视化使用
【linux】在 Linux 服务器上部署 DeepSeek-r1:70b 并通过 Windows 远程可视化使用 【承接商业广告,如需商业合作请+v17740568442】 文章目录 【linux】在 Linux 服务器上部署 DeepSeek-r1:70b 并通过 Windows 远程可视化使用个人配置详情一、安装ollama二、下载deepseek版本…...
visutal studio 2022使用qcustomplot基础教程
编译 下载,2.1.1版支持到Qt6.4 。 拷贝qcustomplot.h和qcustomplot.cpp到项目源目录(Qt project)。 在msvc中将它俩加入项目中。 使用Qt6.8,需要修改两处代码: L6779 # if QT_VERSION > QT_VERSION_CHECK(5, 2, …...
Linux:线程概念、理解、控制
目录 一、认识线程 1.认识线程V1 2.认识线程V2 3.认识线程V3 4.认识线程V4 5.认识线程V5 二、线程控制 1.前言 2.创建线程 3.线程等待 4.线程终止 5.线程分离 三、线程理解 一、认识线程 1.认识线程V1 借用大多数计算机教材的话,线程是进程的一个执行…...
Postman如何流畅使用DeepSeek
上次写了一篇文章是用chatBox调用api的方式使用DeepSeek,但是实际只能请求少数几次就不再能给回响应。这回我干脆用最原生的方法Postman调用接口请求好了。 1. 通过下载安装Postman软件 postman下载(https://pan.quark.cn/s/c8d1c7d526f3),包含7.0和10…...
K8S下载离线安装包所需文件
下载相关文件 官网下载地址集合https://kubernetes.io/zh-cn/releases/download/ 下载相关镜像 官网镜像描述 所有 Kubernetes 容器镜像都被部署到 registry.k8s.io 容器镜像仓库。 容器镜像支持架构registry.k8s.io/kube-apiserver:v1.32.0amd64, arm, arm64, ppc64le, …...
探索Hugging Face:开源AI社区的核心工具与应用实践
引言:AI民主化的先锋 在自然语言处理(NLP)领域,Hugging Face已成为开源社区的代名词。这个成立于2016年的平台,通过提供易用的工具和丰富的预训练模型库,彻底改变了开发者使用和部署AI模型的方式。截至202…...
【操作系统】深入理解Linux物理内存
物理内存的组织结构 我们平时所称的内存也叫随机访问存储器也叫 RAM 。RAM 分为两类: 一类是静态 RAM( SRAM ),这类 SRAM 用于 CPU 高速缓存 L1Cache,L2Cache,L3Cache。其特点是访问速度快,访…...
npm 私服使用介绍
一、导读 本文主要介绍 npm 私服的使用,至于 npm 私服搭建的过程,可以看本人之前的文章《Docker 部署 verdaccio 搭建 npm 私服》 二、前置条件 npm私服地址:http://xxx.xxx.xxx.xxx:port/ 三、本地 npm 源切换 使用nrm,可以方…...
安全筑基,智能赋能:BeeWorks IM引领企业协同新纪元
在数字经济高速发展的今天,企业通讯系统已从单纯的信息传递工具演变为支撑业务创新的核心平台。传统通讯工具在安全性、智能化、协同性等方面的不足,严重制约着企业的数字化转型进程。BeeWorks IM系统以其创新的技术架构和智能化功能,正在重新…...
水务+AI应用探索(一)| FastGPT+DeepSeek 本地部署
在当下的科技浪潮中,AI 无疑是最炙手可热的焦点之一,其强大的能力催生出了丰富多样的应用场景,广泛渗透到各个行业领域。对于水务行业而言,AI 的潜力同样不可估量。为了深入探究 AI 在水务领域的实际应用成效,切实掌握…...
[JVM篇]垃圾回收器
垃圾回收器 Serial Seral Old PartNew CMS(Concurrent Mark Sweep) Parallel Scavenge Parallel Old G1 ZGC...
SQL Server:查看当前连接数和最大连接数
目录标题 **1. 查看当前连接数****使用系统视图****使用动态管理视图** **2. 查看最大连接数****通过配置选项****通过服务器属性** **3. 查看连接数的实时变化****4. 设置最大连接数****5. 查看连接的详细信息****6. 使用 SQL Server Management Studio (SSMS)****7. 使用 SQL…...
DeepSeek应用——与PyCharm的配套使用
目录 一、配置方法 二、使用方法 三、注意事项 1、插件市场无continue插件 2、无结果返回,且在本地模型报错 记录自己学习应用DeepSeek的过程,使用的是自己电脑本地部署的私有化蒸馏模型...... (举一反三,这个不单单是可以用…...
【第15章:量子深度学习与未来趋势—15.3 量子深度学习在图像处理、自然语言处理等领域的应用潜力分析】
一、开篇:为什么我们需要关注这场"量子+AI"的世纪联姻? 各位技术爱好者们,今天我们要聊的这个话题,可能是未来十年最值得押注的技术革命——量子深度学习。这不是简单的"1+1=2"的物理叠加,而是一场可能彻底改写AI发展轨迹的范式转移。 想象这样一个…...
多模态基础模型训练笔记-第一篇InternVL-g
一、TL;DR 将之前所有训练过的大模型的过程都总结和回忆一下,遇到的坑别忘了 二、问题记录 还是注意镜像的选择,选择社区最火的镜像,然后下载好对应的数据,主要显卡的选择,这个时候4090已经带不动了&…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
