当前位置: 首页 > 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.gsyq.cn/news/1417132.html

相关文章:

  • ESP8266 TCP透传模式保姆级配置:从AT指令到自动重连,一次搞定
  • 当下弯头厂家主流测评:五家厂商三档预算技术口碑横评 - 速递信息
  • 2026海外主流AI大模型横评:ChatGPT、Claude、Gemini、Grok怎么选?
  • 2026年10款降AIGC平台实测:最高AI率100%直降至0.12% - 降AI小能手
  • Windows 11让你头疼?这个开源工具能让你找回熟悉的桌面体验
  • 企业主选弯头厂家踩过的坑:五家主流厂商怎么选 - 速递信息
  • ROS Noetic下,用Gazebo和ros_control让三轴机械臂小车动起来(附完整配置文件)
  • DDrawCompat完整指南:5分钟让经典Windows游戏在现代系统重生
  • 2026 降AIGC工具实测盘点:实测靠谱,毕业党救急宝典
  • 别只看版本号!思科show version命令输出的这5个隐藏信息,排错时能救急
  • 别再用tmux了!Claude Code搭配这三个工具,我一天干完一周的活
  • 抖音怎么下载视频无水印?2026年2款免费微信小程序实测推荐 - 速递信息
  • Arduino驱动WS2811灯带:从硬件连接到动态光效实现
  • Gemini投资者关系管理效能跃迁路径(2024监管新规+AI工具深度整合版)
  • 2026年新都财务代理公司应该怎么选?五家财务公司服务全解析 - 速递信息
  • JSON.stringify() 方法详解
  • PS 怎么去掉灰色水印?零基础保姆级完整解决方案
  • HarmonyOS 全局状态管理实战:GlobalContext 跨页面数据共享完全指南
  • STM32入门实战:从零开始用STM32CubeIDE实现LED闪烁
  • 别再手动移植算法了!保姆级教程:用MATLAB Coder App把.m文件一键转成C静态库
  • 从一次线上宕机复盘说起:我是如何用JMeter压测,定位到RT暴增和QPS暴跌的罪魁祸首
  • 咸阳华帝热水器燃气灶维修|秦都渭城世纪大道上门检修 - GrowthUME
  • 保姆级教程:手把手教你搞定Windows 10/11的远程开机(WOL),告别办公室加班
  • 047、直播录制丢帧、音画不同步?实时 TS 切片写入、Buffer 缓冲与降级策略
  • 咸阳万家乐热水器燃气灶壁挂炉故障维修 咸阳上门服务 - GrowthUME
  • 深度优化gbt7714-bibtex-style的arXiv预印本引用配置方案
  • 2026亲测10款AI智能降重工具红黑榜!优缺点全曝光,达标率对标顶级水准 - 降AI小能手
  • 3步搞定有道云笔记本地备份:youdaonote-pull完整使用指南
  • Pspice for TI 库管理进阶:如何一劳永逸地添加外部模型(.lib/.olb)
  • ARM7TDMI复位电路设计与时序控制要点