1. 函数的基本概念与作用函数是编程中最基础也是最重要的概念之一。简单来说函数就是一段可以重复使用的代码块它接受输入参数执行特定操作然后返回结果。想象一下函数就像厨房里的榨汁机——你把水果参数放进去它执行榨汁操作函数体最后给你果汁返回值。在编程中函数主要解决三个问题代码复用避免重复编写相同功能的代码模块化将复杂问题分解为小功能块抽象化隐藏实现细节只暴露接口以Python为例一个最简单的函数定义如下def greet(name): return fHello, {name}!这个greet函数接收一个name参数返回拼接好的问候语。调用时只需写greet(Alice)而不需要每次问候都重写拼接字符串的逻辑。2. 函数的定义语法详解不同编程语言中函数的定义语法略有差异但核心结构相似。我们以几种主流语言为例2.1 Python函数定义def function_name(parameters): docstring # 函数体 return valuedef定义函数的关键字function_name函数名应使用小写字母和下划线parameters参数列表多个参数用逗号分隔docstring可选函数的说明文档return返回语句可以省略返回None2.2 JavaScript函数定义// 函数声明 function greet(name) { return Hello, ${name}!; } // 函数表达式 const greet function(name) { return Hello, ${name}!; } // 箭头函数ES6 const greet name Hello, ${name}!;2.3 Java函数定义public class Main { // 方法Java中称为方法 public static String greet(String name) { return Hello, name !; } }注意在面向对象语言中函数通常被称为方法因为它们属于某个类。3. 函数的参数传递机制理解参数传递方式是正确使用函数的关键。不同语言有不同的参数传递机制3.1 位置参数 vs 关键字参数def describe_pet(animal_type, pet_name): print(fI have a {animal_type} named {pet_name}.) # 位置参数调用 describe_pet(hamster, Harry) # 关键字参数调用 describe_pet(pet_nameHarry, animal_typehamster)3.2 默认参数值def describe_pet(pet_name, animal_typedog): print(fI have a {animal_type} named {pet_name}.) describe_pet(Willie) # 使用默认的animal_type3.3 可变参数# *args接收任意数量的位置参数 def make_pizza(*toppings): print(Making pizza with:) for topping in toppings: print(f- {topping}) make_pizza(pepperoni) make_pizza(mushrooms, green peppers, extra cheese) # **kwargs接收任意数量的关键字参数 def build_profile(first, last, **user_info): user_info[first_name] first user_info[last_name] last return user_info user_profile build_profile(albert, einstein, locationprinceton, fieldphysics)4. 函数的返回值处理函数的返回值是函数与调用者通信的重要方式。需要注意以下几点4.1 多返回值处理def get_name(): first John last Doe return first, last # 实际上是返回一个元组 name get_name() # name是元组(John, Doe) first, last get_name() # 元组解包4.2 返回函数高阶函数def get_multiplier(n): def multiplier(x): return x * n return multiplier times3 get_multiplier(3) times3(5) # 返回154.3 无返回值函数没有return语句或return后无值的函数实际上返回Nonedef no_return(): print(This function returns None) result no_return() print(result) # 输出None5. 函数的作用域规则理解变量作用域对编写正确函数至关重要5.1 局部变量与全局变量x global x # 全局变量 def test(): y local y # 局部变量 print(y) print(x) # 可以访问全局变量 test() print(y) # 报错y未定义5.2 global和nonlocal关键字def outer(): x outer x def inner(): nonlocal x # 声明使用外层函数的x x inner x inner() print(x) # 输出inner x outer()6. 函数调用的底层机制理解函数调用栈有助于调试复杂问题6.1 调用栈的工作原理每次函数调用时将返回地址和参数压入栈跳转到函数代码函数执行完毕从栈中弹出返回地址跳回调用处继续执行6.2 递归调用的栈行为def factorial(n): if n 1: return 1 return n * factorial(n-1) # 调用factorial(3)的栈变化 # factorial(3) - 3 * factorial(2) # factorial(2) - 2 * factorial(1) # factorial(1) - 17. 函数的最佳实践与常见错误7.1 函数设计原则单一职责原则一个函数只做一件事短小精悍理想情况下不超过一屏避免副作用尽量不修改外部状态描述性命名函数名应清晰表达功能7.2 常见错误示例# 错误1修改可变默认参数 def add_item(item, items[]): items.append(item) return items print(add_item(1)) # [1] print(add_item(2)) # [1, 2] 不是预期的[2] # 正确做法 def add_item(item, itemsNone): if items is None: items [] items.append(item) return items # 错误2忽略返回值 result some_function() if result: # 如果函数可能返回None/False/0等假值 process(result)7.3 性能考虑避免在循环内部定义函数对于频繁调用的小函数考虑使用内联或lambda合理使用缓存如Python的functools.lru_cachefrom functools import lru_cache lru_cache(maxsizeNone) def fibonacci(n): if n 2: return n return fibonacci(n-1) fibonacci(n-2)8. 实际案例闰年判断函数结合热词中的需求我们实现一个判断闰年的函数def is_leap(year): 判断是否为闰年 if year % 4 ! 0: return False elif year % 100 ! 0: return True else: return year % 400 0 # 输出1900-2020年间的闰年每行5个 count 0 for year in range(1900, 2021): if is_leap(year): print(year, end ) count 1 if count % 5 0: print()这个实现考虑了闰年的完整规则能被4整除但不能被100整除或者能被400整除9. 函数的高级应用9.1 函数作为参数传递def apply_operation(numbers, operation): return [operation(n) for n in numbers] def square(x): return x ** 2 numbers [1, 2, 3, 4] squared apply_operation(numbers, square) # [1, 4, 9, 16]9.2 闭包与装饰器def make_logger(func): def wrapper(*args, **kwargs): print(fCalling {func.__name__} with {args}, {kwargs}) result func(*args, **kwargs) print(f{func.__name__} returned {result}) return result return wrapper make_logger def add(a, b): return a b add(2, 3) # 输出 # Calling add with (2, 3), {} # add returned 59.3 生成器函数def fibonacci_sequence(max): a, b 0, 1 while a max: yield a a, b b, a b for num in fibonacci_sequence(100): print(num)10. 不同语言中的函数特性对比特性PythonJavaScriptJavaC一等函数支持支持有限支持函数指针匿名函数lambda箭头函数无无闭包支持支持有限支持无默认参数支持ES6支持不支持不支持可变参数*argsarguments可变参数va_list方法/函数都是函数都是函数区分方法只有函数在实际开发中理解这些差异有助于编写跨语言的代码也能帮助选择最适合特定任务的语言。
企业数字化 ERP 产品动态
相关推荐
AI写3D游戏实测:三大模型同台竞技,谁才是真正的编码王者? 最近圈子里的热聊话题,几乎都绕不开AI生成代码这件事。我干脆做了一次比较“狠”的实测:把 Step 5 Preview、DeepSeek V4 Pro、GLM5.3 三个模型拉到同一张考卷前,让它们分别从零开始做一个 3D 游戏。之所以选 3D 游戏,是因为它比普… · 2026/11/2 22:58:14
arXiv论文智能分析系统:NLP与推荐算法实践 1. 项目背景与核心价值arXiv作为全球最大的开放学术论文预印本平台,每天新增数百篇涵盖物理、数学、计算机等领域的学术论文。对于研究人员而言,如何高效追踪领域内最新进展一直是个痛点。传统方式需要人工筛选海量论文标题和摘要,效率低下且… · 2026/11/2 22:58:14
编程中break与continue的深度解析与应用场景 1. 理解break与continue的本质区别在编程中,break和continue是两个最常用的循环控制语句,但很多初学者经常混淆它们的作用。让我用一个生活中的例子来解释它们的核心区别:想象你正在吃一碗葡萄,break就像是当你吃到一颗坏葡萄时&a… · 2026/11/2 22:58:14
双目 3D 相机怎么选?ZED Mini 与 ZED 2i 参数与选型思路拆解 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 2:23:23
Mysql学习(1):揭秘数据库:十大核心优势与架构全解析 🔥keyipatience:个人主页 🎬作者简介:C/C后端开发学习者 🌟专栏传送门:《c》《linux》《c高阶数据结构》《c数据结构与算法》《前端学习》 《Git》《Mysql》 ⭐️patience is key in life 什么是数据库
数据库是20世纪… · 2026/11/3 2:23:23
why-did-you-render 深度解析: monkey patch 如何追踪可避免的重渲染 why-did-you-render 深度解析: monkey patch 如何追踪可避免的重渲染 【免费下载链接】why-did-you-render why-did-you-render by Welldone Software monkey patches React to notify you about potentially avoidable re-renders. (Works with React Native as well.) 项目… · 2026/11/3 2:23:23
OpCore-Simplify:十分钟生成完整 OpenCore EFI 的终极指南 OpCore-Simplify:十分钟生成完整 OpenCore EFI 的终极指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify
打开一台待装系统的笔记本&… · 2026/11/3 2:23:23
为什么你的跨数据集迁移学习没生效?Fashion-MNIST 迁移 CIFAR-10 的三个避坑决策 为什么你的跨数据集迁移学习没生效?Fashion-MNIST 迁移 CIFAR-10 的三个避坑决策 【免费下载链接】fashion-mnist A MNIST-like fashion product database. Benchmark :point_down: 项目地址: https://gitcode.com/gh_mirrors/fa/fashion-mnist
同一个模型&… · 2026/11/3 2:23:23
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18