Python函数、参数变量详细介绍

Python函数概述

在Python中,函数是组织好的、可重复使用的代码块,用于实现单一或相关联功能。函数能提高应用的模块性和代码的重复利用率。除了内建函数外,Python还支持用户自定义函数。

定义函数

自定义函数使用 def 关键字开始定义。函数的基本语法如下:

def function_name(parameters):"""docstring"""# 函数体# ...return value
  • function_name 是函数的名称。
  • parameters 是传递给函数的参数。
  • docstring 是一个可选的字符串,用于描述函数的作用。
  • return 语句用于从函数返回一个值。

示例代码

下面是一个简单的函数定义和调用的例子:

# 定义一个函数
def greet():return "Hello, World!"# 调用函数并打印返回值
print(greet())  # 输出: Hello, World!

参数和返回值

函数可以接受参数,这些参数可以在函数内部使用。函数还可以返回值。

# 定义一个带参数的函数
def add(a, b):"""返回两个数的和"""return a + b# 调用函数并打印返回值
print(add(5, 3))  # 输出: 8

默认参数

函数还可以有默认参数,这意味着在调用函数时可以省略具有默认值的参数。

def say_hello(name="Guest"):print("Hello, " + name)say_hello()  # 输出: Hello, Guest
say_hello("Alice")  # 输出: Hello, Alice

关键字参数

函数还可以接受关键字参数,这意味着在调用函数时可以通过参数名指定参数。

def print_info(name, age):print("Name:", name)print("Age:", age)print_info(age=25, name="Alice")  # 输出: Name: Alice Age: 25

在Python中,*args**kwargs是两种特殊的参数,它们允许函数接收任意数量的位置参数和关键字参数。这种特性在函数定义中非常有用,因为它使得函数能够灵活地处理不同数量和类型的参数。

*args(可变位置参数)和 **kwargs(可变关键字参数)

*args

*args用于函数定义中,允许函数接收任意数量的位置参数。这些参数在函数内部作为一个元组(tuple)处理。使用*args可以使得函数调用时传入的参数数量更加灵活。

例如,下面的函数使用了*args来接收任意数量的参数,并打印它们:

def print_args(*args):for arg in args:print(arg)print_args(1, 2, 3)  # 输出 1 2 3
print_args('a', 'b')  # 输出 a b

在这个例子中,*args收集了所有未命名的位置参数,并在函数内部遍历打印它们。

**kwargs

**kwargs同样用于函数定义中,但它允许函数接收任意数量的关键字参数。这些参数在函数内部作为一个字典(dict)处理。使用**kwargs可以使得函数能够接收任意数量的命名参数,而不需要在函数定义时明确指定。

例如,下面的函数使用了**kwargs来接收任意数量的关键字参数,并打印它们:

def print_kwargs(**kwargs):for key, value in kwargs.items():print(f"{key}: {value}")print_kwargs(a=1, b=2)  # 输出 a: 1 b: 2
print_kwargs(name='Alice', age=25)  # 输出 name: Alice age: 25

在这个例子中,**kwargs收集了所有命名的关键字参数,并在函数内部遍历打印它们的键和值。

同时使用*args和**kwargs

在同一个函数定义中同时使用*args**kwargs,但*args必须位于**kwargs之前。这是因为*args用于收集位置参数,而**kwargs用于收集关键字参数。

def print_all_args_kwargs(*args, **kwargs):print("Positional arguments:")for arg in args:print(arg)print("Keyword arguments:")for key, value in kwargs.items():print(f"{key}: {value}")print_all_args_kwargs(1, 2, 3, a=4, b=5)  # 输出 1 2 3 和 a: 4 b: 5

在这个例子中,*args收集了位置参数1, 2, 3,而**kwargs收集了关键字参数a=4b=5

匿名函数

Python还提供了匿名函数,也称为lambda函数。这种函数的特点是它们没有名称。

# 定义一个匿名函数
add = lambda x, y: x + y# 使用匿名函数
print(add(5, 3))  # 输出: 8

函数注解

Python 3引入了函数注解,允许指定参数和返回值的类型。但是不一定要强制遵守。

def add(a: int, b: int) -> int:return a + bprint(add(5, 3))  # 输出: 8

在Python中,变量的命名空间和作用域是两个相关的概念,它们共同决定了在特定的代码块中如何访问和修改变量。

命名空间(Namespace)

命名空间是Python用来存储变量名和其对应值的一种映射。每个变量都存在于某个特定的命名空间中。Python中有几种不同的命名空间:

  1. 局部命名空间(Local Namespace):在函数或类内部定义的变量存在于局部命名空间中。它们只能被该函数或类内部的代码访问。

  2. 全局命名空间(Global Namespace):在模块级别定义的变量存在于全局命名空间中。它们可以被模块内的所有函数和类访问。

  3. 内置命名空间(Built-in Namespace):包含Python解释器提供的内置函数和变量,如print()len()等。

作用域(Scope)

作用域是指代码中可以访问特定变量的区域。Python的作用域遵循LEGB规则:

  1. Local(L):最内层的作用域,即函数内部或类的方法内部。

  2. Enclosing(E):包含局部作用域的作用域,通常是函数所在的模块。

  3. Global(G):全局作用域,即模块级别的命名空间。

  4. Built-in(B):最外层的作用域,包含内置的Python函数和变量。

代码示例
局部作用域
def my_function():local_var = "I am local"print(local_var)  # 输出: I am localmy_function()
# print(local_var)  # 报错: NameError, name 'local_var' is not defined

在这个例子中,local_var是局部变量,只能在my_function函数内部访问。

全局作用域
global_var = "I am global"def my_function():print(global_var)  # 输出: I am globalmy_function()# 也可以在函数内部修改全局变量
def modify_global():global global_varglobal_var = "Modified global"
print(global_var)  # 输出: I am global
modify_global()
print(global_var)  # 输出: Modified global

global_var是全局变量,可以在模块的任何地方访问和修改。使用global关键字,在函数内部使用global关键字可以声明一个变量为全局变量,这样就可以在函数内部访问和修改全局命名空间中的变量。

嵌套作用域
def outer_function():var_in_outer = "Outer"def inner_function():print(var_in_outer)  # 输出: Outerlocal_var = "I am local in inner"print(local_var)  # 输出: I am local in innerinner_function()outer_function()
# print(var_in_outer)  # 报错: NameError, name 'var_in_outer' is not defined

在这个例子中,inner_function可以访问其外部函数outer_function的局部变量var_in_outer,但var_in_outer不能在inner_function外部访问。

闭包和非局部(Nonlocal)

闭包是一个函数,它记住了创建它的环境。在嵌套函数中,如果内部函数想要访问外部函数的局部变量(但不是全局或内置变量),可以使用nonlocal关键字。

def outer_function():var_in_outer = "Outer"def inner_function(nonlocal_var):nonlocal_var += " and inner"print(nonlocal_var)inner_function(var_in_outer)print(var_in_outer)  # 输出: Outer and innerouter_function()

在这个例子中,inner_function通过nonlocal关键字修改了外部函数outer_function的局部变量var_in_outer

闭包的概念

闭包(Closure)是Python中一个重要的概念,它指的是一个函数能够记住并访问其创建时所在的作用域内的变量和状态,即使这个函数在其原始定义的作用域之外被调用。闭包常用于创建带有特定状态的函数,或者用来封装函数式编程中的数据。

闭包的作用主要体现在以下几个方面:

  1. 封装状态:闭包允许创建一个函数,这个函数不仅封装了行为(即要执行的操作),还封装了状态(即数据)。这对于创建不可变函数或者创建具有持久状态的函数非常有用。

  2. 数据隐藏:闭包可以隐藏内部状态,这些状态对于外部代码是不可见的。这有助于实现数据的封装和隐私保护。

  3. 创建装饰器:闭包是实现装饰器(Decorator)的基础。装饰器是一种设计模式,它允许在不修改原始函数代码的情况下,增加函数的新功能。

  4. 延迟计算:闭包可以用来实现延迟计算,即只有在需要时才计算某些值,这可以提高程序的效率。

代码示例

下面是一个简单的闭包示例,它展示了如何使用闭包来封装状态:

def make_counter():count = 0  # 这是闭包将访问的外部变量def counter():nonlocal count  # 声明count为非局部变量count += 1return countreturn counter  # 返回闭包函数# 创建一个计数器
my_counter = make_counter()# 使用计数器
print(my_counter())  # 输出: 1
print(my_counter())  # 输出: 2
print(my_counter())  # 输出: 3

在这个例子中,make_counter函数内部定义了一个变量count,并且定义了一个counter函数。counter函数是一个闭包,因为它引用了外部函数make_counter中的变量count。每次调用my_counter()时,它都会增加count的值并返回新的计数。

装饰器示例

闭包也常用于创建装饰器,下面是使用闭包实现装饰器的一个例子:

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():print("Hello!")# 调用被装饰的函数
say_hello()

在这个例子中,my_decorator是一个装饰器工厂函数,它返回一个wrapper闭包函数。wrapper函数封装了对func的调用,并在其前后添加了额外的行为。当我们使用@my_decorator装饰say_hello函数时,实际上是在调用wrapper函数。这样,我们就可以在不修改say_hello函数的情况下,为其添加新的功能。

闭包是Python中一个强大的特性,它使得函数式编程在Python中成为可能,并且提供了一种灵活的方式来处理数据和状态。

魔法函数

在Python中,魔法函数(Magic Methods),也称为双下方法(Dunder Methods),是一些特殊的方法,它们以双下划线(__)开头和结尾。这些方法通常是Python内置的,用于实现特定的操作,比如对象的创建、访问、修改和销毁等。魔法方法通常是不能被直接调用的,而是在特定的操作中被Python解释器自动调用。

以下是一些常见的魔法方法及其用途:基本上魔法函数其形参必须要加上self

  1. __new__(cls, [...]):创建对象时调用,通常用于控制对象的创建过程。

  2. __init__(self, [...]):在创建对象后调用,用于初始化对象。

  3. __del__(self):在对象被销毁之前调用,用于执行清理工作。

  4. __repr__(self):返回一个官方的字符串表示,通常用于调试。

  5. __str__(self):返回一个非正式的字符串表示,通常用于用户输出。

  6. __eq__(self, other):定义等于操作符的行为。

  7. __ne__(self, other):定义不等于操作符的行为。

  8. __lt__(self, other):定义小于操作符的行为。

  9. __le__(self, other):定义小于等于操作符的行为。

  10. __gt__(self, other):定义大于操作符的行为。

  11. __ge__(self, other):定义大于等于操作符的行为。

  12. __add__(self, other):定义加法操作符的行为。

  13. __sub__(self, other):定义减法操作符的行为。

  14. __mul__(self, other):定义乘法操作符的行为。

  15. __truediv__(self, other):定义真除法操作符的行为。

  16. __floordiv__(self, other):定义地板除法操作符的行为。

  17. __mod__(self, other):定义取模操作符的行为。

  18. __radd__(self, other):定义反射加法操作符的行为。

  19. __rsub__(self, other):定义反射减法操作符的行为。

  20. __rmul__(self, other):定义反射乘法操作符的行为。

  21. __repr__(self):定义反引号操作符的行为。

  22. __call__(self, [...]):允许一个对象像函数一样被调用。

  23. __len__(self):定义len()函数的行为。

  24. __getitem__(self, key):定义索引操作符[]的行为。

  25. __setitem__(self, key, value):定义索引赋值操作符[]的行为。

  26. __delitem__(self, key):定义删除操作符del的行为。

  27. __iter__(self):定义迭代器的获取。

  28. __next__(self):定义迭代器的下一个元素的获取。

  29. __contains__(self, item):定义in操作符的行为。

  30. __call__(self, [...]):定义对象作为函数调用时的行为。

这些魔法方法使得Python对象的行为可以与内置类型的行为相匹配,甚至可以扩展到自定义类型。通过定义这些方法,可以扩展和定制对象的行为,使其更加符合的需求。

示例代码

下面是一个使用魔法方法的例子,我们定义一个简单的类,实现基本的创建、字符串表示和比较功能:

class MyClass:def __init__(self, value):self.value = valuedef __repr__(self):return f"MyClass({self.value})"def __str__(self):return f"Instance of MyClass with value {self.value}"def __eq__(self, other):if isinstance(other, MyClass):return self.value == other.valuereturn NotImplementeddef __lt__(self, other):if isinstance(other, MyClass):return self.value < other.valuereturn NotImplemented# 创建两个MyClass实例
a = MyClass(10)
b = MyClass(20)# 使用魔法方法
print(a)  # 输出: Instance of MyClass with value 10
print(b)  # 输出: Instance of MyClass with value 20
print(a < b)  # 输出: True
print(a == b)  # 输出: False

在这个例子中,我们定义了MyClass类,并为其实现了__init____repr____str____eq____lt__等魔法方法。这些方法使得MyClass的实例可以被自然地使用,就像Python的内置类型一样。

在Python中,变量、函数和方法的注解是一种向代码添加元数据的方式,它提供了对变量、函数参数和返回值的类型信息以及其他额外信息的说明。注解本身不会影响代码的执行,但可以为代码的阅读和维护提供更多的信息。

变量、函数、方法注解

变量注解

变量注解可以在变量声明时使用,用于说明变量的类型或其他相关信息。变量注解通常使用冒号 : 后面跟着类型信息的形式。

x: int = 10  # 声明一个整数类型的变量 x
函数注解

函数注解可以在函数的参数列表和返回值上使用,用于说明参数的类型和返回值的类型,以及其他相关信息。函数注解需要在函数定义的冒号 : 后面使用箭头 -> 指定返回值类型。

def add(x: int, y: int) -> int:"""返回两个整数的和"""return x + y
方法注解

方法注解与函数注解类似,可以在类中的方法定义时使用,用于说明方法的参数类型和返回值类型。

class MyClass:def __init__(self, value: int):self.value = valuedef double_value(self) -> int:"""将对象的值加倍并返回"""return self.value * 2
示例代码

下面是一个包含变量、函数和方法注解的完整示例代码:

x: int = 10  # 变量注解def add(x: int, y: int) -> int:  # 函数注解"""返回两个整数的和"""return x + yclass MyClass:def __init__(self, value: int):self.value = valuedef double_value(self) -> int:  # 方法注解"""将对象的值加倍并返回"""return self.value * 2# 调用函数和方法
result = add(5, 3)
print("Result of addition:", result)obj = MyClass(5)
double_result = obj.double_value()
print("Double value:", double_result)

在上述示例中,我们使用了变量、函数和方法的注解来说明它们的类型信息,包括参数的类型和返回值的类型。这样可以使代码更加清晰易懂,提高代码的可读性和可维护性。注意,注解本身不会影响代码的执行,它们仅仅是提供了额外的信息。

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

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

相关文章

sdwan本地组网分析

随着数字化转型的深入发展&#xff0c;企业对网络架构的要求也不断提高。SDWAN&#xff08;软件定义广域网&#xff09;作为一种创新的网络技术&#xff0c;正在逐渐受到企业的关注和采用。SDWAN本地组网技术可以帮助企业快速搭建高效稳定的企业网络架构&#xff0c;提升企业的…

Android kotlin全局悬浮窗全屏功能和锁屏页面全屏悬浮窗功能一

1.前言 在进行app应用开发中,在实现某些功能中要求实现悬浮窗功能,分为应用内悬浮窗 ,全局悬浮窗和 锁屏页面悬浮窗功能 等,接下来就来实现这些悬浮窗全屏功能,首选看下第一部分功能实现 2.kotlin全局悬浮窗全屏功能和锁屏页面全屏悬浮窗功能一分析 悬浮窗是属于Androi…

API接口开发lazada获得lazada商品详情API采集商品详情页实时数据、实时销量、库存等参数接入演示

要获取Lazada商品详情页的实时数据、实时销量和库存等参数&#xff0c;你需要使用Lazada的API接口。以下是一个简单的Python示例&#xff0c;展示了如何使用requests库调用Lazada API并解析返回的数据&#xff1a; # coding:utf-8 """ Compatible for python2.…

Linux:基础IO

回顾C文件接口 stdin & stdout & stderr C 默认会打开三个输入输出流&#xff0c;分别是 stdin, stdout, stderr 仔细观察发现&#xff0c;这三个流的类型都是 FILE*, fopen 返回值类型&#xff0c;文件指针 系统文件I/O 接口介绍 open man open #include <sy…

TSINGSEE青犀推出县域治理视频基座数字化、智慧化解决方案

一、方案背景 县域治理方案是我国地方治理体系的重要组成部分&#xff0c;对于促进县域经济社会发展、维护社会稳定、推进全面深化改革具有重要意义。随着科技的不断进步&#xff0c;视频监管已经成为了现代社会治理的重要手段之一。县域治理视频监管方案是通过视频监控、数据…

鸿蒙OS开发实例:【装饰器-@BuilderParam】

背景 这是一个基础概念&#xff0c;其实没有什么原因&#xff0c;练习过程中&#xff0c;自然可以感受到其用法&#xff0c;后期加上真实项目的演练&#xff0c;会形成习惯 功能核心理念 “在自定义组件中添加一个点击跳转操作。若直接在组件内嵌入事件方法&#xff0c;将会…

电商系列之优惠券

> 插&#xff1a;AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

python解决序列重叠问题

tblastn比对出来候选HSP区段&#xff0c;我们需要根据一定的基因长度范围来进行区域延伸去重叠&#xff0c;然后进行下一步操作。对HSP区域的延伸要考虑基因的长度以及目标基因组scafflod or chromosome长度&#xff0c;不是一件容易的事情。 这里采用了dataclass以及改写slot…

安全上网,防止上网被记录(v2ray实现加密通信)

近期听一位亲威说&#xff0c;她在公司休闲的时候上了哪个网站&#xff0c;浏览了过的网站IT部门的人都会知道&#xff0c;这是因为现在大多数网络设备&#xff0c;像路由与交换机都有记录访问网站地址记录功能&#xff0c;涉及还可以设置成记录到交互的内容。要想保密&#xf…

【QT学习笔记】目录 (不定时更新)

解析 Qt消息机制和事件 Qt消息机制和事件--2 qt::WA_QuitOnClose 类库及用法 QString::number用法_qstring::number表示整数 emit用法 QString用法 QFile 用法 QPair用法 | 如何定义一个函数返回两个值 QFileDialog用法&#xff08;选择文件弹出框&#xff09; QFileI…

js 分割号查找内容

如果您想要在JavaScript中使用分隔符查找字符串中的内容&#xff0c;您可以使用String.prototype.split方法来分割字符串&#xff0c;然后使用数组的相关方法来查找特定内容。 以下是一个简单的例子&#xff0c;它使用逗号作为分隔符&#xff0c;查找字符串数组中的特定内容&a…

java openCV4-专栏目录

专栏简介 &#x1f492;个人主页 &#x1f4d6;说明&#x1f4d6;本专栏为java openCV的入门专栏 openCV4.x 目录 &#x1f4e2;前言&#x1f4e2;场景&#x1f43c;附言&#x1f4d6;目录 &#x1f4e2;前言 本专栏所有示例采用openCV4.8.0版本&#xff0c;你也可以采用其它…

MySQL面试汇总(一)

MySQL 如何定位慢查询 如何优化慢查询 索引及其底层实现 索引是一个数据结构&#xff0c;可以帮助MySQL高效获取数据。 聚簇索引和非聚簇索引 覆盖索引 索引创建原则 联合索引

AcWing 92. 递归实现指数型枚举

Problem: AcWing 92. 递归实现指数型枚举 文章目录 思路解题方法复杂度Code 思路 这是一个经典的递归问题&#xff0c;我们需要实现指数型枚举。这意味着我们需要找出所有可能的组合。在这个问题中&#xff0c;我们需要找出1到n的所有可能的组合。 解题方法 我们使用一个递归函…

Linux系统-----------MySQL 数据类型

目录 MySQL 数据类型 一、数值类型 二、日期和时间类型 三、字符串类型 &#xff08;1&#xff09;CHAR类型 &#xff08;2&#xff09;VARCHAR类型 &#xff08;3&#xff09;CHAR和VARACHAR的比较及其应用场景 MySQL 数据类型 MySQL 中定义数据字段的类型对你数据库的…

代码随想录 Day-25

力扣题目 509.斐波那契数 思路 很理所当然的&#xff0c;可以使用递归的方式其次是用动态规划的方式&#xff0c;动态规划的核心就是递推公式。 那么递推和递归一字之差&#xff0c;有什么区别呢&#xff1f;&#xff08;递推和递归的区别&#xff09; 1、递归 class Solutio…

Karmada 管理有状态应用 Xline 的早期探索与实践

背景与动机 目前随着云原生技术和云市场的不断成熟&#xff0c;越来越多的 IT 厂商开始投入到跨云多集群的怀抱当中。以下是 flexera 在 2023 年中关于云原生市场对多云多集群管理的接受程度的调查报告&#xff08;http://info.flexera.com&#xff09; 从 flexera 的报告中可…

软件杯 深度学习 机器视觉 人脸识别系统 - opencv python

文章目录 0 前言1 机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别 2 深度学习-人脸识别过程人脸检测人脸识别Metric Larning 3 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 人脸识别系统 该项目…

算法训练day51Leetcode139.单词拆分 多重背包了解 背包问题总结

139.单词拆分 . - 力扣&#xff08;LeetCode&#xff09; 题目分析 初始化&#xff1a;初始化一个布尔型向量dp&#xff0c;大小为s.size() 1&#xff0c;所有值初始化为false&#xff0c;除了dp[0]被设置为true。这个布尔数组代表字符串s[0..i]能否通过拼接字典中的单词来形…

CMT(Cross Modal Transformer)实验环境搭建

项目地址&#xff1a;https://github.com/junjie18/CMT 论文地址&#xff1a;https://arxiv.org/pdf/2301.01283.pdf 环境&#xff1a;Ubuntu 20.04、cuda 11.1、python 3.8 1.创建虚拟环境CMT conda create -n CMT python3.8 -y conda activate CMT2.安装pytorch的GPU版本&am…