Python函数基础:构建代码逻辑的基石(补全篇)

在前面我已经编写过一篇,python函数基础的博文,相信有基础的同学应该看得出来,那一篇的基础内容也是不全的,于是就有了这个补全篇。补全篇,补充了变量的作用与(global与nonlocal)、递归函数、闭包、装饰器这几篇的内容。

 一. 函数目的


函数的主要目的是提高代码的组织性、可读性和重用性。

详细解释:

代码重用: 将常用的代码块封装成函数,避免重复编写相同的代码。
模块化编程: 将大型程序分解成小的、独立的函数,使程序结构更清晰。
提高可读性: 通过有意义的函数名,使代码的意图更加明确。
抽象: 隐藏复杂的实现细节,只展示必要的接口。

示例:
 
def calculate_area(length, width):return length * width# 使用函数计算多个矩形的面积
rectangle1 = calculate_area(5, 3)
rectangle2 = calculate_area(7, 4)
rectangle3 = calculate_area(2, 9)print(rectangle1, rectangle2, rectangle3)  # 输出: 15 28 18

 二. 函数定义


Python使用`def`关键字定义函数,后面跟随函数名和参数列表。

详细解释:

函数定义以 " def " 开始。
函数名应该清晰地表达函数的功能。
参数列表在括号内定义。
函数体应该缩进。

示例:
def greet_user(username, greeting="Hello"):"""This function greets the user"""print(f"{greeting}, {username}!")greet_user("Alice")  # 输出: Hello, Alice!
greet_user("Bob", "Good morning")  # 输出: Good morning, Bob!

三. 函数声明

在Python中,函数声明和定义是同一个过程。

详细解释:


Python是一种动态类型语言,不需要预先声明函数的返回类型或参数类型。函数在定义时即被声明。

示例:
# 这既是函数的声明,也是定义
def add_numbers(a, b):return a + b# 可以直接使用这个函数
result = add_numbers(5, 3)
print(result)  # 输出: 8

四. 函数调用


函数调用是执行函数代码的过程。

详细解释:


使用函数名后跟括号来调用函数。
如果函数有参数,在括号内提供参数。
函数调用可以作为表达式的一部分。

示例:

def multiply(a, b):return a * b# 直接调用
print(multiply(4, 5))  # 输出: 20# 在表达式中调用
result = multiply(3, 7) + 5
print(result)  # 输出: 26# 嵌套调用
print(multiply(multiply(2, 3), 4))  # 输出: 24

五. 函数形参

形参是在函数定义中声明的变量,用于接收传入的值。

详细解释:

形参在函数定义时指定。
形参可以有默认值。
形参的作用域仅限于函数内部。

示例:
def describe_pet(animal_type, pet_name):"""显示宠物的信息"""print(f"I have a {animal_type}.")print(f"My {animal_type}'s name is {pet_name}.")describe_pet("hamster", "Harry")
describe_pet("dog", "Willie")

六. 函数实参

实参是在调用函数时传递给函数的具体值。

详细解释:

实参在函数调用时提供。
实参的数量和顺序应与函数定义中的形参匹配。
可以使用位置参数或关键字参数传递实参。

示例:
def describe_city(city, country="China"):print(f"{city} is in {country}.")# 使用位置参数
describe_city("Beijing")  # 输出: Beijing is in China.# 使用关键字参数
describe_city(country="Japan", city="Tokyo")  # 输出: Tokyo is in Japan

七. 函数返回值


函数可以通过 " return " 语句返回值。

详细解释:

" return " 语句立即终止函数执行并返回指定值。
如果没有 " return " 语句,函数默认返回 " None "。
可以返回多个值,实际上是返回一个元组。

示例:
def get_formatted_name(first_name, last_name):full_name = f"{first_name} {last_name}"return full_name.title()musician = get_formatted_name("jimi", "hendrix")
print(musician)  # 输出: Jimi Hendrixdef get_user_info(name, age, city):return name, age, cityuser = get_user_info("Alice", 30, "New York")
print(user)  # 输出: ('Alice', 30, 'New York')

八. 函数的参数类型


Python函数支持多种参数类型,增加了函数的灵活性。

详细解释:


位置参数: 按照定义的顺序传递的参数。
关键字参数: 通过参数名指定的参数。
默认参数: 在定义时指定默认值的参数。
可变参数( ' *args ' ): 允许传入任意数量的位置参数。
关键字可变参数( ' **kwargs ' ): 允许传入任意数量的关键字参数。

示例:
 
def my_el(n, *args, into="鸡排", like="I like you", **kwargs):"""参数类型展示:param n: 位置参数 按照位置依次赋值:param args: 可变元组参数,接受除了第一个愿望所有的位置实参:param into: 关键字参数 默认参数:param like: 关键字参数 默认参数:param kwargs: 接受除了形参中出现的关键字参数以外所有以关键字形式赋值的实参:return:"""print(n)print(args)print(into)print(like)print(kwargs)my_el(8, "hello", into="火腿", like="I can't like you", ask="是的,不喜欢")
my_el(12, "有空吗?", "在干嘛", my_number="156169777")
输出:

九. 变量的作用域与(global与nonlocal)


变量的作用域决定了变量的可访问性。Python中有局部变量、全局变量和非局部变量。

局部变量: 在函数内部定义的变量,仅在函数内部可访问。
全局变量: 在函数外部定义的变量,整个程序都可以访问。
非局部变量: 在嵌套函数中,指向外层函数的变量。

详细解释:

使用 ' global ' 关键字可以在函数内部修改全局变量。
使用 ' nonlocal '关键字可以在嵌套函数中修改外层函数的变量。

示例:
x = 10  # 全局变量def modify_global():global x  # 声明使用全局变量x = 20modify_global()
print(x)  # 输出: 20def outer():y = 30  # 外层函数的局部变量def inner():nonlocal y  # 声明使用外层函数的变量y += 10return yreturn inner()result = outer()
print(result)  # 输出: 40

十. 递归函数

递归函数是直接或间接调用自身的函数。

详细解释:

递归通常用于解决可以分解为相同子问题的问题。
每个递归函数必须有一个基本情况,防止无限递归。

示例:
def factorial(n):"""计算n的阶乘"""if n == 0 or n == 1:  # 基本情况return 1else:return n * factorial(n - 1)  # 递归调用print(factorial(5))  # 输出: 120

十一. 匿名函数


Python使用 ' lambda '关键字创建匿名函数,适用于简单的一次性函数定义。

详细解释:

 ' lambda ' 函数是一种简洁的方式来创建小型匿名函数。
通常用于需要一个简单函数作为参数的场景。
 ' lambda ' 函数可以接受任意数量的参数,但只能有一个表达式。

示例:

# 使用lambda函数作为sorted()的key
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
pairs.sort(key=lambda pair: pair[1])
print(pairs)  # 输出: [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]# 在map()函数中使用lambda
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # 输出: [1, 4, 9, 16, 25]

十二. 闭包


闭包是指一个函数可以访问其外部作用域的变量,即使外部作用域已经结束。

详细解释:

闭包允许函数记住并访问其创建时的环境,即使在其外部被调用。
闭包通常用于封装数据,提供私有变量。

示例:
def make_multiplier(factor):def multiplier(x):return x * factor  # 访问外部函数的变量return multiplierdouble = make_multiplier(2)
triple = make_multiplier(3)print(double(5))  # 输出: 10
print(triple(5))  # 输出: 15

在这个示例中, ' make_multiplier ' 函数返回一个新的函数 ' multiplier ' ,并且 ' multiplier '能够访问 ' make_multiplier ' 中定义的 ' factor ' 变量。即使 ' make_multiplier ' 的执行已经结束,返回的'multiplier '函数依然可以使用 ' factor '。

十三. 装饰器

装饰器是一个函数,用于在不修改原函数代码的情况下扩展其功能。

详细解释:

装饰器接受一个函数作为参数,并返回一个新的函数。
常用于日志、权限检查、性能测试等场景。

示例:
def decorator_function(original_function):def wrapper_function():print("Wrapper executed before {}".format(original_function.__name__))return original_function()return wrapper_function@decorator_function
def display():print("Display function executed")display()
# 输出:
# Wrapper executed before display
# Display function executed


在这个示例中, ' decorator_function ' 是一个装饰器, ' wrapper_function ' 是在调用原始函数之前执行的一些额外操作。使用 ' @decorator_function ' 语法可以轻松地将装饰器应用于 ' display ' 函数。

总结


Python函数是构建可复用、模块化代码的基石。通过本文,我们深入探讨了函数的定义、调用、参数传递和返回值等核心概念。从基本的函数声明到高级的参数类型、匿名函数、闭包和装饰器,这些知识为编写清晰、高效的Python代码奠定了基础。

掌握函数不仅能提高代码的组织性和可读性,还能大幅提升编程效率。随着实践的深入,你会发现函数在处理复杂任务和设计灵活解决方案时的强大能力。

希望这个博客内容能帮助大家更好地理解Python中的函数基础!

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

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

相关文章

acwing796-子矩阵的和-前缀和

s矩阵是全局变量,维度n*m,从1~n和 1~m存储元素【0】【0】~【0】【m】和【0】【0】~【n】【0】分别存储的都是0.s矩阵刚开始是存储输入的元素,后面用于存储前缀和。 s矩阵的意思是s【i】【j】表示从【0】【0】到【i】【j】为对角线的矩阵里面所有元素的和…

多类别支持向量机(Multi-class SVM)

多类别支持向量机(Multi-class SVM)是一种扩展二分类支持向量机以处理多类别分类问题的方法。常见的方法有“一对一”(one-vs-one)和“一对多”(one-vs-rest)。 一、数学模型理论推导 1.1 一对多&#xf…

新的铸造厂通过 PROFIBUS 技术实现完全自动化

钢铁生产商某钢以其在厚钢板类别中极高的产品质量而闻名。其原材料(板坯连铸机)在钢铁厂本地生产,该厂最近新建了一座垂直连铸厂。该项目的一个主要目标是从一开始就完全自动化这座新工厂和整个铸造过程,以高成本效率实现最佳产品…

用AI对抗AI:Fortinet解锁家电制造网络安全新密码

Fortinet盛大启幕《构筑垂直行业 网络安全防线》系列研讨会。首场研讨会聚焦于家电制造领域,以《利用AI打造家电制造网络安全的新质力》为主题。 Fortinet中国南区资深安全顾问黄志攀深入洞察家电制造行业的网络安全挑战,全面解析了Fortinet如何通过全栈…

数据库系统概论:数据库系统的锁机制

引言 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,数据作为一种共享资源,其并发访问的一致性和有效性是数据库必须解决的问题。锁机制通过对数据库中的数据对象(如表、行等)进行加锁,以确保在同…

基于python的去除图像内部填充

1 代码功能 该代码实现了一个图像处理的功能,具体来说是去除图像内部填充(或更准确地说,是提取并显示图像中轮廓的外围区域,而忽略内部填充)。以下是该功能的详细步骤: 读取图像:使用cv2.imread…

AWS服务器购买:如何选择合适的AWS云服务器

在当今数字化时代,云计算已成为企业IT基础设施的重要组成部分。作为全球领先的云服务提供商之一,亚马逊网络服务(AWS)提供了丰富多样的云服务器选项。然而,面对众多选择,如何为您的业务需求挑选最合适的AWS云服务器呢?我们结合九河云的分析来给你解答。 1. 明确业务需求 首先…

JVM调优:根据JVM自带工具定位问题(jps、jstat、Visual VM的使用)

JVM调优步骤 发现问题、定位问题、解决问题 发现问题 常见问题如下 GC频繁CPU负载过高内存溢出(OOM)内存泄露死锁程序响应时间较长 用JDK自带命令调优工具定位问题 jps(java process status):查看正在运行的Java进程 基本语…

JUnit 单元测试

JUnit 测试是程序员测试,就是白盒测试,可以让程序员知道被测试的软件如何 (How)完成功能和完成什么样(What)的功能。 下载junit-4.12和hamcrest-core-1.3依赖包 相关链接 junit-4.12:Central …

html+canvas 实现签名功能-手机触摸

手机上的效果图 需要注意&#xff0c;手机触摸和鼠标不是一个事件&#xff0c;不能通用&#xff0c;上一篇是关于使用鼠标的样例 相关代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewpo…

什么是AQS(抽象队列同步器)?

AQS是AbstractQueuedSynchronizer的简称&#xff0c;即抽象队列同步器&#xff0c;从字面上可以这样理解: 抽象&#xff1a;抽象类&#xff0c;只实现一些主要逻辑&#xff0c;有些方法由子类实现&#xff1b;队列&#xff1a;使用先进先出&#xff08;FIFO&#xff09;的队列…

独立站外链如何影响搜索引擎排名?

独立站的外链对搜索引擎排名有着非常重要的影响。简单来说&#xff0c;外链就像是别的网站对你的网站投的信任票。每一条外链都告诉搜索引擎&#xff1a;“这个网站的内容是有价值的&#xff0c;值得推荐。”因此&#xff0c;外链的数量和质量直接影响你的网站在搜索引擎中的排…

ThinkPad改安装Windows7系统的操作步骤

ThinkPad&#xff1a;改安装Windows7系统的操作步骤 一、BIOS设置 1、先重新启动计算机&#xff0c;并按下笔记本键盘上“F1”键进入笔记本的BIOS设置界面。 2、进入BIOS设置界面后&#xff0c;按下键盘上“→”键将菜单移动至“Restart“项目&#xff0c;按下键盘上“↓”按键…

创新驱动的力量:探索Web3在技术发展中的作用

随着科技的不断进步和创新&#xff0c;Web3作为新一代互联网技术范式&#xff0c;正在以其去中心化、安全、透明和可编程的特性&#xff0c;深刻影响着全球技术发展的方向和速度。本文将深入探讨Web3技术的核心概念、关键特征以及其在技术创新中的重要作用&#xff0c;展示其在…

汽车及零部件研发项目管理系统:一汽东机工选择奥博思 PowerProject 提升研发项目管理效率

在汽车行业中&#xff0c;汽车零部件的研发和生产是一个关键的环节。随着汽车市场的不断扩大和消费者需求的不断增加&#xff0c;汽车零部件项目管理的重要性日益凸显。通过有效的项目管理方法及利用先进的数字项目管理系统&#xff0c;可以大幅提高项目的成功率和顺利度&#…

JVM:常用工具总结

文章目录 一、jstat工具 一、jstat工具 Jstat工具是JDK自带的一款监控工具&#xff0c;可以提供各种垃圾回收、类加载、编译信息等不同的数据。使用方法为&#xff1a;jstat -gc进程ID每次统计的时间间隔&#xff08;毫秒&#xff09;统计次数。 C代表Capacity容量&#xff0c…

秒懂设计模式--学习笔记(11)【结构型-享元模式】

目录 10、享元模式10.1 享元模式10.2 举例10.2.1 马赛克10.2.2 游戏地图&#xff08;以草原地图作为范例&#xff09; 10.3 总结 10、享元模式 10.1 享元模式 “享元”则是共享元件的意思享元模式的英文flyweight是轻量级的意思&#xff0c;这就意味着享元模式能使程序变得更…

stack(leetcode练习题)

文章目录 STL用法总结32 最长有效括号思路代码 496 下一个最大元素思路代码 856 括号的分数思路 STL用法总结 关于stack的知识&#xff0c;可以看点击查看上面的博客&#xff0c;以下题目全在leetcode 32 最长有效括号 思路 “(()” “()(()” “(()(((()” 最开始写的&…

Linux下docker快速安装gitea

之前在服务器上装的gitlab来管理个人项目&#xff0c;但是gitlab服务启动后能明显感受到占用资源比较严重。最近服务器到期&#xff0c;换了个服务器还没来得及装gitlab&#xff0c;刚好最近接触到gitea&#xff0c;网上是这么说的 占用资源少&#xff0c;适合个人开发者&…

[PM]数据分析

概览 数据的定义 运营数据 分析的目的 数据分析流程 1.明确目标 2.数据来源 3.采集数据 4.数据整理 5.数据分析 趋势分析 当数据出现异常&#xff0c;一般从3个角度去查找问题&#xff1a; 1.技术层面&#xff0c;是不统计出错&#xff0c;或者产品出现bug 工 2.产品层面&am…