当前位置: 首页 > news >正文

16 - 常用内置函数与标准库

16 - 常用内置函数与标准库

Python 自带了很多好用的函数和模块,这章挑最实用的讲。不用全记住,知道有这些东西,需要的时候回来查就行。


常用内置函数

数学相关

# abs() — 绝对值print(abs(-5))# 5# round() — 四舍五入print(round(3.7))# 4print(round(3.14159,2))# 3.14# max() / min() — 最大值/最小值print(max(3,1,4,1,5))# 5print(min([3,1,4]))# 1# sum() — 求和print(sum([1,2,3,4,5]))# 15print(sum([1,2,3],10))# 16(10 是起始值)# pow() — 幂运算print(pow(2,10))# 1024print(pow(2,10,100))# 24(2^10 % 100)# divmod() — 同时得到商和余数q,r=divmod(17,5)print(q,r)# 3 2

类型转换

int("42")# 字符串转整数float("3.14")# 字符串转浮点数str(42)# 数字转字符串bool(0)# 转布尔值list("abc")# ['a', 'b', 'c']tuple([1,2,3])# (1, 2, 3)set([1,1,2])# {1, 2}dict(a=1,b=2)# {'a': 1, 'b': 2}

序列操作

# len() — 长度print(len([1,2,3]))# 3print(len("hello"))# 5# sorted() — 排序(返回新列表)print(sorted([3,1,4,1,5]))# [1, 1, 3, 4, 5]print(sorted("python"))# ['h', 'n', 'o', 'p', 't', 'y']# 自定义排序words=["banana","apple","cherry"]print(sorted(words,key=len))# ['apple', 'banana', 'cherry']# reversed() — 反转(返回迭代器)print(list(reversed([1,2,3])))# [3, 2, 1]# range() — 数字序列print(list(range(5)))# [0, 1, 2, 3, 4]print(list(range(1,10,2)))# [1, 3, 5, 7, 9]

map、filter、zip

# map() — 对每个元素应用函数numbers=[1,2,3,4,5]squares=list(map(lambdax:x**2,numbers))print(squares)# [1, 4, 9, 16, 25]# 等价的列表推导式(更推荐)squares=[x**2forxinnumbers]# filter() — 过滤元素evens=list(filter(lambdax:x%2==0,numbers))print(evens)# [2, 4]# 等价的列表推导式evens=[xforxinnumbersifx%2==0]# zip() — 配对names=["小明","小红"]ages=[25,22]print(list(zip(names,ages)))# [('小明', 25), ('小红', 22)]# zip 创建字典d=dict(zip(names,ages))print(d)# {'小明': 25, '小红': 22}

mapfilter在 Python 里用得没有 JavaScript 那么多,因为列表推导式通常更清晰。但认识它们很重要,读别人的代码时会遇到。

any 和 all

# any() — 有一个 True 就是 Trueprint(any([False,False,True]))# Trueprint(any([0,"",None]))# False# all() — 全部 True 才是 Trueprint(all([True,True,True]))# Trueprint(all([True,False,True]))# Falseprint(all([]))# True(空序列返回 True)# 实际用法numbers=[2,4,6,8]print(all(n%2==0forninnumbers))# True(全是偶数)words=["hello","world","python"]print(any(len(w)>5forwinwords))# True(有长度超过5的)

enumerate

fruits=["苹果","香蕉","橘子"]fori,fruitinenumerate(fruits):print(f"{i}:{fruit}")# 指定起始索引fori,fruitinenumerate(fruits,start=1):print(f"第{i}个:{fruit}")

常用标准库

os — 操作系统交互

importos# 当前工作目录print(os.getcwd())# 环境变量print(os.environ.get("HOME"))print(os.getenv("PATH","未设置"))# 执行系统命令(不推荐用 os.system,用 subprocess)importsubprocess result=subprocess.run(["ls","-l"],capture_output=True,text=True)print(result.stdout)

sys — 系统相关

importsysprint(sys.version)# Python 版本print(sys.platform)# 平台(linux/darwin/win32)print(sys.argv)# 命令行参数print(sys.path)# 模块搜索路径# 退出程序# sys.exit(0) # 正常退出# sys.exit(1) # 异常退出

datetime — 日期时间

fromdatetimeimportdatetime,date,timedelta# 当前时间now=datetime.now()print(now)# 2024-05-25 14:30:00.123456print(now.strftime("%Y-%m-%d %H:%M:%S"))# 格式化# 创建指定时间dt=datetime(2024,1,15,10,30)# 时间差tomorrow=now+timedelta(days=1)last_week=now-timedelta(weeks=1)# 时间比较print(tomorrow>now)# True# 解析字符串dt=datetime.strptime("2024-05-25","%Y-%m-%d")# 只用日期today=date.today()print(today)# 2024-05-25

random — 随机数

importrandom# 随机整数print(random.randint(1,100))# 随机浮点数print(random.random())# 0-1 之间print(random.uniform(1,10))# 1-10 之间# 随机选择fruits=["苹果","香蕉","橘子"]print(random.choice(fruits))# 随机选一个print(random.sample(fruits,2))# 随机选两个(不重复)# 打乱顺序numbers=[1,2,3,4,5]random.shuffle(numbers)print(numbers)# 比如 [3, 1, 5, 2, 4]

collections — 高效数据结构

前面已经讲过defaultdictCounter,这里补充几个:

fromcollectionsimportdeque,OrderedDict# deque — 双端队列(两头都能快速增删)d=deque([1,2,3])d.appendleft(0)# 左边加d.append(4)# 右边加d.popleft()# 左边删print(d)# deque([1, 2, 3, 4])# 限制最大长度(滑动窗口)d=deque(maxlen=3)d.append(1)d.append(2)d.append(3)d.append(4)# 1 被自动挤掉print(d)# deque([2, 3, 4], maxlen=3)# OrderedDict — 有序字典(Python 3.7+ 普通 dict 也有序了,用得少了)

itertools — 迭代器工具

fromitertoolsimportchain,product,combinations,groupby# chain — 把多个可迭代对象连起来forxinchain([1,2],[3,4],[5]):print(x)# 1 2 3 4 5# product — 笛卡尔积forx,yinproduct("AB","12"):print(x,y)# A1 A2 B1 B2# combinations — 组合forcomboincombinations("ABCD",2):print(combo)# ('A','B') ('A','C') ('A','D') ('B','C') ('B','D') ('C','D')# groupby — 分组(数据需要先排序)data=[("A班","小明"),("A班","小红"),("B班","小刚")]data.sort(key=lambdax:x[0])# 必须先排序forkey,groupingroupby(data,key=lambdax:x[0]):print(f"{key}:{list(group)}")

functools — 函数工具

fromfunctoolsimportreduce,lru_cache# reduce — 累积计算fromfunctoolsimportreduceresult=reduce(lambdaa,b:a+b,[1,2,3,4,5])print(result)# 15(((((1+2)+3)+4)+5))# lru_cache — 函数缓存(缓存装饰器)@lru_cache(maxsize=128)deffibonacci(n):ifn<2:returnnreturnfibonacci(n-1)+fibonacci(n-2)print(fibonacci(100))# 瞬间算出来,没缓存的话会慢得要死

@lru_cache是个很实用的装饰器,能缓存函数的计算结果。对于递归或者重复计算的场景,性能提升巨大。

pathlib — 路径处理

第 12 章已经讲过了,这里简单回顾:

frompathlibimportPath p=Path("data")/"output"/"result.txt"p.parent.mkdir(parents=True,exist_ok=True)p.write_text("hello",encoding="utf-8")content=p.read_text(encoding="utf-8")

本章小结

  • map/filter配合 lambda 做数据变换,但列表推导式通常更清晰
  • any/all做批量条件判断
  • sorted+key参数可以自定义排序规则
  • datetime处理日期时间,timedelta做时间差计算
  • collections里的dequeCounterdefaultdict很实用
  • functools.lru_cache一行代码就能给函数加缓存

面试题

Q1:map()和列表推导式有什么区别?哪个更推荐?

点击查看答案

功能上等价,都能对序列中每个元素做变换:

# maplist(map(lambdax:x**2,[1,2,3]))# 列表推导式[x**2forxin[1,2,3]]

区别:

  • 可读性:简单变换用 map 还行,复杂的逻辑列表推导式更清晰
  • 灵活性:列表推导式可以加if过滤,map 不行(需要配合 filter)
  • 性能:差别很小,不需要纠结

Python 社区更推荐列表推导式(Pythonic),除非已有现成函数(如map(str, numbers))。

Q2:@lru_cache是怎么工作的?什么场景适合用?

点击查看答案

@lru_cache用 LRU(Least Recently Used)算法缓存函数的返回值。参数相同时直接返回缓存结果,不重新计算。

适合场景:

  1. 递归(如 Fibonacci),避免重复计算
  2. 重复查询(如配置读取、API 调用)
  3. 纯函数(同样的输入总是同样的输出)

不适合:有副作用的函数(如写文件、修改全局变量),因为第二次调用不会真正执行。

maxsize控制缓存大小,None表示不限制。

Q3:datetimetimedelta的用途是什么?

点击查看答案

timedelta表示两个时间点之间的时间差,可以做日期时间的加减运算:

fromdatetimeimportdatetime,timedelta now=datetime.now()tomorrow=now+timedelta(days=1)two_hours_later=now+timedelta(hours=2)last_week=now-timedelta(weeks=1)# 两个 datetime 相减得到 timedeltadiff=datetime(2024,12,31)-datetime(2024,1,1)print(diff.days)# 365

支持 days、seconds、microseconds、milliseconds、minutes、hours、weeks 参数。

Q4:dequelist有什么区别?什么时候用 deque?

点击查看答案
操作listdeque
末尾增删O(1)O(1)
头部增删O(n)O(1)
中间增删O(n)O(n)
随机访问O(1)O(n)

list 在头部插入/删除是 O(n)(所有元素后移),deque 是 O(1)。

用 deque 的场景:

  1. 需要在两端操作(如队列、双端队列)
  2. 需要限制最大长度(deque(maxlen=N)实现滑动窗口)

用 list 的场景:

  1. 需要随机访问(lst[i]
  2. 主要在末尾操作

http://www.jsqmd.com/news/905830/

相关文章:

  • 纯硬件模拟电路实现太阳能MPPT充电与光控照明系统设计
  • GitNexus是Monorepo单体仓库
  • 电磁直线执行器直接驱动的流体控制阀系统【附程序】
  • 【信息科学与工程学】【通信工程】第一百二十一篇 信号处理02 信号处理:小波变换核心算法
  • 别再傻傻分不清了!GTF和GFF3文件格式详解与实战转换指南(附gffread命令)
  • 模型检验中的对称性破缺技术:应对核电站IC系统验证的组合爆炸
  • 八大网盘直链下载助手:告别龟速下载的免费解决方案
  • 决策者选专业法兰厂家踩过的坑:头部TOP4实力对比 - 速递信息
  • Go语言并发模式:常见并发范式
  • 基于Arduino的密码锁系统:从矩阵键盘到伺服电机的完整实现
  • 中国石化仪征化纤有限责任公司特种纤维研究所所长王芳,分享《超高分子量聚乙烯纤维和对位芳纶纤维在工程领域的应用》
  • ESP8266 TCP透传模式保姆级配置:从AT指令到自动重连,一次搞定
  • 当下弯头厂家主流测评:五家厂商三档预算技术口碑横评 - 速递信息
  • Windows Cleaner终极指南:3步彻底解决C盘爆红的免费方案
  • FlexNet Publisher许可证服务器端口配置指南
  • 2026国产在线余氯监测仪十大品牌深度横评:技术破局与全场景选型指南 - 液体流量液位品牌推荐
  • 2026海外主流AI大模型横评:ChatGPT、Claude、Gemini、Grok怎么选?
  • 基于ESP32与WS2812打造实体战舰游戏机:从硬件集成到软件开发的完整实践
  • 投资者信任危机应对全解析,深度解读Gemini IR风控模型与实时舆情响应机制
  • NI-DAQmx模拟设备(SimDev)完全使用指南:没硬件也能玩转数据采集仿真
  • RPGMakerDecrypter完全指南:3步解密RPG Maker加密存档的专业方法
  • 2026年10款降AIGC平台实测:最高AI率100%直降至0.12% - 降AI小能手
  • 【算法】小白也能懂 · 第 16 节:拓扑排序
  • 避开次谐波振荡!深入浅出解析电流模式Buck的斜坡补偿与环路稳定
  • 评测全网10款主流降AI率软件:只选真正管用的那一款! - 降AI小能手
  • Windows 11让你头疼?这个开源工具能让你找回熟悉的桌面体验
  • DLSS Swapper终极指南:一键切换游戏超采样版本,免费提升显卡性能
  • Navicat Mac版无限试用重置:3种终极解决方案告别14天限制
  • ROS Noetic下,用Gazebo和ros_control让三轴机械臂小车动起来(附完整配置文件)
  • 【Claude私有化部署生死线】:从模型量化精度损失率、KV Cache内存膨胀系数到审计日志完整性验证——金融级落地必查清单