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方法/函数都是函数都是函数区分方法只有函数在实际开发中理解这些差异有助于编写跨语言的代码也能帮助选择最适合特定任务的语言。
阅读完成 · 觉得有帮助?