新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python第4天:函数、模块与内置操作,告别复制粘贴的实战指南

发布时间:2026/10/2 19:11:32来源:尧图网络
Python第4天:函数、模块与内置操作,告别复制粘贴的实战指南
Python学到第4天是一个特别有意思的分水岭。前面三天你大概率已经把环境装好、变量和数据类型混了个脸熟if判断和for循环也能写上几段了。但真上手写点像样的东西时你会发现一个尴尬的局面同一段逻辑想用第二遍只能复制粘贴代码一旦超过100行改一个需求就要翻半天想用别人现成的功能又不知道该怎么借过来。day04要解决的恰恰就是这三件卡住所有人的事函数、模块以及一组能让代码量骤减的内置操作。这篇文章按能直接落地的标准来写适合正在按自学路线往前推的入门者也适合语法学过一遍、但对函数和模块缺乏体系感的人。全程基于Python 3.10环境代码都不长但强烈建议每个例子都亲手敲一遍——纯看一遍的效果大概只有动手敲的三分之一。1. 正式动手前先用三个自测确认自己配得上day04讲函数之前我通常会先扔出三个问题。答不上来别急着往下走先回头补一补不然今天的内容会学得飘。1.1 循环与分支从背下来到敢上手很多人学循环是背代码for i in range(10)记住了缩进记住了但一让他写打印1到100里所有能被3整除的数就卡住了。第4天开始函数里随时会嵌套循环和分支嵌套逻辑比单纯的循环复杂一截。如果这一步还停留在照着写接下来会非常吃力。这里给一个最简单的自测题写一个循环从10打印到1。用range(10, 0, -1)还是range(1, 11)再反转想清楚步长和边界这不只是背语法而是理解range的start、stop、step三个参数。如果答不上来老老实实回到range继续练今天的内容可以晚一天再看。1.2 报错信息Python给新手最好的学习材料进入函数之后报错频率会明显上升。作用域不对、参数个数不对、缩进不对都会立刻报错。我见过太多人一看到红色报错就慌直接把代码删了重写。其实Python的报错信息是出了名的友好它会告诉你哪个文件、第几行、什么类型、大概因为什么。举个例子NameError: name x is not defined翻译过来就是x这个名字还没定义过。再看完整的Traceback有个细节特别重要报错堆栈要从最下面一行往上读最末尾那行才是真正的出错位置上面都是调用过程。这个习惯从第4天开始就必须养成了——后面写函数、调用函数报错堆栈会越来越长会看报错就等于有了导航。1.3 环境与终端别让工具问题消耗学习意志力搜Python环境配置的教程大部分是在讲VS Code里怎么选解释器。VS Code确实是入门阶段综合体验比较好的选择轻量、插件齐全、调试方便。但有两个细节一定要确认清楚第一随便敲一段代码状态栏或命令面板里能看出当前用的是哪个Python解释器第二打开终端输入python --version能正常输出版本号。这两件事没搞定之前不要开始今天的内容。工具不稳定的时候学什么都是飘的你写一段代码它换个解释器就报ModuleNotFoundError你还以为是自己代码写错了实际上连解释器都没选对。这种内耗最消耗新手的学习意志力。2. 函数从0到1你需要的不是语法而是封装这个思维函数是第4天的主角但理解函数千万别从函数是对代码的封装这种话开始。要从我为什么要写它开始。比如你现在有三次机会要计算价格加税的结果最直接的做法是复制三遍公式。但过两天税率改了复制三次意味着改三处漏改一处就出bug。把这个计算规则写进一个函数就是把这个规则存进一个抽屉每次要用拉一次抽屉就行。这才是函数真正的价值。2.1 def到return的完整旅程定义函数的关键字是def。一个最小的函数长这样def add_tax(price, rate0.1): result price * (1 rate) return result第一行def后面跟函数名add_tax括号里是参数price和rate冒号以下缩进的代码是函数体。函数体内部先算result然后return把这个结果交出去。调用它时写add_tax(100, 0.2)得到120.0。要注意函数体里的result是局部变量它和你在外面定义的任何result都没有关系。函数是一个独立的执行空间return交出去的是算出来的值不是那个变量本身。喜欢类比的话可以把函数想象成一台榨汁机参数是放进去的橙子函数体是榨汁机构return是流出来的果汁。你把橙子递进去果汁倒出来机器内部发生了什么外面不需要也不应该关心。2.2 参数传递方式与默认值设计add_tax(100, 0.2)这种按位置传参的方式叫位置参数。参数多的时候容易记混顺序建议用关键字参数add_tax(price100, rate0.2)顺序就不重要了可读性也更高。rate0.1这种写法叫默认参数意思是调用时如果没传rate就自动用0.1。这是写函数的一个重要设计思想把大多数场景下不用改的选项做成默认值把每次调用都可能不同的东西放在前面。比如税率默认10%偶尔按20%算就很适合这种写法。函数也可以没有参数比如import random之后定义一个roll_dice每次执行就返回random.randint(1, 6)。这种无参函数适合封装不需要输入也有输出的动作。2.3 没有return的函数与print和return的区别如果函数体里没有return调用它会拿到None。None是Python里一个非常特殊的值表示什么都没有。不要小看这种函数很多时候我们只是想执行一个副作用打印日志、写文件、发请求。比如一个函数专门负责把结果打印成整齐的报告它就不需要返回任何数据。但新手最容易犯的错是写了一个函数里面print出了结果然后在外面直接拿变量接收调用结果以为变量里存的就是打印的内容。实际上那个变量是None。记住一句话print是给人看的return是给程序用的。调试的时候用print功能逻辑上用return。3. 参数传递的暗坑今天不解决三个月后还得踩第4天最容易劝退新手的点不是函数难写而是参数在传递过程中莫名其妙被改了。这一节必须讲清楚否则后面写项目会反复栽在同一个坑里。3.1 函数里改列表外面为什么跟着变先看这段代码def append_one(items): items.append(1) numbers [1, 2, 3] append_one(numbers) print(numbers) # [1, 2, 3, 1]很多新手看完会愣住函数里不是局部作用域吗为什么外面的numbers也变了原因在于Python传给函数的是对象的引用不是对象的副本。可以把变量想象成一张写着地址的便利贴list对象是那栋房子。append_one拿到的便利贴和外面贴的是同一个地址函数里对房子做的改动外面看到的就是改过的房子。这不算bug这是Python的设计。真正重要的是写函数之前就要想清楚我的函数会不会修改传入的list、dict、set如果不想改就要在函数内部复制一份再操作。3.2 默认参数写[]是个流传多年的经典事故再看一个几乎所有Python面试都会碰到的陷阱def add_item(item, items[]): items.append(item) return items print(add_item(1)) # [1] print(add_item(2)) # [1, 2] 第二次调用时直觉告诉我应该得到[2]结果却是[1, 2]。原因在于默认参数[]在函数定义那一刻只创建了一次之后所有没传items的调用共享的是这同一个列表对象。你往里头加东西上一次的痕迹全留着。正确写法是把默认参数设为None函数内部再重新创建def add_item(item, itemsNone): if items is None: items [] items.append(item) return items这样每次调用如果没有传items都会生成一个新的空列表互不干扰。3.3 三条防御式习惯提前绕开坑我在带新人时通常会让他们记住三条规则函数尽量别修改外部传入的可变对象非改不可就通过命名或注释明说。默认参数只允许用不可变类型None、整数、字符串、元组都没问题list、dict、set一概不用。想保护外部数据在调用前主动复制一份data.copy()或者切片data[:]。这三条不是语法强制的而是让代码边界清晰的习惯。等你将来写项目就会意识到函数内外数据边界清晰这件事有多重要——它直接决定了你的代码好不好查bug、好不好改需求。4. 类型转换、切片和内置函数今天练熟代码量立刻减半第4天除了函数还有一批让你写代码写得很痛快的语法工具要掌握。很多看似复杂的操作Python在语言层面已经配好了现成功能只是很多人不知道。4.1 四个类型转换函数里容易记错的边界情况int()、float()、str()、bool()是高频操作但它们的边界情况很容易踩。我把常见行为和易错点整理成一张表表达式结果说明int(12)12字符串里必须是整数格式int(12.5)报错字符串里带小数点不行int(3.7)3直接截断小数不是四舍五入float(3.14)3.14字符串转浮点数float(3)3.0整数转浮点数会补小数位str(100)100数字转字符串bool(0)False数值0为假bool()False空字符串为假bool(False)True非空字符串就是真内容不重要最后一行的bool(False)是True是每年都会有人问的经典迷惑点。另外想四舍五入到整数别用int(3.7)用round(3.7)才是4。这几种转换各有各的适用场景别一招吃遍天。4.2 切片[start:stop:step]一行代码代替一堆循环切片是Python里性价比极高的语法。基本格式是sequence[start:stop:step]start表示开始位置stop表示结束位置不包含step是步长。nums [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(nums[2:5]) # [2, 3, 4] print(nums[:4]) # [0, 1, 2, 3] print(nums[::2]) # [0, 2, 4, 6, 8] print(nums[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]第三行取了所有偶数下标位置的元素第四行一行反转列表。这些用循环写也不是不行但切片一行搞定可读性还更高。切片的实际价值远不止这点小花活。处理结构化数据时想快速取出前N行、跳过表头、隔行抽样都可以直接用切片。以后你做数据可视化遇到横坐标太密集的问题有个常见的解决办法就是切片抽样——每隔几个点取一个坐标轴立刻清爽。当然这个以后细说今天先把切片本身练熟。还有一个隐藏技巧nums[:]会返回一个新的副本列表。上一节提到的复制一份再操作最简洁的写法就是这个。4.3 len、sum、enumerate、zip让循环更优雅第4天值得认真记住的内置函数不多但每一个都很能打len()拿到长度。len(hello)是5len([1,2,3])是3。sum()求和。sum([1,2,3])是6。max()、min()取最大最小值。sorted()返回排序后的新列表sorted([3,1,2])是[1,2,3]而且不改变原列表。enumerate()遍历时同时拿到索引和值。zip()把多个序列按位置拼成一一对应的元组。enumerate和zip是让循环更优雅的两个王牌看个例子names [alice, bob, carol] scores [88, 95, 76] for name, score in zip(names, scores): print(name, score)一次循环同时遍历两个列表不用去管下标可读性一下子就上来了。如果不用zip就得靠索引代码丑不说还容易越界。顺手再记个脸熟列表推导式。它把循环和append压成一行比如[x * x for x in range(10)]会生成0、1、4、9、……一直到81的平方列表。初看有点吓人但本质就是先想清楚要生成什么元素再想清楚从哪里取数。今天不用深入先认识它。5. import机制与自建模块从第一天开始用轮子第4天的另一个重要突破是第一次正式理解代码复用。函数是你自己写的复用模块是别人写好的复用。这一步打通之后Python的世界才算真正打开——爬虫、数据处理、办公自动化、量化策略思路本质上都是导入合适的模块调用合适的函数。5.1 三种import写法与隐藏习惯差异import math用math.sqrt(9)调用所有函数前面都要带模块名。from math import sqrt直接用sqrt(9)但名字冲突的风险更高。import math as m用m.sqrt(9)调用适合长模块名。三种方式效果差不多但习惯差异很大。新手最舒服的入门姿势是第一种代码里能一眼看清函数来自哪个模块。等你也适应了from写法再按自己的风格来。有一个细节可以提前知道from ... import某个名字之后这个名字绑定的是导入那一刻模块里的对象模块后续更新不会改变这个已绑定的引用。现在不用深究知道有这么回事就够了。5.2 自己写模块并用__name__守卫测试代码自建模块这件事没有想象中复杂。任何一个.py文件只要你愿意都可以被其他脚本当作模块导入。比如写一个tools.pydef say_hello(name): return fhello, {name}然后在另一个文件里写from tools import say_hello就能直接用了。这就是最简单的自建模块。但这里有个新手必踩的坑如果你在tools.py里顺手加了print(say_hello(test))这类测试代码那么别的文件导入tools.py时这行也会跟着执行。解决办法是在tools.py底部加一道守卫if __name__ __main__: print(say_hello(zhang))__name__这个魔法变量在直接运行文件时是main在被导入时是文件名。所以这段测试代码只在直接运行tools.py时执行被导入时自动跳过。这个写法在专业项目里也是常规操作第4天养成这个习惯后面写工具模块会顺手很多。5.3 模块搜索路径与库到底装在哪个目录很多人搜python的库在哪个目录下本质是想搞明白import xx之后Python到底去哪些地方找xx答案就是sys.path——一个保存查找路径的列表。运行python -c import sys; print(sys.path)就能看到一长串目录。想让自己的模块能被导入把它放在当前运行目录下或者放到sys.path列出的任意目录里都行。第三方模块怎么装就是网上教程里最常见的pip install。装完它会自动放到site-packages目录。遇到ModuleNotFoundError: No module named xx十有八九是没装偶尔是装到了另一个Python解释器里。理解了每个解释器有自己独立的site-packages这类报错的排查思路就清楚了。5.4 连接外部程序的入门框架认知热搜词里python连接cmd问得不少这是一个理解Python位置的好切入点。用subprocess模块Python可以在自己内部执行外部命令。比如import subprocess subprocess.run([python, --version])这条命令会拿到当前Python的版本输出。这个概念再往外扩爬虫本质上是Python通过requests去访问某个网络服务办公自动化是Python通过openpyxl读写Excel文件量化策略的数据处理则是通过数据库或API取行情。它们背后的共同框架都是Python作为客户端去连接某个外部程序或服务。把这个框架装进脑子里后面学哪条线都不会懵。提示学习连接外部程序时访问第三方网站要注意遵守对方服务条款和robots规范本地练习尽量控制在自己的机器环境里会更稳妥。6. 实战用前四天的语法做一款猜数字小游戏每讲完一块理论都得有一个能跑起来的项目收口否则知识是散的。第4天最适合的实战项目是一个带输入校验和轮数统计的猜数字游戏。它能覆盖变量、输入输出、循环、分支、函数、异常处理、模块导入——几乎把前四天的语法点全串起来了。6.1 需求拆解小项目也有四件事要做规则很简单程序随机生成一个1到100的整数玩家每次猜一个数程序提示大了或小了直到猜对为止最后打印总共猜了多少次。就这么个小东西拆开也有四个功能点生成随机数、循环接收用户输入、判断大小并给提示、记录并输出猜测次数。如果你能脱口说出这四个点说明前几天的拆解意识还不错说不出来也没关系多拆几次就有感觉了。6.2 直写版与函数化重构的对比我故意先给一个把所有逻辑堆在主程序里的版本import random target random.randint(1, 100) count 0 while True: guess int(input(请输入你猜的数字)) count 1 if guess target: print(大了) elif guess target: print(小了) else: print(f猜对了共用{count}次) break能跑通但两个问题马上露头输入非数字会直接崩溃猜数的逻辑和主流程完全耦合想复用就得复制粘贴。下面做函数化重构import random def get_guess(): while True: raw input(请输入你猜的数字) try: return int(raw) except ValueError: print(输入无效请输入整数。) def check(guess, target): if guess target: return 大了 if guess target: return 小了 return 中了 def main(): target random.randint(1, 100) count 0 while True: guess get_guess() count 1 result check(guess, target) print(result) if result 中了: print(f猜对了共用{count}次) break if __name__ __main__: main()仔细对比两个版本。第二个版本把获取输入和判断大小拆成独立函数main变成了一个调度流程。以后想改提示文案、把难度调成1到1000、增加猜测次数上限只需要改对应的小函数主流程不用动。这就是函数化的好处逻辑拆分各管各的。6.3 跑通之后值得做的三件小事三个功能做完了千万别停。我建议再做三件小事比单纯敲一遍案例有用得多。第一件把难度参数加进去。把def main()改成def main(low1, high100)里面的random.randint(low, high)就跟着参数走。这样下次想玩1到1000直接main(1, 1000)连文件都不用改。第二件统计历史最佳记录。暂时不用写文件可以用返回值把次数带出来或用一个全局变量记录当前会话里的最少次数。这个小改动逼着你思考函数之间怎么传数据。第三件给get_guess加一个连续输错三次自动退出的能力。需要设计一个计数器想清楚是继续循环还是提前退出、退出前要打印什么。这件小事会把异常处理和分支逻辑又练一遍性价比很高。6.4 这个幼稚项目通向的四个方向猜数字小游戏看起来幼稚但它已经是一个完整的程序循环接收输入、处理、输出、重试。把它吃透了后面的学习路线其实非常清晰。把每次猜测的数值收集成一个列表拿matplotlib画出来就会碰到热搜里画图横坐标太密集的问题这时候用切片抽样就很自然把对局记录写入Excel就会接触到openpyxl也就是python写入excel把从某个系统拉数据、清洗、处理、存档这套流程串起来正是办公自动化里自动拉表的核心场景再往深走把规则引擎和数据处理结合量化策略里处理行情数据也长同样的骨架。网上那些爱心代码、李白打酒之类的趣味练习本质上也还是函数加循环的组合用来练手检验自己的基本功就是好去处。第4天不需要一口气走到那里。今天搭好的函数骨架和模块意识是走向所有这些方向时最通用的底座。把基础做扎实比任何花里胡哨的进阶教程都更重要。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Keychain、无遥测与Socket隔离:Coucou的8个安全实践清单 2026/10/2 21:58:39

Keychain、无遥测与Socket隔离:Coucou的8个安全实践清单

Keychain、无遥测与Socket隔离:Coucou的8个安全实践清单 【免费下载链接】coucou A tiny friend that lives in your notch (macOS) or at the top of your screen (Windows, Linux) and keeps an eye on your coding agents: Claude Code, Gemini CLI, Antigravity…

阅读更多 →
频率域图像处理核心:傅里叶变换、频域滤波与同态滤波全解析 2026/10/2 21:58:12

频率域图像处理核心:傅里叶变换、频域滤波与同态滤波全解析

数字图像处理这门课,理论上讲,前几章再零碎,大家照着例题还是能把作业写出来的。但到了第四章频率域图像处理,大多数人的反应会突然慢下来:坐标系成了 u、v,图像变成了复数矩阵,之前积累的线性代…

阅读更多 →
YOLOv8垃圾分割检测系统:端到端实例分割实战指南 2026/10/2 21:58:12

YOLOv8垃圾分割检测系统:端到端实例分割实战指南

简介:YOLOv8垃圾分割检测系统是一套面向人工智能初学者与计算机视觉实践者的轻量级垃圾分类解决方案,聚焦图像识别与实例分割任务,适用于智能环卫、环保监测及课程设计等场景。资源包共41个文件,含15张JPG/PNG格式的样本图像、3个…

阅读更多 →
PowerShell禁止运行npm.ps1?一条命令解决Node.js脚本执行策略报错 2026/10/2 21:58:12

PowerShell禁止运行npm.ps1?一条命令解决Node.js脚本执行策略报错

在PowerShell里输入 npm -v ,回车,终端弹出一段红字:“npm : 无法加载文件 D:\nodejs\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 about_Execution_Policies。”这句话我见过太多次了。毫不夸张地说&…

阅读更多 →
Flutter鸿蒙化实战:hider库属性级显隐适配与RenderObject重构 2026/10/2 21:58:12

Flutter鸿蒙化实战:hider库属性级显隐适配与RenderObject重构

做过中后台 Flutter 客户端的朋友应该都有印象:权限点一多,页面里最难看的部分根本不是业务逻辑,而是“这个按钮要不要显示”“这块文案什么时候出现”这类显隐判断。我之前维护的一个运营后台,光 if (user.hasPermission(xxx)) …

阅读更多 →
汽车造型评审的XR头显选型:六大标准与实测指南 2026/10/2 21:58:11

汽车造型评审的XR头显选型:六大标准与实测指南

如果你所在的造型设计团队,目前还在靠大屏渲染图和油泥模型做评审,我可以负责任地告诉你:XR头显带来的信息密度提升是实打实的。1:1沉浸式看车、多方案快速切换、跨地多人评审,这些在几年前还要靠搭十几个显示器或者反复做油泥模型…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉