首页/新闻资讯/正文详情

函数:写一次代码,用一万次

发布时间:2026/9/24 17:44:21 来源:云帆数科 栏目:资讯中心
函数:写一次代码,用一万次
如果你连函数都写不出来, 那么你根本就没有进入到这门学问的门槛里面去。函数, 它是编程里面的那个核心的抽象。你现在去写一个函数, 这就等于你去发明了一个新的动词。那其他的人, 包括那个未来的你自己在内, 也只需要去知道它是做什么事情的就行了。至于说它到底是怎么去做的这个问题, 是不需要去知道的。今天我们将由浅入深, 从最基础的知识逐步过渡到更高级的内容, 把函数这个知识点讲透彻。一、我们来了解一下关于函数的第一点一内容, 具体来说就是大家经常会问到的问题, 即究竟为什么要使用函数呢?这段代码不需要用到函数。# 计算三个圆的面积r1, r2, r3 5, 10, 15area1 3.14159 * r1 ** 2area2 3.14159 * r2 ** 2area3 3.14159 * r3 ** 2# 如果π需要更高精度你要改3个地方...使用函数这一类事物的代码内容来展开表述。def circle_area(radius, pi3.14159):计算圆的面积return pi * radius ** 2areas [circle_area(r) for r in [5, 10, 15]]# 改精度只需改一个地方函数这种存在, 它的益处在哪里呢?二、我们来定义和调用, 然后看一看2.1基本语法。def greet(name):向指定的人打招呼 # 这是文档字符串docstringreturn f你好{name}# 调用result greet(小明)print(result) # 你好小明2.2是关于文档这一方面的字符串内容。这个内容应当被视为函数的说明书, 它需要去清楚地说明函数究竟是做什么工作的, 其中的参数分别是什么情况, 以及最终的返回值又是什么东西。def calculate_bmi(height, weight):计算BMI值并给出健康建议Args:height: 身高米weight: 体重公斤Returns:dict: 包含BMI值和健康建议Example: calculate_bmi(1.75, 70){bmi: 22.86, advice: 正常}bmi weight / (height ** 2)if bmi 18.5:advice 偏瘦elif bmi 24:advice 正常elif bmi 28:advice 偏胖else:advice 肥胖return {bmi: round(bmi, 2), advice: advice}好习惯写 它可以通过 help(函数名) 查看配合 IDE 自动提示是代码可读性的核心。2.第三部分是关于语句这一内容的介绍。# 返回一个值def add(a, b):return a b# 返回多个值自动打包成元组def min_max(numbers):return min(numbers), max(numbers)result min_max([3, 1, 4, 1, 5])print(result) # (1, 5)mn, mx result # 解包print(mn, mx) # 1 5# 没有 return 返回 Nonedef print_hello():print(Hello) # 没有 returnresult print_hello() # Helloprint(result) # None三、关于3.1这个位置参数的详细解释如下。def introduce(name, age, city):print(f我叫{name}今年{age}岁住在{city})# 按位置传参introduce(小明, 18, 北京)3.2 关键字参数# 按名称传参顺序可以打乱introduce(city上海, name小红, age20)# 混合使用位置参数必须在关键字参数前面introduce(小刚, city广州, age22) ## introduce(city广州, 小刚, 22) # SyntaxError3.3 默认参数def connect(hostlocalhost, port8080, timeout30):print(f连接 {host}:{port}超时{timeout}秒)connect() # 连接 localhost:8080超时30秒# 连接 example.com:8080超时30秒connect(port9000) # 连接 localhost:9000超时30秒443, 10) # 全部自定义️ 默认参数的陷阱# 大坑默认参数只会在定义时计算一次def add_item(item, items[]):items.append(item)return itemsprint(add_item(a)) # [a]print(add_item(b)) # [a, b] ← 不是预期的 [b]!# 正确做法用 None 在函数内部创建def add_item(item, itemsNone):if items is None:items []items.append(item)return items3.第四个知识点是关于可变参数。# *args接收任意数量的位置参数打包成元组def sum_all(*args):print(f参数{args})return sum(args)print(sum_all(1, 2, 3, 4, 5)) # 15# **kwargs接收任意数量的关键字参数打包成字典def print_kwargs(**kwargs):for key, value in kwargs.items():print(f{key} {value})print_kwargs(name小明, age18, city北京)# name 小明# age 18# city 北京# 组合使用def api_request(url, *args, methodGET, **kwargs):print(f请求{method} {url})print(f额外参数{args})print(f查询参数{kwargs})api_request(/api/data, extra, methodPOST, page1, size20)3.5 关键字仅可用的参数这一内容, 总共包含了 3 个特性。# * 后面的参数必须用关键字传递def create_user(name, age, *, city, phone):print(f创建用户{name}, {age}岁)print(f城市{city}, 电话{phone})create_user(小明, 18, city北京, phone13800138000) ## create_user(小明, 18, 北京, 13800138000) # TypeError这种设计强制调用者写清楚参数名, 避免 (小明, 18北京) 这种天书调用。四、作用域与命名空间4.1 LEGB 规则查找变量的顺序是这样规定的, 先是局部变量, 然后是非局部变量, 接着是全局变量, 最后才会去内置变量里面找。# 全局作用域x globaldef outer():# 外层函数作用域x outerdef inner():# 局部作用域x innerprint(finner: {x}) # inner: innerinner()print(fouter: {x}) # outer: outerouter()print(fglobal: {x}) # global: global4.2 和count 0def increment():global count # 告诉 Python我要改全局的 countcount 1increment()print(count) # 1# nonlocal修改外层函数的变量def outer():x 10def inner():nonlocal xx 5inner()print(x) # 15我们要尽量少用全局变量。函数最好写成独立完整的模样, 也就是让它自己包含自己需要的东西。把输入参数交进去, 然后得到输出的结果。要是用了全局变量的话, 代码就会变得让人不容易理解, 也不太容易去调试排查问题。五、所谓匿名函数就是那种没有名字的函数。那是一行函数, 是比较合适的, 适用于那种简单的操作内容。# 普通函数def square(x):return x ** 2# lambda 等效square lambda x: x ** 2# lambda 的真正用途是作为参数传递# 配合 sorted()students [(小明, 85),(小红, 92),(小刚, 78),]# 按分数排序sorted_students sorted(students, keylambda s: s[1], reverseTrue)print(sorted_students) # [(小红, 92), (小明, 85), (小刚, 78)]# 配合 filter()numbers [1, 2, 3, 4, 5, 6]even list(filter(lambda x: x % 2 0, numbers))print(even) # [2, 4, 6]# 配合 map()squared list(map(lambda x: x ** 2, numbers))print(squared) # [1, 4, 9, 16, 25, 36]这一条经验之谈是这么来的: 它比较适合用来处理那些只有一到两行代码的简单逻辑判断。如果遇到的情况是逻辑非常复杂, 那么还是用普通的 功能命名的函数来写更为合适。六、高阶函数这个函数是一个第一等级的公民, 它能够让使用者将普通变量视为等同物来进行相互之间的传递操作。# 函数作为参数def apply_twice(func, arg):return func(func(arg))def add_one(x):return x 1print(apply_twice(add_one, 5)) # 7# 函数作为返回值闭包def make_power(n):def power(x):return x ** nreturn powersquare make_power(2)cube make_power(3)print(square(5)) # 25print(cube(5)) # 125# 装饰器基础def timer(func):计算函数执行时间import timedef wrapper(*args, **kwargs):start time.perf_counter()result func(*args, **kwargs)elapsed time.perf_counter() - startprint(f{func.__name__} 耗时{elapsed:.4f}秒)return resultreturn wrappertimerdef slow_function():import timetime.sleep(0.5)return 完成slow_function() # 输出slow_function 耗时0.5003秒七、实战工具箱# utils.py — 你的个人工具箱import timefrom functools import wrapsdef retry(max_attempts3, delay1):重试装饰器函数执行失败时自动重试Args:max_attempts: 最大重试次数delay: 重试间隔秒def decorator(func):wraps(func)def wrapper(*args, **kwargs):last_exception Nonefor attempt in range(1, max_attempts 1):try:return func(*args, **kwargs)except Exception as e:last_exception eprint(f第{attempt}次尝试失败{e})if attempt max_attempts:time.sleep(delay)raise last_exceptionreturn wrapperreturn decorator# 数据验证函数def validate_email(email):简单验证邮箱格式import repattern r^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}#39;return bool(re.match(pattern, email))def validate_phone(phone):验证中国大陆手机号import re# 1开头第二位3-9后面9位数字pattern r^1[3-9]\d{9}#39;return bool(re.match(pattern, phone))# 数据转换函数def chunk_list(data, chunk_size):将列表分割成固定大小的块return [data[i:i chunk_size] for i in range(0, len(data), chunk_size)]def flatten(nested_list):展平嵌套列表result []for item in nested_list:if isinstance(item, list):result.extend(flatten(item)) # 递归展平else:result.append(item)return result# 使用示例retry(max_attempts3, delay0.5)def unstable_api_call(url):模拟不稳定的API调用import randomif random.random() 0.7: # 70%概率失败raise ConnectionError(网络错误)return f数据来自 {url}# 测试result unstable_api_call(http://api.example.com/data)print(f结果{result})# 其他工具测试data [1, 2, 3, 4, 5, 6, 7, 8]print(chunk_list(data, 3)) # [[1, 2, 3], [4, 5, 6], [7, 8]]nested [1, [2, [3, 4], 5], 6]print(flatten(nested)) # [1, 2, 3, 4, 5, 6]# Trueprint(validate_phone(13800138000)) # True总结概念要点定义定义一个名为函数名的代码块, 并让它在内部接收参数。返回值它可以将各种类型的结果给带回来, 要是没有返回的具体东西, 那么就让它去返回那个叫作 None 的状态。位置参数按顺序传参关键字参数使用 namevalue 的传参方式, 其中的顺序是可以被打乱的。默认参数这个内容在定义的时候就需要进行指定, 在这里务必要注意到可变对象所带来的陷阱。*args接收任意数量位置参数**接收任意数量关键字参数作用域LEGB规则指的是搜索顺序, 具体来说是先从局部开始进行查找, 接着再找内置名称。一行匿名函数装饰器函数增强器语法糖下一篇预告是关于文件操作的内容, 具体将涉及文件的读取和写入环节, 这一部分我们是十分认真的。你学会了函数, 这意味着你已经从被称为“脚本小子”的人, 进化成为了真正的程序员。

相关推荐

手机就能学Python!无需高配置电脑,安卓与iOS都可以,30天通关
手机就能学Python!无需高配置电脑,安卓与iOS都可以,30天通关

许多想要进入编程行业并从头开始学习的朋友, 往往因为电脑配置方面的问题, 而感到受阻, 并停下了自己的脚步, 他们觉得必须先购买高性能的笔记本电脑或者安装复杂的操作系统之后, 才能启动他们的学习之路, 然而实际上这样做是完全没必要的, 咱们日常随身携带并且放在口袋里的手… · 2026/9/24 17:44:21

python中setup的含义
python中setup的含义

在开发程序的这个过程中, setup这个词汇的所代表的基本含义是去使用setup.py这个特定的文件来处理程序的事, 具体包括对程序进行打包、构建以及安装这几项操作, 因为借助于setup.py文件的存在, 人们能够对于程序所必须的依赖环境、具体的版本号, 还有作者的各类信息等进行明确的… · 2026/9/24 17:44:21

Python量化交易数据接口开发
Python量化交易数据接口开发

在量化交易这个大领域里面, 数据接口的开发是一个特别关键的步骤。作为现在很多人都在用的编程语言, 它因为高效还有容易学到手这些优点, 所以被大量地用在量化交易的场景里去。接下来这篇文章会详细给大家解释清楚到底应该怎样去动手开发量化交易里的数据接口, 这里头包括了怎… · 2026/9/24 17:44:02

临床药学生写毕业论文,别再让 AI “一键硬编”了:抗菌药专项点评这类题,可以这样选工具 [特殊字符]
临床药学生写毕业论文,别再让 AI “一键硬编”了:抗菌药专项点评这类题,可以这样选工具 [特殊字符]

临床药学专业的同学,毕业前大概率会遇到一类非常典型的任务:在实习医院完成一项用药合理性评价或药学服务实践研究。 比如这篇帖子就选一个很有代表性的题目:《某院呼吸科老年社区获得性肺炎患者抗菌药物使用情况及药师干预效果分析》你需要从… · 2026/9/24 18:13:14

OPNET OSPF动态路由实验配置验证与排错指南
OPNET OSPF动态路由实验配置验证与排错指南

简介:OSPF 是内部网关协议中广泛应用的链路状态路由协议,而 Riverbed OpNet 是业界常用的网络仿真与性能分析平台。该资源是一份面向网络工程师、运维人员及高校学生的 OSPF 仿真项目包,基于 OpNet 环境搭建了完整的 OSPF 网络模型&#xff0… · 2026/9/24 18:13:14

递增的三元子序列
递增的三元子序列

题目描述 给你一个整数数组 numsnumsnums&#xff0c;判断这个数组中是否存在长度为 3 的递增子序列。 如果存在这样的三元组下标 (i,j,k)(i, j, k)(i,j,k) 且满足 i<j<ki < j < ki<j<k &#xff0c;使得 nums[i]<nums[j]<nums[k]nums[i] < nums[… · 2026/9/24 18:13:14

JSP财务管理系统实战全指南:从源码解析到毕业设计避坑
JSP财务管理系统实战全指南:从源码解析到毕业设计避坑

简介&#xff1a;这套基于Jsp的财务管理系统设计与实现交付包&#xff0c;面向计算机相关专业学生及Java Web初学者&#xff0c;适用于课程设计、毕业设计或项目实训等场景&#xff0c;重点是解决财务模块从需求分析到实现交付的完整链路问题。压缩包内包含项目报告、中期报告、… · 2026/9/24 18:13:08

Jsp财务管理系统全解析:从架构设计到部署避坑指南
Jsp财务管理系统全解析:从架构设计到部署避坑指南

简介&#xff1a;基于JSP的财务管理系统全套项目资料&#xff0c;面向高校软件技术、财务信息化、管理信息系统等方向的课程设计或毕业设计人群。压缩包采用zip格式&#xff0c;大小约117.43MB&#xff0c;内容覆盖项目报告、中期报告、答辩PPT、完整源代码与数据库文件&#x… · 2026/9/24 18:13:08

C#在线二手交易平台开发详解:从架构设计到避坑指南
C#在线二手交易平台开发详解:从架构设计到避坑指南

简介&#xff1a;基于C#语言开发的在线二手商品交易平台&#xff0c;面向毕业设计、课程设计场景&#xff0c;适合需要完成完整Web项目实践的学生与开发者。项目覆盖软件工程需求分析、系统设计、编码实现、数据库管理及测试部署等关键环节&#xff0c;能够帮助读者将理论知识转… · 2026/9/24 18:13:08

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介&#xff1a;这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源&#xff0c;围绕YOLOv8实现渔船作业监控系统&#xff0c;可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件&#xff0c;约24.21MB&#xff0c;以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介&#xff1a;面向时间序列数据建模的一维卷积神经网络完整实现&#xff0c;适合深度学习入门者及需要快速验证时序模型的研究者&#xff0c;能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小&#xff0c;只有3KB&#xff0c;内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L&#xff0c;而是舌尖上的L最近在几个方言群和语音教学社群里&#xff0c;反复看到有人发一句&#xff1a;“也说字母L&#xff1a;柔软的长舌”。初看以为是英语发音课笔记&#xff0c;点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码