初面网初面网

函数——定义、参数、返回值、作用域

概念讲解

函数是一段可以反复使用的代码块。好的函数设计原则:一个函数只做一件事

def 函数名(参数1, 参数2=默认值):
    # 函数体
    return 结果

参数类型:

  • 位置参数:按顺序传递
  • 关键字参数:name=value 形式,可不按顺序
  • 默认参数:有默认值的参数
  • 可变参数:*args(元组)、**kwargs(字典)

作用域:

  • 局部作用域:函数内部定义的变量,只在函数内有效
  • 全局作用域:函数外部定义的变量,整个文件可见
  • 在函数内部用 global 声明可以修改全局变量(但尽量少用)

代码示例

函数组合:文本分析器

def count_words(text):
    """统计文本中的单词数和平均词长"""
    words = text.split()
    if not words:
        return 0, 0.0
    total_length = sum(len(w) for w in words)
    return len(words), total_length / len(words)

def word_frequency(text):
    """统计每个单词出现的频率"""
    words = text.lower().split()
    freq = {}
    for word in words:
        freq[word] = freq.get(word, 0) + 1
    return freq

def top_words(text, n=5):
    """返回出现频率最高的n个词"""
    freq = word_frequency(text)
    sorted_words = sorted(freq.items(), key=lambda x: x[1], reverse=True)
    return sorted_words[:n]

# 使用
text = "Python is great Python is easy Python is popular"
num_words, avg_len = count_words(text)
print(f"单词数: {num_words}, 平均词长: {avg_len:.1f}")

print("词频统计:")
for word, count in word_frequency(text).items():
    print(f"  {word}: {count}")

print(f"最常见的3个词: {top_words(text, 3)}")

可变默认参数的坑

# 错误写法:默认参数用了可变对象
def bad_append(item, targets=[]):
    targets.append(item)
    return targets

# 正确写法:用None作为哨兵值
def good_append(item, targets=None):
    if targets is None:
        targets = []
    targets.append(item)
    return targets

print(bad_append(1))  # [1]
print(bad_append(2))  # [1, 2]  ← 意外!默认列表被保留了
print(good_append(1)) # [1]
print(good_append(2)) # [2]     ← 正确,每次都是新列表

练习题

题目:写一个函数,接受任意个整数,返回其中的最大值、最小值和平均值。

要求:

  • 不使用 max()min()sum() 等内置函数
  • 如果传入空列表,返回 None
参考答案
def stats(*numbers):
    if not numbers:
        return None
    
    max_val = min_val = numbers[0]
    total = 0
    
    for n in numbers:
        if n > max_val:
            max_val = n
        if n < min_val:
            min_val = n
        total += n
    
    return {
        'max': max_val,
        'min': min_val,
        'avg': total / len(numbers)
    }

result = stats(10, 5, 8, 20, 3)
print(result)
# {'max': 20, 'min': 3, 'avg': 9.2}

关键思维:

  • *numbers 收集所有位置参数为元组
  • 初始化 max_val = min_val = numbers[0],避免空列表问题
  • 返回字典而非多个值,调用方更清晰

更新于 2026/6/7