day26 Python 自定义函数

目录

一、函数的基本定义

[示例 1:不带参数的函数](#示例 1:不带参数的函数)

[示例 2:查看文档字符串](#示例 2:查看文档字符串)

二、带参数的函数

[示例 3:带一个参数的函数](#示例 3:带一个参数的函数)

[示例 4:带多个参数的函数](#示例 4:带多个参数的函数)

三、带返回值的函数

[示例 5:计算两个数的和并返回结果](#示例 5:计算两个数的和并返回结果)

[示例 6:返回多种类型的数据](#示例 6:返回多种类型的数据)

四、变量作用域

[示例 7:变量作用域示例](#示例 7:变量作用域示例)

五、函数的参数类型

[1. 位置参数](#1. 位置参数)

[2. 默认参数值](#2. 默认参数值)

[3. 可变数量参数](#3. 可变数量参数)

*args(收集位置参数)

**kwargs(收集关键字参数)

[4. 同时使用 *args 和 **kwargs](#4. 同时使用 *args 和 **kwargs)

六、总结


在 Python 编程中,函数是代码复用和模块化的核心工具。Python 提供了许多内置函数和库函数,但掌握自定义函数的创建和使用,才能真正发挥编程的灵活性和高效性。本文将从函数的基本定义入手,逐步深入到参数类型、变量作用域等高级用法,帮助你全面掌握自定义函数的精髓。

一、函数的基本定义

函数是封装了一段特定功能的代码块,可以通过函数名和参数调用。Python 中定义函数的基本语法如下:

复制代码
def function_name(parameter1, parameter2, ...):
    """
    Docstring: 描述函数的功能、参数和返回值 (可选但强烈推荐)
    """
    # 函数体: 实现功能的代码
    # ...
    return value  # 可选,用于返回结果
  • def 是定义函数的关键字。

  • function_name 是函数的名称,通常使用小写字母和下划线命名,例如 calculate_area

  • parameter1, parameter2, ... 是函数的参数,用于接收调用时传入的值。

  • (): 参数列表必须放在圆括号中,即使没有参数,括号也不能省略。

  • : 冒号表示函数定义的头部结束,接下来是缩进的函数体。

  • Docstring 是位于函数定义第一行的多行字符串,用于解释函数的作用、参数、返回值等。可以通过 help(function_name)function_name.__doc__ 查看。

  • 函数体 是缩进的代码块,包含实现函数功能的语句。

  • return value 用于从函数中返回一个值。如果没有 return 语句,或者 return 后面没有值,函数会自动返回 None

示例 1:不带参数的函数

复制代码
def greet():
    """打印一句问候语。"""
    message = "大家好!欢迎学习 Python 函数定义!"
    print(message)

greet()

输出:

大家好!欢迎学习 Python 函数定义!

示例 2:查看文档字符串

复制代码
print(greet.__doc__)

输出:

打印一句问候语。

二、带参数的函数

函数的参数分为形参和实参:

  • 形参:在函数定义中列出的变量名。

  • 实参:在函数调用时传递给函数的实际值。

示例 3:带一个参数的函数

复制代码
def greet_person(name):
    """根据给定的名字打印问候语。

    Args:
        name (str): 要问候的人的名字。
    """
    message = f"你好, {name}! 很高兴认识你。"
    print(message)

greet_person("张三")

输出:

你好, 张三! 很高兴认识你。

示例 4:带多个参数的函数

复制代码
def add_features(feature1, feature2):
    """计算两个数值特征的和。

    Args:
        feature1 (float or int): 第一个特征值。
        feature2 (float or int): 第二个特征值。
    """
    total = feature1 + feature2
    print(f"{feature1} + {feature2} = {total}")

add_features(10, 25)

输出:

10 + 25 = 35

三、带返回值的函数

函数不仅可以执行操作(如打印),还可以计算并返回一个结果。

示例 5:计算两个数的和并返回结果

复制代码
def calculate_sum(a, b):
    """计算两个数的和并返回结果。

    Args:
        a (float or int): 第一个数。
        b (float or int): 第二个数。

    Returns:
        float or int: 两个数的和。
    """
    result = a + b
    return result

print(calculate_sum(2, 3))

输出:

5

示例 6:返回多种类型的数据

复制代码
def preprocess_data(raw_data_points):
    """模拟数据预处理,例如将所有数据点乘以 2。

    Args:
        raw_data_points (list): 原始数据点列表。

    Returns:
        list: 处理后的数据点列表。
    """
    processed = []
    for point in raw_data_points:
        processed.append(point * 2)
    return processed

data = [1, 2, 3, 4, 5]
processed_data = preprocess_data(data)

print(f"原始数据: {data}")
print(f"预处理后数据: {processed_data}")

输出:

复制代码
原始数据: [1, 2, 3, 4, 5]
预处理后数据: [2, 4, 6, 8, 10]

四、变量作用域

理解变量在何处可见和可访问非常重要。

  • 局部变量:在函数内部定义的变量,只在该函数内部有效。当函数执行完毕后,局部变量通常会被销毁。

  • 全局变量 :在所有函数外部定义的变量,可以在程序的任何地方被访问。但在函数内部修改全局变量需要特殊声明(如 global 关键字)。

示例 7:变量作用域示例

复制代码
global_var = "我是一个全局变量"

def scope_test():
    local_var = "我是一个局部变量"
    print(f"在函数内部,可以看到局部变量: '{local_var}'")
    print(f"在函数内部,也可以看到全局变量: '{global_var}'")

scope_test()
print(f"\n在函数外部,可以看到全局变量: '{global_var}'")

输出:

复制代码
在函数内部,可以看到局部变量: '我是一个局部变量'
在函数内部,也可以看到全局变量: '我是一个全局变量'

在函数外部,可以看到全局变量: '我是一个全局变量'

五、函数的参数类型

Python 函数的参数类型丰富多样,包括位置参数、默认参数值、可变数量参数等。

1. 位置参数

位置参数是按顺序匹配的参数。

复制代码
def describe_pet(animal_type, pet_name):
    """显示宠物的信息。"""
    print(f"\n我有一只 {animal_type}.")
    print(f"我的 {animal_type} 的名字叫 {pet_name.title()}.")

describe_pet("猫", "咪咪")

输出:

复制代码
我有一只 猫.
我的 猫 的名字叫 咪咪.

为了提高可读性,推荐使用关键字参数。

复制代码
describe_pet(animal_type="猫", pet_name="咪咪")

2. 默认参数值

默认参数值是在定义函数时给参数指定的默认值。调用时如果未提供该参数,则使用默认值。

复制代码
def describe_pet_default(pet_name, animal_type="狗"):
    """显示宠物的信息,动物类型默认为狗。

    Args:
        pet_name (str): 宠物的名字。
        animal_type (str, optional): 动物类型,默认为 "狗"。
    """
    print(f"我有一只 {animal_type}.")
    print(f"我的 {animal_type} 的名字叫 {pet_name.title()}.")

describe_pet_default(pet_name="小黑")
describe_pet_default(pet_name="雪球", animal_type="仓鼠")

输出:

复制代码
我有一只 狗.
我的 狗 的名字叫 小黑.

我有一只 仓鼠.
我的 仓鼠 的名字叫 雪球.

3. 可变数量参数

可变数量参数允许函数接收不定数量的参数。

*args(收集位置参数)

*args 将多余的位置参数收集为一个元组。

复制代码
def make_pizza(size, *toppings):
    """概述要制作的比萨。"""
    print(f"\n制作一个 {size} 寸的比萨,配料如下:")
    if toppings:
        for topping in toppings:
            print(f"- {topping}")
    else:
        print("- 原味 (无额外配料)")

make_pizza(12, "蘑菇")
make_pizza(16, "香肠", "青椒", "洋葱")
make_pizza(9)

输出:

复制代码
制作一个 12 寸的比萨,配料如下:
- 蘑菇

制作一个 16 寸的比萨,配料如下:
- 香肠
- 青椒
- 洋葱

制作一个 9 寸的比萨,配料如下:
- 原味 (无额外配料)
**kwargs(收集关键字参数)

**kwargs 将多余的关键字参数收集为一个字典。

复制代码
def build_profile(first_name, last_name, **user_info):
    """创建一个字典,其中包含我们知道的有关用户的一切。"""
    profile = {}
    profile['first_name'] = first_name
    profile['last_name'] = last_name
    for key, value in user_info.items():
        profile[key] = value
    return profile

user_profile = build_profile('爱因斯坦', '阿尔伯特',
                             location='普林斯顿',
                             field='物理学',
                             hobby='小提琴')
print(f"\n用户信息: {user_profile}")

输出:

用户信息: {'first_name': '爱因斯坦', 'last_name': '阿尔伯特', 'location': '普林斯顿', 'field': '物理学', 'hobby': '小提琴'}

4. 同时使用 *args 和 **kwargs

复制代码
def process_data(id_num, name, *tags, status="pending", **details):
    print(f"ID: {id_num}")
    print(f"Name: {name}")
    print(f"Tags (*args): {tags}")
    print(f"Status: {status}")
    print(f"Details (**kwargs): {details}")
    print("-" * 20)

process_data(101, "Alice", "vip", "new_user", location="USA", age=30)
process_data(102, "Bob", status="active", department="Sales")
process_data(103, "Charlie", "admin")
process_data(name="David", id_num=104, profession="Engineer")

输出:

复制代码
ID: 101
Name: Alice
Tags (*args): ('vip', 'new_user')
Status: pending
Details (**kwargs): {'location': 'USA', 'age': 30}
--------------------
ID: 102
Name: Bob
Tags (*args): ()
Status: active
Details (**kwargs): {'department': 'Sales'}
--------------------
ID: 103
Name: Charlie
Tags (*args): ('admin',)
Status: pending
Details (**kwargs): {}
--------------------
ID: 104
Name: David
Tags (*args): ()
Status: pending
Details (**kwargs): {'profession': 'Engineer'}
--------------------

六、总结

系统地学习了 Python 自定义函数的定义、参数类型、变量作用域等核心概念。函数是编程中不可或缺的工具,掌握自定义函数的使用,可以让你的代码更加模块化、可复用和易于维护。

@浙大疏锦行

相关推荐
小虎卫远程打卡app11 分钟前
视频编解码学习十二之Android疑点
学习·视频编解码
岁岁岁平安16 分钟前
Vue3学习(组合式API——reactive()和ref()函数详解)
前端·javascript·vue.js·学习·vue3·reactive·ref
Java程序员-小白17 分钟前
使用java -jar命令指定VM参数-D运行jar包报错问题
java·开发语言·jar
AI technophile27 分钟前
OpenCV计算机视觉实战(5)——图像基础操作全解析
python·opencv·计算机视觉
Time Famine32 分钟前
射击游戏demo11
python·游戏·pygame
Camellia031136 分钟前
嵌入式学习--江协51单片机day6
嵌入式硬件·学习·51单片机
外星猪猪36 分钟前
嵌入式调试新宠!J-Scope:免费+实时数据可视化,让MCU调试效率飙升!
单片机·嵌入式硬件·信息可视化
ClearViper31 小时前
Java的多线程笔记
java·开发语言·笔记
敷啊敷衍1 小时前
深入探索 C++ 中的 string 类:从基础到实践
开发语言·数据结构·c++
学地理的小胖砸1 小时前
【Python 面向对象】
开发语言·python