当前位置: 首页 > news >正文

Python学习:函数

函数定义

在这里插入图片描述
在Python中,函数(Function)是一组用于完成特定任务或计算的语句块。定义函数可以让我们将一段代码重用多次,提高代码的可读性和可维护性。以下是定义函数的基本语法和结构:

def function_name(parameters):"""Docstring: 函数说明文档,描述函数的功能、参数和返回值等信息"""# 函数体,实现函数的具体功能result = some_operation(parameters)return result  # 可选的返回值
  • def:关键字用于定义函数。
  • function_name:函数的名称,标识符命名规则与变量相同。
  • parameters:函数的参数,可以是零个或多个。参数是在函数被调用时传递给函数的值。
  • Docstring:用于书写函数的说明文档,建议在函数开头使用三引号(单引号或双引号)多行字符串格式书写。
  • 函数体:包含函数执行的代码块,实现函数的具体功能。
  • return:可选项,用于返回函数的结果给调用者。

以下是一个简单的示例来说明如何定义一个简单的函数:

def greet(name):"""这个函数用于向指定的人打招呼"""return "Hello, " + name + "!"

上面定义了一个名为greet的函数,接受一个名为name的参数,并返回一个打招呼的消息字符串。

在Python中,函数体的缩进非常重要,用于定义函数体内的代码块范围。另外,Python中的函数也支持默认参数、可变参数等特性,使得函数更加灵活和强大。

函数调用

函数调用是指在程序中使用函数来执行特定的任务或操作。在Python中,函数调用是通过提供函数名称和必要的参数(如果有的话)来触发函数执行。下面详细解释函数调用的过程:

  1. 函数定义:首先,你需要定义所需的函数。函数定义包含函数名称、参数列表、函数体和返回值等内容。例如:
def greet(name):return "Hello, " + name + "!"
  1. 函数调用:接下来,你可以在代码中通过函数名和传递参数来调用函数。被调用的函数将会执行其中的语句并返回一个值(如果定义了返回语句)。例如:
message = greet("Alice")
print(message)

在这个例子中,我们调用了greet函数并传递了参数"Alice",函数执行后返回了一个打招呼的消息字符串并赋值给message变量,然后将这个消息打印出来。

  1. 参数传递:参数传递是函数调用的重要部分。在函数定义中,参数是接收函数传入数据的变量。这些参数可以是必需的,也可以是可选的(带有默认值)。根据定义的参数类型和顺序,调用函数时要传递相应的参数。

  2. 返回值:函数可以选择性地返回一个值。返回值是函数执行后产生的输出,可以被赋值给一个变量或者直接使用。如果函数没有明确的返回语句,它将返回None

当调用函数时,程序会跳转到函数体中执行相应的操作,直到遇到return语句,然后将控制权交还给调用方。

函数调用是利用函数完成特定任务或操作的方式。通过合适地定义和调用函数,可以提高代码的复用性和可读性,从而更高效地编写程序。

函数参数

在Python中,函数参数可以分为以下几种类型:位置参数、默认参数、可变位置参数、可变关键字参数和关键字参数。下面我会详细解释每种参数的特点和用法:

  1. 位置参数(Positional Arguments):

    • 位置参数是指在调用函数时根据参数的位置顺序传递的参数,必须按照定义函数时的参数顺序进行传递。
    • 示例:def greet(name, age):
  2. 默认参数(Default Arguments):

    • 默认参数是在定义函数时就指定初始值的参数。调用函数时如果没有传递具体参数,则会使用默认值。
    • 示例:def greet(name, age=30):
  3. 可变位置参数(Arbitrary Arguments):

    • 可变位置参数允许函数接受任意数量的位置参数,这些参数会被收集成一个元组。
    • 示例:def sum_values(*args):
  4. 可变关键字参数(Arbitrary Keyword Arguments):

    • 可变关键字参数允许函数接受任意数量的关键字参数,这些参数会被收集成一个字典。
    • 示例:def display_info(**kwargs):
  5. 关键字参数(Keyword Arguments):

    • 关键字参数提供了参数名称和参数值之间的对应关系,用于明确指定参数取值,可以与位置参数混合使用。
    • 示例:def send_email(subject, body, to):

下面是一个结合以上所有参数种类的示例:

def example_func(name, age=30, *args, **kwargs):print("Name:", name)print("Age:", age)print("Extra positional arguments:", args)print("Extra keyword arguments:", kwargs)# 函数调用
example_func("Alice", 25, "extra1", "extra2", key1="value1", key2="value2")

在这个示例中,name是一个位置参数,age是一个默认参数,*args是可变位置参数,**kwargs是可变关键字参数。通过这些函数参数种类的组合,我们可以非常灵活地定义和调用函数,以适应不同的需求。

函数参数传递

在Python中,函数参数传递分为两种:传递不可变对象和传递可变对象。下面我会详细解释这两种情况下函数参数的传递方式:

1. 传递不可变对象(如数字、字符串、元组等)

当向函数传递不可变对象时,实际上是将对象的值传递给了函数,而函数内部对这个值的修改不会影响到原始对象。

def update_value(x):  # x为不可变对象x = x + 10  # 对x进行修改,不影响原始对象value = 5
update_value(value)
print(value)  # 输出结果为 5,原始对象未受影响

2. 传递可变对象(如列表、字典等)

当向函数传递可变对象时,实际上传递的是对象的引用(内存地址),因此在函数内部对这个对象的修改会影响到原始对象。

def append_value(lst):  # lst为可变对象lst.append(10)  # 在lst末尾添加元素,会影响原始对象my_list = [1, 2, 3]
append_value(my_list)
print(my_list)  # 输出结果为 [1, 2, 3, 10],原始对象被修改

总的来说,在Python中,函数参数传递主要分为以下两点:

  • 对于不可变对象,传递的是对象的值,函数内部对参数的修改不会影响原始对象。
  • 对于可变对象,传递的是对象的引用,函数内部对参数的修改会影响原始对象。

理解函数参数传递的机制可以帮助我们更好地设计和调用函数,确保程序行为符合预期。

匿名函数

匿名函数在Python中也称为lambda函数,它是一种简洁的函数形式,用于定义一次性、简单的函数。与普通的函数不同,匿名函数没有函数名称,通过lambda关键字创建,通常用来在代码中临时定义和使用简单的函数。下面我会详细解释匿名函数的语法和用法:

语法:

lambda arguments: expression
  • lambda:关键字用于声明匿名函数。
  • arguments:参数列表,类似于普通函数。
  • expression:函数体,即函数要执行的操作,最后表达式的值作为返回值。

示例:

  1. 使用匿名函数求平方:
square = lambda x: x ** 2
print(square(5))  # 输出结果为 25
  1. 使用匿名函数进行加法操作:
addition = lambda a, b: a + b
print(addition(3, 4))  # 输出结果为 7
  1. 匿名函数作为排序的key函数:
students = [('Alice', 22), ('Bob', 19), ('Eve', 25)]
students.sort(key=lambda x: x[1])  # 按照年龄排序
print(students)  # 输出结果为 [('Bob', 19), ('Alice', 22), ('Eve', 25)]

特点:

  • 精简:匿名函数通常在需要一个简单的函数时使用,可以避免额外定义普通函数。
  • 单行:通常用于单行表达式,不支持多条语句。

尽管匿名函数在一些情况下非常方便和实用,但由于其简洁的特性,复杂逻辑通常不适合使用匿名函数。在这种情况下,应该使用普通的具名函数来实现。
在这里插入图片描述

return 语句

在Python中,return语句用于从函数中返回一个值。return语句可以出现在函数体中的任何地方,一旦执行到return语句,函数将立即停止执行,并返回指定的值给调用者。下面我会详细解释return语句的用法和特点:

用法:

  1. 返回值return语句通常用于返回函数执行的结果,这个结果可以是任何数据类型(例如整数、字符串、列表等)。
def add(a, b):return a + bresult = add(3, 5)
print(result)  # 输出结果为 8
  1. 终止函数return语句不仅用于返回值,还可以提前终止函数的执行。
def check_value(x):if x < 0:return "Value is negative"else:return "Value is positive"print(check_value(-2))  # 输出结果为 "Value is negative"
  1. 返回多个值return语句也可以用于返回多个值,实际上返回的是一个元组,利用元组的解构赋值可以获取这些值。
def calculate(a, b):total = a + bdifference = a - breturn total, differencesum_result, diff_result = calculate(8, 3)
print(sum_result)  # 输出结果为 11
print(diff_result)  # 输出结果为 5

特点:

  • 函数执行到return语句时会立即停止,并返回指定的值。
  • 如果return语句没有指定返回值,函数将返回None
  • 函数可以有多个return语句,但一般只有一个return会被执行。
  • 在函数的任何地方都可以使用return语句来提前终止函数的执行。

理解return语句的作用和用法有助于控制函数的返回结果和流程。在编写函数时,合理使用return语句可以使函数更加灵活和可靠。

强制位置参数

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

在这里插入图片描述

相关文章:

  • 【线段树二分】第十三届蓝桥杯省赛C++ A组/研究生组 Python 研究生组《扫描游戏》(C++)
  • 【JVM】JVM简介
  • 【C/C++】奇偶位互换
  • mysql安装及操作
  • SpringMVC基础Controller
  • 鸿蒙(HarmonyOS)Navigation如何实现多场景UI适配?
  • 请简单介绍一下Shiro框架是什么?Shiro在Java安全领域的主要作用是什么?Shiro主要提供了哪些安全功能?
  • MC0248 密码判断器(判断强弱密码)
  • C/C++ ② —— C++11智能指针
  • 『Apisix进阶篇』动态负载均衡:APISIX的实战演练与策略应用
  • MySQL面试题--MySQL内部技术架构
  • SVM回归预测
  • AWS EC2设置root登录
  • centos 安装wget
  • npm常用命令详解
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【css3】浏览器内核及其兼容性
  • 10个最佳ES6特性 ES7与ES8的特性
  • gulp 教程
  • js 实现textarea输入字数提示
  • laravel5.5 视图共享数据
  • PHP的Ev教程三(Periodic watcher)
  • Python连接Oracle
  • 程序员最讨厌的9句话,你可有补充?
  • 翻译:Hystrix - How To Use
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 前端js -- this指向总结。
  • 什么是Javascript函数节流?
  • 实习面试笔记
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 数组大概知多少
  • 温故知新之javascript面向对象
  • 我的面试准备过程--容器(更新中)
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 学习笔记TF060:图像语音结合,看图说话
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 自定义函数
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #stm32整理(一)flash读写
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (zhuan) 一些RL的文献(及笔记)
  • (二)WCF的Binding模型
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (全注解开发)学习Spring-MVC的第三天
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)setTimeout 和 setInterval 的区别
  • (转载)Linux 多线程条件变量同步
  • .NET Windows:删除文件夹后立即判断,有可能依然存在