Python 定义和调用函数

在Python编程中,函数是组织和重用代码的一种重要方式。函数可以提高代码的可读性和维护性,并且可以避免重复代码。

1. 定义函数

在Python中,函数使用def关键字定义。一个简单的函数定义包括函数名、参数列表和函数体。以下是一个基本的函数定义示例:

def greet(name):
    """
    打印问候语。
    
    参数:
    name (str): 要问候的人名。
    """
    print(f"Hello, {name}!")

在这个例子中,greet是函数名,name是参数,print语句是函数体。当你调用这个函数时,它会打印出一个问候语。

1.1 函数注释

函数注释(docstring)用于描述函数的作用、参数和返回值。它位于函数定义的第一行,使用三重引号括起来。良好的注释可以提高代码的可读性和可维护性。

1.2 函数参数

函数可以有多个参数,参数在函数名后的圆括号中定义,用逗号分隔。以下是一个接受多个参数的函数示例:

def add(a, b):
    """
    返回两个数的和。
    
    参数:
    a (int, float): 第一个数。
    b (int, float): 第二个数。
    
    返回值:
    int, float: 输入数的和。
    """
    return a + b

2. 调用函数

定义函数之后,你可以在代码的其他地方调用它。调用函数的语法是函数名后跟一对圆括号,括号内传入相应的参数。以下是调用上面greetadd函数的示例:

greet("Alice")
result = add(5, 3)
print(result)  # 输出:8

2.1 位置参数和关键字参数

在调用函数时,参数可以按位置或按名称传递。按位置传递参数称为位置参数,按名称传递参数称为关键字参数。

def introduce(name, age):
    """
    打印自我介绍。
    
    参数:
    name (str): 名字。
    age (int): 年龄。
    """
    print(f"My name is {name} and I am {age} years old.")

# 使用位置参数
introduce("Bob", 25)

# 使用关键字参数
introduce(age=30, name="Charlie")

2.2 默认参数值

你可以为函数参数指定默认值,这样在调用函数时可以省略这些参数。定义默认参数的方法是在参数名后加上等号和默认值。

def greet(name, greeting="Hello"):
    """
    打印问候语。
    
    参数:
    name (str): 要问候的人名。
    greeting (str): 问候语,默认值为"Hello"。
    """
    print(f"{greeting}, {name}!")

greet("David")  # 输出:Hello, David!
greet("Emma", "Hi")  # 输出:Hi, Emma!

3. 参数传递

Python中函数参数的传递方式有两种:按值传递和按引用传递。简单类型如整数、浮点数和字符串是按值传递的,而复杂类型如列表和字典是按引用传递的。

3.1 按值传递

按值传递意味着在函数内部修改参数的值不会影响函数外部的变量。

def modify_value(x):
    """
    尝试修改参数的值。
    
    参数:
    x (int): 一个整数。
    """
    x = 10
    print(f"Inside function: x = {x}")

value = 5
modify_value(value)
print(f"Outside function: value = {value}")  # 输出:Outside function: value = 5

3.2 按引用传递

按引用传递意味着在函数内部修改参数的值会影响函数外部的变量。

def modify_list(lst):
    """
    向列表中添加元素。
    
    参数:
    lst (list): 一个列表。
    """
    lst.append(4)
    print(f"Inside function: lst = {lst}")

my_list = [1, 2, 3]
modify_list(my_list)
print(f"Outside function: my_list = {my_list}")  # 输出:Outside function: my_list = [1, 2, 3, 4]

4. 作用域

作用域指的是变量在程序中的可见性和生命周期。Python有两种主要的作用域:全局作用域和局部作用域。

4.1 全局作用域

在全局作用域中定义的变量在整个程序中都可以访问。通常在模块级别(文件级别)定义的变量是全局变量。

global_var = "I am global"

def print_global():
    """
    打印全局变量。
    """
    print(global_var)

print_global()  # 输出:I am global

4.2 局部作用域

在函数内部定义的变量只能在函数内部访问,这些变量称为局部变量。

def print_local():
    """
    定义并打印局部变量。
    """
    local_var = "I am local"
    print(local_var)

print_local()  # 输出:I am local
# print(local_var)  # 这行代码会报错,因为local_var在函数外不可见

4.3 global 关键字

如果需要在函数内部修改全局变量,可以使用global关键字声明该变量。

counter = 0

def increment():
    """
    增加全局变量counter的值。
    """
    global counter
    counter += 1

increment()
print(counter)  # 输出:1

4.4 nonlocal 关键字

在嵌套函数中,如果需要修改外部函数的变量,可以使用nonlocal关键字。

def outer():
    """
    外部函数,定义变量。
    """
    x = "outer"
    
    def inner():
        """
        内部函数,修改外部函数变量。
        """
        nonlocal x
        x = "inner"
    
    inner()
    print(x)

outer()  # 输出:inner

5. 递归函数

递归函数是指在函数内部调用自身的函数。递归通常用于解决分治问题,例如计算阶乘或斐波那契数列。

5.1 计算阶乘

计算阶乘的递归函数示例:

def factorial(n):
    """
    计算n的阶乘。
    
    参数:
    n (int): 一个整数。
    
    返回值:
    int: n的阶乘。
    """
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)

print(factorial(5))  # 输出:120

5.2 计算斐波那契数列

计算斐波那契数列的递归函数示例:

def fibonacci(n):
    """
    计算斐波那契数列的第n个数。
    
    参数:
    n (int): 一个整数。
    
    返回值:
    int: 斐波那契数列的第n个数。
    """
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(6))  # 输出:8

6. 高阶函数

高阶函数是指接受另一个函数作为参数或返回另一个函数的函数。在Python中,函数是一等公民,这意味着函数可以作为参数传递,也可以作为返回值返回。

6.1 函数作为参数

以下是一个接受函数作为参数的示例:

def apply_function(func, value):
    """
    对给定值应用给定函数。
    
    参数:
    func (function): 一个函数。
    value (any): 一个值。
    
    返回值:
    any: 应用函数后的值。
    """
    return func(value)

def square(x):
    """
    计算x的平方。
    
    参数:
    x (int, float): 一个数。
    
    返回值:
    int, float: x的平方。
    """
    return x * x

print(apply_function(square, 5))  # 输出:25

6.2 函数作为返回值

以下是一个返回函数的示例:

def power(exponent):
    """
    返回一个计算幂的函数。
    
    参数:
    exponent (int): 幂指数。
    
    返回值:
    function: 一个计算幂的函数。
    """
    def inner(base):
        """
        计算base的exponent次幂。
        
        参数:
        base (int, float): 底数。
        
        返回值:
        int, float: base的exponent次幂。
        """
        return base ** exponent
    
    return inner

square = power(2)
print(square(3))  # 输出:9

7. lambda 表达式

lambda 表达式是用于创建小型匿名函数的简洁方式。lambda 函数可以有任意数量的参数,但只能有一个表达式。

# 定义一个 lambda 函数
square = lambda x: x * x

# 使用 lambda 函数
print(square(4))  # 输出:16

# 作为参数传递给高阶函数
print(apply_function(lambda x: x + 1, 7))  # 输出:8

8. 内置高阶函数

Python 提供了一些内置的高阶函数,如mapfilterreduce,它们可以用于函数式编程。

8.1 map 函数

map函数用于对可迭代对象中的每个元素应用一个函数,并返回一个迭代器。

numbers = [1, 2, 3, 4]
squared_numbers = map(lambda x: x * x, numbers)
print(list(squared_numbers))  # 输出:[1, 4, 9, 16]

8.2 filter 函数

filter函数用于过滤可迭代对象中的元素,保留满足条件的元素。

numbers = [1, 2, 3, 4, 5, 6]
even_numbers = filter(lambda x: x % 2 == 0, numbers)
print(list(even_numbers))  # 输出:[2, 4, 6]

8.3 reduce 函数

reduce函数用于对可迭代对象中的元素进行累积计算。它在functools模块中定义,需要手动导入。

from functools import reduce

numbers = [1, 2, 3, 4]
sum = reduce(lambda x, y: x + y, numbers)
print(sum)  # 输出:10

上面介绍了Python函数的定义和调用,包括位置参数、关键字参数和默认参数值。还讨论了参数传递、作用域和递归函数,高阶函数和lambda表达式,展示了如何在Python中使用函数进行更高级的编程操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/785976.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Python爬虫] 抓取京东商品数据||京东商品API接口采集

本文结构&#xff1a; 一、引言 二、代码分享 三、问题总结 引言 这两天因为一些需求&#xff0c;研究了一下如何爬取京东商品数据。最开始还是常规地使用selenium库进行商品页的商品抓取&#xff0c;后来因为想要获取优惠信息&#xff0c;只能进入到商品详情页进行抓取&#x…

苏东坡传-读书笔记十一

苏东坡对写作与风格所表示的意见最为清楚。他说做文章“大略如行云流水&#xff0c;初无定质&#xff0c;但常行于所当行&#xff0c;常止于所不可不止。文理自然&#xff0c;姿态横生。孔子曰&#xff1a;‘言之不文&#xff0c;行而不远。’又曰&#xff1a;‘辞达而已矣。’…

【Linux】:进程等待

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux进程等待的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门…

电竞玩家的云端盛宴!四大云电脑平台:ToDesk、顺网云、青椒云、极云普惠云实测大比拼

本文目录 一、云电脑概念及市场需求二、云电竞性能测试2.1 ToDesk云电脑2.2 顺网云2.3 青椒云2.4 极云普惠云电脑 三、四大云电脑平台综合配置对比3.1 CPU处理器3.2 GPU显卡3.3 内存 四、总结 一、云电脑概念及市场需求 在数字化时代的推动下&#xff0c;云计算技术日益成熟&a…

JAVA 代码块介绍

一、基本介绍 代码化块又称为初始化块&#xff0c;属于类中的成员[即 是类的一部分]&#xff0c;类似于方法&#xff0c;将逻辑语句封装在方法体中&#xff0c;通过包围起来。 但和方法不同&#xff0c;没有方法名&#xff0c;没有返回&#xff0c;没有参数&#xff0c;只有方…

Java面试八股之MySQL支持哪些数据类型

MySQL支持哪些数据类型 MySQL支持多种数据类型&#xff0c;这些类型可以大致分为三大类&#xff1a;数值类型、日期/时间类型和字符串类型。下面是一些常见的数据类型及其用途&#xff1a; 数值类型 整数类型&#xff1a; TINYINT&#xff1a;通常占用1字节。 SMALLINT&am…

注册商标为什么要先查询

注册商标为什么要先查询 在知识产权日益受到重视的今天&#xff0c;商标的注册成为了许多企业和个人保护其品牌价值和市场地位的重要手段。然而&#xff0c;商标注册并非一蹴而就的过程&#xff0c;其中一个关键的步骤就是商标查询&#xff0c;也就是我们通常所说的“商标检索…

STM32CubeMX如何配置生成项目以及安装包

目录 一、STM32CubeMX介绍 二、用STM32CubeMX生成项目 1.创建项目 2.定义引脚 3.配置时钟 4.保存项目 5.生成项目 6.打开项目 一、STM32CubeMX介绍 STM32CubeMX是STM32Cube工具家族中的一员&#xff0c;专门为STM32微控制器的开发提供便利。它是一款图形化工具&#xf…

新加坡工作和生活指北:租房篇

本文首发于公众号 Keegan小钢 前段时间已经分享了工作篇&#xff0c;现在接着聊聊生活篇。因为生活这块涉及到多个方面&#xff0c;内容比较多&#xff0c;所以我再细分了一下&#xff0c;本篇先聊聊租房。 先来看看新加坡的地区分布图&#xff0c;如下&#xff1a; 上图将新加…

【C语言】指针(3):探索-不同类型指针变量

目录 一、字符指针变量 二、数组指针变量 三、二维数组传参的本质 四、函数指针变量 4.1 函数指针变量 4.2 函数指针变量的使用 4.3 函数指针变量的拓展 五、函数指针数组 六、转移表的应用 通过深入理解指针&#xff08;1&#xff09;和深入理解指针&#xff08;2&am…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第十二章 Linux 权限管理

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

Python 插入、替换、提取、或删除Excel中的图片

Excel是主要用于处理表格和数据的工具&#xff0c;我们也能在其中插入、编辑或管理图片&#xff0c;为工作表增添视觉效果&#xff0c;提升报告的吸引力。本文将详细介绍如何使用Python操作Excel中的图片&#xff0c;包含以下4个基础示例&#xff1a; 文章目录 Python 在Excel…

Autogen基本使用介绍

文章目录 一&#xff0c;Build1&#xff0c;Skill2&#xff0c;Models3&#xff0c;agents4,workflow 二&#xff0c;Playground 本文唯一目的就是介绍一下Autogen Studio的基本的使用。 打开这个网页以后&#xff0c;看到它有2个菜单&#xff0c;分别是&#xff1a; BuildPla…

07-7.3.2 平衡二叉树(AVL)

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

使用 Qt 和 ECharts 进行数据可视化

文章目录 示例图表预览折线图散点图柱状图使用 Qt 和 ECharts 进行数据可视化一、准备工作1. 安装 Qt2. 准备 ECharts二、在 Qt 中使用 ECharts1. 创建 Qt 项目2. 配置项目文件3. 在 UI 中添加 WebEngineView4. 加载 ECharts三、创建折线图、散点图和柱状图1. 折线图2. 散点图3…

工作流之战: Flowable vs. Camunda vs. Activiti

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 工作流之战: Flowable vs. Camunda vs. Activiti 前言功能特性对比架构设计分析性能比较使用场景…

zookeeper加入开机启动项

Windows的任务计划程序&#xff08;Task Scheduler&#xff09;是一个强大的工具&#xff0c;允许你安排程序在特定时间自动运行&#xff0c;包括开机时。 打开任务计划程序&#xff1a; 按下Win R键&#xff0c;打开“运行”对话框。输入taskschd.msc并回车&#xff0c;打开…

js ES6 part1

听了介绍感觉就是把js在oop的使用 作用域 作用域&#xff08;scope&#xff09;规定了变量能够被访问的“范围”&#xff0c;离开了这个“范围”变量便不能被访问&#xff0c; 作用域分为&#xff1a; 局部作用域、 全局作用域 1. 函数作用域&#xff1a; 在函数内部声明的…

Docker定时清理

一、循环调度执行 1、检查cron状态 systemctl status crond 2、创建要执行的shell脚本 vim /home/cleanup_docker.sh #! /bin/bash # 清理临时文件 echo $(date "%H:%M:%S") "执行docker清理命令..." docker system prune -af-a 清理包括未使用的镜像 …

Vue3动态路由(响应式带参数的路由)变更页面不刷新的问题

背景 先说说问题&#xff0c;问题来源是因为我的开源项目Maple-Boot项目的网站前端&#xff0c;因为项目主打的内容发布展示&#xff0c;所以其中的内容列表页会根据不同的菜单进行渲染不同的路由。 这里路由path使用的是/blog/:menu?&#xff0c;通过menu的参数来渲染对应的…