10.python函数

你提供的信息非常全面地介绍了Python函数的基础概念和用法。为了确保内容的现代性和准确性,我将对一些细节进行更新,并提供一些Python 3.x版本中的最佳实践。

文章目录

      • Python 函数
        • 定义一个函数
        • 实例:打印传入的字符串
        • 函数调用
        • 参数传递
          • 传不可变对象实例
          • 传可变对象实例
        • 参数类型
          • 关键字参数示例
          • 不定长参数示例
        • 匿名函数(Lambda)
          • Lambda 示例
        • 变量作用域
          • 全局变量和局部变量示例
        • 总结
      • 1. 函数的高级特性
        • 1.1 函数是一等公民
        • 1.2 闭包(Closures)
      • 2. 装饰器(Decorators)
        • 2.1 参数化装饰器
      • 3. 生成器(Generators)
      • 4. 协程(Coroutines)
      • 5. 内置函数与高阶函数
      • 6. 函数式编程
      • 7. 函数的性能优化
        • 7.1 使用`functools.lru_cache`
        • 7.2 使用`@staticmethod`和`@classmethod`
      • 8. 元编程(Metaprogramming)
      • 9. 函数的文档字符串(Docstrings)
      • 10. 函数的类型注解(Type Annotations)
      • 总结

Python 函数

定义一个函数

在Python中,使用def关键字来定义一个函数。函数可以接受参数(也称为形参),并且可以选择性地返回一个值。下面是一个简单的函数定义:

def function_name(parameters):"""文档字符串 - 函数的简短描述"""# 函数体return [expression]  # 可选
  • function_name: 函数的名字。
  • parameters: 参数列表,可以为空。
  • return: 返回语句,用于返回一个值给调用者。如果没有return语句或仅使用return,则函数默认返回None
实例:打印传入的字符串
def printme(string):"""打印传入的字符串到标准输出设备上"""print(string)return  # 可选
函数调用

定义了函数之后,可以通过函数名加上圆括号并传递实际参数来调用它:

printme("我要调用用户自定义函数!")
printme("再次调用同一函数")
参数传递

Python中的参数传递机制基于对象引用。根据对象是否可变,参数传递的行为有所不同:

  • 不可变类型(如整数、浮点数、字符串、元组):按值传递,函数内部修改不会影响外部变量。
  • 可变类型(如列表、字典、集合):按引用传递,函数内部修改会影响外部变量。
传不可变对象实例
def change_int(a):a = 10b = 2
change_int(b)
print(b)  # 输出: 2
传可变对象实例
def changeme(mylist):"""修改传入的列表"""mylist.append([1, 2, 3, 4])print("函数内取值:", mylist)returnmylist = [10, 20, 30]
changeme(mylist)
print("函数外取值:", mylist)  # 输出: [10, 20, 30, [1, 2, 3, 4]]
参数类型

Python支持多种类型的参数:

  • 必备参数:必须按照正确的顺序传递,数量必须与声明时一致。
  • 关键字参数:通过参数名传递,顺序可以不同。
  • 默认参数:如果未提供参数,则使用默认值。
  • 不定长参数:允许传递任意数量的参数,使用*args接收位置参数,**kwargs接收关键字参数。
关键字参数示例
def printinfo(name, age=35):"""打印传入的信息"""print(f"Name: {name}")print(f"Age: {age}")printinfo(age=50, name="miki")  # 使用关键字参数
printinfo(name="miki")  # 使用默认参数
不定长参数示例
def print_info(arg1, *vartuple):"""打印任何传入的参数"""print("输出:")print(arg1)for var in vartuple:print(var)print_info(10)
print_info(70, 60, 50)
匿名函数(Lambda)

匿名函数是一种没有名称的函数,通常用于需要简单函数的地方。它们使用lambda关键字定义,语法如下:

lambda arguments: expression
Lambda 示例
sum = lambda arg1, arg2: arg1 + arg2print("相加后的值为:", sum(10, 20))
print("相加后的值为:", sum(20, 20))
变量作用域

Python中有两种主要的作用域:全局作用域和局部作用域。

  • 全局变量:在函数外部定义,可以在整个程序中访问。
  • 局部变量:在函数内部定义,只能在函数内部访问。
全局变量和局部变量示例
total = 0  # 全局变量def sum(arg1, arg2):"""返回两个参数的和"""total = arg1 + arg2  # 局部变量print("函数内是局部变量:", total)return totalsum(10, 20)
print("函数外是全局变量:", total)  # 输出: 0

如果你希望在函数内部修改全局变量,可以使用global关键字:

def modify_global():global totaltotal = 50  # 修改全局变量modify_global()
print("修改后的全局变量:", total)  # 输出: 50
总结

Python函数提供了强大的功能,使得代码更加模块化和可重用。通过理解函数的定义、调用、参数传递、作用域等概念,你可以编写出结构清晰、易于维护的代码。如果你有更多问题或需要进一步的解释,请随时告诉我!

理解您希望获得更深入和详细的Python函数讲解。接下来,我将提供一些更高级的概念、最佳实践以及一些内部工作原理的解释,以帮助您更深刻地理解Python函数。

1. 函数的高级特性

1.1 函数是一等公民

在Python中,函数是一等公民(first-class citizen),这意味着它们可以被赋值给变量、作为参数传递给其他函数、从函数中返回,甚至可以在运行时创建。

示例:

# 将函数赋值给变量
def greet(name):return f"Hello, {name}!"greet_someone = greet
print(greet_someone("Alice"))  # 输出: Hello, Alice!# 函数作为参数传递
def shout(text):return text.upper()def whisper(text):return text.lower()def greet(style, name):return style(f"Hello, {name}!")print(greet(shout, "Bob"))  # 输出: HELLO, BOB!
print(greet(whisper, "Charlie"))  # 输出: hello, charlie!# 函数作为返回值
def make_multiplier_of(n):def multiplier(x):return x * nreturn multipliertimes3 = make_multiplier_of(3)
times5 = make_multiplier_of(5)print(times3(9))  # 输出: 27
print(times5(3))  # 输出: 15
1.2 闭包(Closures)

闭包是指一个函数对象,它不仅包含代码,还包含了其定义时的环境。这使得闭包可以记住并访问其定义时的局部变量,即使这些变量在其定义的作用域之外。

示例:

def make_adder(n):def adder(x):return x + nreturn adderadd_five = make_adder(5)
print(add_five(10))  # 输出: 15# 闭包保留了外部函数的局部变量
print(add_five.__closure__[0].cell_contents)  # 输出: 5

2. 装饰器(Decorators)

装饰器是Python中非常强大的工具,用于修改或增强函数的行为,而无需改变其源代码。装饰器本质上是一个接受函数作为参数的函数,并返回一个新的函数。

示例:

def my_decorator(func):def wrapper(*args, **kwargs):print("Something is happening before the function is called.")result = func(*args, **kwargs)print("Something is happening after the function is called.")return resultreturn wrapper@my_decorator
def say_hello(name):print(f"Hello, {name}!")say_hello("Alice")

输出:

Something is happening before the function is called.
Hello, Alice!
Something is happening after the function is called.
2.1 参数化装饰器

你可以通过使用另一个函数来创建参数化的装饰器,从而为装饰器添加参数。

示例:

def repeat(num_times):def decorator_repeat(func):def wrapper(*args, **kwargs):for _ in range(num_times):result = func(*args, **kwargs)return resultreturn wrapperreturn decorator_repeat@repeat(num_times=3)
def greet(name):print(f"Hello, {name}!")greet("Alice")

输出:

Hello, Alice!
Hello, Alice!
Hello, Alice!

3. 生成器(Generators)

生成器是一种特殊的迭代器,它可以逐个生成值,而不是一次性生成所有值。生成器函数使用yield关键字来返回值,并且可以在每次调用next()时恢复执行。

示例:

def countdown(n):while n > 0:yield nn -= 1count = countdown(5)
for number in count:print(number)# 或者使用 next()
count = countdown(5)
print(next(count))  # 输出: 5
print(next(count))  # 输出: 4
print(next(count))  # 输出: 3

4. 协程(Coroutines)

协程是Python 3.5+引入的一种更通用的生成器形式,允许函数暂停和恢复执行,并且可以在暂停时接收额外的数据。协程使用asyncawait关键字来定义和控制。

示例:

async def coroutine_example():print("Starting coroutine...")await asyncio.sleep(1)  # 模拟异步操作print("Coroutine finished.")# 运行协程
import asyncioasyncio.run(coroutine_example())

5. 内置函数与高阶函数

Python提供了许多内置函数和高阶函数,如map()filter()reduce()等,它们可以简化对可迭代对象的操作。

示例:

# map() - 对每个元素应用函数
numbers = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # 输出: [1, 4, 9, 16]# filter() - 过滤满足条件的元素
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 输出: [2, 4]# reduce() - 累积计算(需要从 functools 导入)
from functools import reduce
product = reduce(lambda x, y: x * y, numbers)
print(product)  # 输出: 24

6. 函数式编程

Python支持函数式编程范式,允许你编写更加简洁和声明式的代码。常见的函数式编程概念包括:

  • 纯函数:没有副作用,相同的输入总是产生相同的输出。
  • 不可变数据:避免修改现有数据,而是创建新的数据结构。
  • 高阶函数:接受函数作为参数或返回函数。

示例:

# 使用纯函数和不可变数据
def add(a, b):return a + b# 使用高阶函数
from functools import partialadd_one = partial(add, 1)
print(add_one(5))  # 输出: 6

7. 函数的性能优化

7.1 使用functools.lru_cache

lru_cache是一个装饰器,用于缓存函数的返回值,从而避免重复计算。这对于递归函数或频繁调用的函数特别有用。

示例:

from functools import lru_cache@lru_cache(maxsize=None)
def fibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)print(fibonacci(10))  # 输出: 55
7.2 使用@staticmethod@classmethod

类方法和静态方法可以用于组织代码,使函数与类关联,但又不需要实例化对象。

示例:

class MathOperations:@staticmethoddef add(a, b):return a + b@classmethoddef multiply(cls, a, b):return a * bprint(MathOperations.add(2, 3))  # 输出: 5
print(MathOperations.multiply(2, 3))  # 输出: 6

8. 元编程(Metaprogramming)

元编程是指编写能够操作或生成其他程序的代码。Python中的元编程可以通过装饰器、类装饰器、type()函数和元类来实现。

示例:

# 类装饰器
def register(cls):print(f"Registering class: {cls.__name__}")return cls@register
class MyClass:pass# 元类
class Meta(type):def __new__(cls, name, bases, dct):print(f"Creating class: {name}")return super().__new__(cls, name, bases, dct)class MyMetaClass(metaclass=Meta):pass

9. 函数的文档字符串(Docstrings)

Python鼓励使用文档字符串来描述函数的功能、参数和返回值。文档字符串应该放在函数体的第一行,并且可以使用多行字符串(三引号)来编写。

示例:

def calculate_area(radius):"""计算圆的面积。参数:radius (float): 圆的半径。返回:float: 圆的面积。"""import mathreturn math.pi * radius ** 2help(calculate_area)  # 查看文档字符串

10. 函数的类型注解(Type Annotations)

Python 3.5+引入了类型注解,允许你在函数定义中指定参数和返回值的类型。虽然类型注解不会影响代码的运行,但它们可以帮助开发人员更好地理解代码,并且可以与静态分析工具(如mypy)一起使用来捕获潜在的错误。

示例:

def greet(name: str) -> str:return f"Hello, {name}!"# 使用 typing 模块进行更复杂的类型注解
from typing import List, Dict, Tupledef process_data(data: List[int]) -> Tuple[int, int]:return min(data), max(data)def get_user_info(user_id: int) -> Dict[str, str]:return {"id": str(user_id), "name": "Alice"}

总结

通过掌握这些高级特性和最佳实践,您可以编写出更加高效、可维护和优雅的Python代码。函数不仅仅是简单的代码块,它们还可以与其他语言特性结合,创造出功能强大且灵活的应用程序。如果您有任何具体的问题或需要进一步的解释,请随时告诉我!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】 零基础介绍卷积神经网络(CNN)

零基础介绍 卷积神经网络&#xff08;CNN&#xff0c;Convolutional Neural Network&#xff09;是深度学习中的一种神经网络&#xff0c;特别擅长处理图像和视频等有空间结构的数据。 假设我们在做一个“照片分类”的任务&#xff0c;比如判断一张照片中是猫还是狗。下面用一…

【计算机组成原理】实验二:通用寄存器单元实验

实验二&#xff1a;通用寄存器单元实验 一、实验目的 了解通用寄存器的组成和硬件电路&#xff0c;利用通用寄存器实现数据的置数、左移、右移等功能。 二、实验内容 数据输入通用寄存器 寄存器内容无进位位左移实验 寄存器内容无进位位右移实验 三、实验步骤和结果 实…

boost之bind

简介 用于构造函数对象&#xff0c;其定义在文件bind.hpp中 bind 其底层使用通用的模板类bind_t template<class R, class F, class L> class bind_t { public:typedef bind_t this_type;bind_t(F f, L const & l): f_(f), l_(l) {}#define BOOST_BIND_RETURN re…

4G模块详解

在之前的教程中&#xff0c;无线通信技术我们学习了蓝牙和 WiFi&#xff0c;今天我们要来学习 4G。 4G 模块在距离上有个突破&#xff0c;它不像蓝牙短距离&#xff0c;也不像 WiFi 只能在局域网&#xff0c;4G 模块可使用户无论在哪&#xff0c;只要有 4G 网络信号覆盖&#…

QT数据库操作详解

在Qt中&#xff0c;操作数据库通常使用Qt SQL模块&#xff0c;该模块提供了一组类来与数据库进行交互。 数据库连接与查询执行 QSqlDatabase::addDatabase(): 添加一个数据库连接。 QSqlDatabase::open(): 打开数据库连接。 QSqlDatabase::close(): 关闭数据库连接。 QSql…

如何实现接口继承与实现继承的区别?如何处理多态性与性能的平衡?

在面向对象编程中&#xff0c;接口继承和实现继承是两个重要的概念&#xff0c;同时多态性也是面向对象编程的一大特性&#xff0c;但在追求多态性的同时&#xff0c;我们也需要考虑性能问题。本文将详细探讨接口继承与实现继承的区别&#xff0c;以及如何处理多态性与性能的平…

Visual Studio 使用 GitHub Copilot 聊天

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

TimerPickerDialog组件的用法

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了Snackbar Widget相关的内容,本章回中将介绍TimePickerDialog Widget.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里说的TimePickerDialog是一种弹出窗口,只不过窗口的内容固定显示为时间,它主…

MySQL运算符知识点

算术运算符 算术运算符主要用于数学运算&#xff0c;其可以连接运算符前后的两个数值或表达式&#xff0c;对数值或表达式进行加(&#xff09;、减&#xff08;-&#xff09;、乘&#xff08;*&#xff09;、除&#xff08;/&#xff09;和取模&#xff08;%&#xff09;运算…

【HTML】HTML动画时钟

今天分享一个比较有趣的HTML动画时钟&#xff0c;感兴趣的小伙伴可以自行上手体验一番&#xff0c;操作也非常简单&#xff0c;如下&#xff1a; 1. 实操 实践操作步骤&#xff1a; 创建一个文本文件 clock.txt将上述代码粘贴到 clock.txt 中。修改文件后缀&#xff0c;将文…

Linux高并发服务器开发 第四天(wc/whoami命令 权限修改chmod 添加/删除用户(组) 切换用户 修改文件所有者/所属组 查找/过滤)

目录 1.wc和whoami命令 1.1wc命令 1.2whoami命令 2.用户权限/用户/用户组 2.1修改文件权限chmod 2.1.1文字设定法 2.1.2数字设定法 2.2添加删除新用户和新用户组 2.3切换用户 2.4修改文件所有者和所属组 2.4.1修改所有者 2.4.2修改所属组 3.查找和过滤 3.1find—…

微服务架构导学

一. 什么是微服务 微服务是一个软件架构风格&#xff0c;将一个大型的项目拆分成多个小项目&#xff0c;每个项目都被称为一个微服务&#xff0c;通过多个微服务共同组成一个大的项目。 二. 单体架构和微服务架构 单体架构 将整个项目的功能、模块全部堆积在一个项目中 优点&am…

【kubernetes】kubectl get nodes报NotReady

目录 1. 说明2. 问题描述3. kube-flannel.yml 1. 说明 1.这里k8s的版本是v1.17.4。2.若kube-flannel.yml中的镜像拉取不下来&#xff0c;可以下载本文章的文件资源&#xff0c;手动docker load -i ***.tar的方式。3.v1.17.4的kube-flannel.yml参考下面代码。4.通过kubectl get…

web实操7——ServletContext

概念 和服务器通信 功能 解释说明&#xff1a; mime&#xff1a;互联网中一种文件的类型&#xff0c;可以用servletContext对象来获取。 域对象&#xff1a;用来共享数据&#xff0c;里面有一些get,set,removeAttribute,只要搞清楚ServletContext对象的域的范围是什么 如何…

C语言之输入输出

标准库 IO 输入输出功能并非C语言的组成部分&#xff0c;ANSI标准定义了相关的库函数 输入输出 <stdio.h> 流stream是与设备关联的数据的源或者目的地。 文本流&#xff1a;由文本行组成的序列 不同系统的特性可能不一样&#xff0c;比如行最大长度和行结束符 二进制流…

LLMC:大语言模型压缩工具的开发实践

关注&#xff1a;青稞AI&#xff0c;学习最新AI技术 青稞Talk主页&#xff1a;qingkelab.github.io/talks 大模型的进步&#xff0c;正推动我们向通用人工智能迈进&#xff0c;然而庞大的计算和显存需求限制了其广泛应用。模型量化作为一种压缩技术&#xff0c;虽然可以用来加速…

微信小程序的文件结构

微信小程序的文件结构非常直观且高效&#xff0c;主要由几个关键文件夹和文件组成。以下是对微信小程序文件结构的详细解析&#xff1a; 一、关键文件夹 Pages文件夹&#xff1a; 这是小程序的“心脏”&#xff0c;包含了每个页面的文件。每个页面通常由四个文件定义&#xff…

数据安全法-政务数据安全与开放

第五章 政务数据安全与开放 第三十七条 国家大力推进电子政务建设&#xff0c;提高政务数据的科学性、准确性、时效性&#xff0c;提升运用数据服务经济社会发展的能力。 第三十八条 国家机关为履行法定职责的需要收集、使用数据&#xff0c;应当在其履行法定职责的范围内依…

总结与提升

今天学习了ai&#xff0c;对今天学习的内容进行总结。 本文参考chat gpt-4的训练文献。 模型架构基础 Transformer 架构&#xff1a;ChatGPT 采用了 Transformer 架构&#xff0c;这是一种基于自注意力机制的深度学习模型架构。它能够并行计算文本中的长期依赖关系&#xff…

舌头分割数据集labelme格式2557张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;2557 标注数量(json文件个数)&#xff1a;2557 标注类别数&#xff1a;1 标注类别名称:["tongue"] 每个类别标注的框数&#xff1…