python如何定义和调用函数_python函数定义与调用基础教程

Python中定义函数使用def关键字,调用函数则执行其代码块。函数由定义(蓝图)和调用(执行)两部分组成,通过参数接收输入,可返回处理结果。形参是定义时的占位符,实参是调用时传入的具体值,支持位置传递和关键字传递。可设置默认参数提升灵活性,但需避免可变对象作为默认值导致的共享陷阱。函数可通过return语句返回单个或多个值(元组),并立即终止执行;无return时隐式返回None。良好实践包括:编写文档字符串说明功能、遵循单一职责原则拆分复杂函数、使用有意义的命名、添加类型提示增强可读性。掌握这些核心概念与规范能显著提升代码质量与可维护性。

python如何定义和调用函数_python函数定义与调用基础教程

在Python中,定义函数就像是为一段可重复使用的代码块命名,而调用函数则是执行这段代码。这不仅仅是为了代码的整洁,更是为了提升复用性和模块化,让我们的程序逻辑更清晰,也更容易维护。从我的经验来看,一旦你掌握了函数的使用,就等于拿到了构建复杂程序的基石,它让代码从一堆指令变成有组织、有意义的模块。

解决方案理解Python中的函数,可以从两个核心动作开始:定义它,然后调用它。

定义函数

在Python里,我们使用

def

关键字来定义一个函数。这就像是告诉Python解释器:“嘿,我要在这里创建一个名为XXX的代码块,它能完成特定的任务。”

一个基本的函数定义结构是这样的:

立即学习“Python免费学习笔记(深入)”;

def 函数名(参数1, 参数2, ...):    """    这里是函数的文档字符串(docstring),    用来解释函数的功能、参数和返回值。    这是一个非常好的习惯,能让你的代码更易懂。    """    # 函数体:这里是函数要执行的代码块    # 注意,函数体必须缩进    结果 = 参数1 + 参数2    return 结果 # 使用return语句返回一个值,也可以不返回

我们来拆解一下:

def

: 这是定义函数的关键词,不可或缺。

函数名

: 你给函数起的名字,应该能清晰地表达函数的功能。比如,一个计算和的函数,可以叫

calculate_sum

()

: 括号里可以包含零个或多个参数(parameters)。参数是函数在执行时需要接收的输入。如果没有参数,括号也必须保留。

:

: 冒号标志着函数定义的结束,以及函数体(即要执行的代码)的开始。

"""docstring"""

: 这是可选的,但强烈推荐。它用于描述函数的功能,其他开发者(包括未来的你)可以快速理解函数的作用。函数体: 缩进的代码块,包含了函数执行的所有指令。Python通过缩进来识别代码块,这是它的一大特色。

return

: 这是可选的。如果函数需要将某个结果传递回调用它的地方,就使用

return

语句。一个函数可以返回任何类型的值,甚至多个值(作为元组)。如果没有

return

语句,函数会隐式返回

None

调用函数

定义好函数之后,它并不会自动执行。你需要“调用”它,才能让它动起来。调用函数非常直接,只需写出函数名,后面跟上括号,并在括号内提供必要的参数(如果函数定义时有参数的话)。

# 定义一个简单的函数def greet(name):    return f"你好,{name}!欢迎来到Python世界。"# 调用函数并打印结果message = greet("小明")print(message) # 输出:你好,小明!欢迎来到Python世界。# 调用一个没有参数的函数def show_message():    print("这是一个没有参数的函数。")show_message() # 输出:这是一个没有参数的函数。# 调用一个返回多个值的函数def get_user_info():    return "Alice", 30, "工程师"name, age, job = get_user_info()print(f"{name},{age}岁,职业是{job}。") # 输出:Alice,30岁,职业是工程师。

从我的经验看,初学者很容易混淆定义和调用的时机。记住,定义是蓝图,调用才是实际的建造过程。

理解Python函数中的参数:形参、实参与默认值

在Python函数的定义与调用中,参数机制是其灵活性和强大功能的核心。我们常常会听到“形参”和“实参”,以及“默认参数”这些概念,它们在实际编码中扮演着不同的角色。

形参(Parameters)

形参,顾名思称,是形式上的参数。它们是在函数定义时,函数名后面括号里声明的变量。这些变量是函数内部使用的占位符,它们告诉函数,在被调用时需要接收哪些类型的数据。

def add_numbers(x, y): # x和y就是形参    return x + y

这里的

x

y

就是形参。它们在函数定义时存在,但在函数被调用之前,它们并没有具体的值。

实参(Arguments)

实参,则是实际的参数。它们是在函数调用时,传递给函数的具体值。这些值会“填充”到函数定义时的形参中,供函数内部使用。

result = add_numbers(5, 3) # 5和3就是实参print(result) # 输出:8

在这里,

5

3

就是实参,它们分别被赋给了函数

add_numbers

的形参

x

y

参数传递方式:位置参数与关键字参数

位置参数 (Positional Arguments): 这是最常见的传递方式。实参的顺序必须与形参的顺序严格匹配。例如,

add_numbers(5, 3)

中,

5

对应

x

3

对应

y

关键字参数 (Keyword Arguments): 你可以通过显式指定参数名来传递实参。这种方式的好处是,你可以不按顺序传递,并且代码可读性更高。

def create_user(name, age, city):    return f"用户:{name}, 年龄:{age}, 城市:{city}"# 使用位置参数print(create_user("张三", 25, "北京"))# 使用关键字参数,顺序可以打乱print(create_user(city="上海", name="李四", age=30))

默认参数值 (Default Parameter Values)

有时候,函数的一些参数在大多数情况下都有一个常用的值。这时,我们可以为这些形参设置默认值。这样,在调用函数时,如果不想改变这个常用值,就可以省略这个参数;如果想改变,就显式传递一个新的值。

def greet_person(name, greeting="你好"): # greeting有一个默认值    return f"{greeting},{name}!"print(greet_person("王五"))          # 输出:你好,王五!print(greet_person("赵六", "早上好")) # 输出:早上好,赵六!

默认参数的一个小陷阱是,如果默认值是可变对象(如列表、字典),那么所有对该默认值的修改都会在函数调用之间共享,这可能会导致意想不到的行为。一个常见的实践是使用

None

作为默认值,然后在函数内部检查并初始化。

def append_item(item, my_list=None):    if my_list is None:        my_list = []    my_list.append(item)    return my_listlist1 = append_item(1)print(list1) # [1]list2 = append_item(2)print(list2) # [2]

通过这些参数机制,Python函数变得异常灵活,能够应对各种复杂的输入场景。对我来说,掌握这些是写出健壮、可读性强代码的关键一步。

Python函数的返回值:何时以及如何有效利用它?

函数的返回值是其与外部世界交互的重要方式之一。一个函数执行完毕后,它可能需要把处理结果、计算结果或者状态信息传递给调用它的那部分代码。这就是

return

语句的职责。

return

语句的作用

返回一个值或多个值: 函数可以使用

return

语句将一个或多个值传回给调用者。如果返回多个值,Python会把它们打包成一个元组(tuple)。

def calculate_area(length, width):    area = length * width    return area # 返回计算出的面积def get_coordinates():    x = 10    y = 20    return x, y # 返回x和y两个值,作为元组area_result = calculate_area(5, 4)print(f"面积是: {area_result}") # 输出:面积是: 20coord_x, coord_y = get_coordinates()print(f"坐标是: ({coord_x}, {coord_y})") # 输出:坐标是: (10, 20)

终止函数执行: 当

return

语句被执行时,函数会立即停止执行,并将控制权交还给调用者。

return

语句后面的任何代码都不会被执行。

def find_first_even(numbers):    for num in numbers:        if num % 2 == 0:            return num # 找到第一个偶数就立即返回    return None # 如果没有找到偶数,返回Noneprint(find_first_even([1, 3, 5, 2, 4])) # 输出:2print(find_first_even([1, 3, 5]))      # 输出:None

隐式返回

None

: 如果函数体中没有

return

语句,或者

return

语句后面没有跟任何值,那么函数会隐式地返回

None

def print_greeting(name):    print(f"你好,{name}!")result = print_greeting("小李")print(f"函数返回的值是: {result}") # 输出:函数返回的值是: None

在我看来,理解

None

的隐式返回非常重要,它避免了当你忘记

return

时程序报错,但同时也是一个容易被忽视的细节。

何时有效利用返回值

计算结果: 当函数的主要目的是执行某种计算并产生一个结果时,

return

是必须的。比如数学运算、数据转换等。状态查询: 函数可以返回一个布尔值来表示某种条件是否满足,或者返回一个状态码来指示操作的结果。数据生成: 函数可以生成新的数据结构,如列表、字典、对象等,并通过

return

将它们传递出去。函数组合: 返回值使得函数可以被链式调用,或者一个函数的输出作为另一个函数的输入,这是构建复杂逻辑的基础。

避免过度依赖副作用

一个好的实践是,尽量让函数通过返回值与外部交互,而不是过度依赖“副作用”(Side Effects),比如直接修改全局变量,或者直接打印输出而不是返回结果。当然,有些函数就是为了产生副作用而存在的(例如打印日志的函数),但要明确区分。一个“纯粹”的函数,只依赖其输入参数,并只通过返回值影响外部,这样的函数更容易测试、理解和维护。我个人在设计函数时,会优先考虑它是否能通过返回值清晰地表达其产出,这通常能带来更健壮的代码。

Python函数定义与调用:常见误区与提升代码质量的实践

函数是Python编程的基石,但即便如此,在使用过程中也常会遇到一些“坑”或者可以改进的地方。从我的经验来看,以下几个方面是值得注意的。

常见误区

可变默认参数的陷阱这是Python函数中最经典的一个陷阱。当函数的默认参数是一个可变对象(如列表、字典)时,这个默认值只会在函数定义时被创建一次。这意味着,每次调用函数且不提供该参数时,都会使用同一个默认对象,对其的修改会累积。

def add_to_list(item, my_list=[]): # 这里的[]只创建一次    my_list.append(item)    return my_listlist1 = add_to_list(1)print(list1) # 输出: [1]list2 = add_to_list(2)print(list2) # 预期是 [2],实际输出: [1, 2] - 噢,这就是问题!# 正确的做法是这样:def add_to_list_fixed(item, my_list=None):    if my_list is None:        my_list = [] # 每次调用时都创建一个新的列表    my_list.append(item)    return my_listlist3 = add_to_list_fixed(1)print(list3) # 输出: [1]list4 = add_to_list_fixed(2)print(list4) # 输出: [2]

这个细节常常让新手感到困惑,甚至一些有经验的开发者也会偶尔犯错。理解其背后的原理(默认参数在函数定义时求值一次)是关键。

忽略文档字符串(Docstrings)很多开发者在编写函数时,往往跳过编写文档字符串。然而,良好的文档字符串是提高代码可读性和可维护性的最简单、最有效的方法之一。

def calculate_average(numbers):    # 缺少文档字符串,其他人(或未来的你)很难快速理解这个函数是做什么的    return sum(numbers) / len(numbers)# 更好的做法:def calculate_average_documented(numbers):    """    计算给定数字列表的平均值。    参数:        numbers (list): 包含数字的列表。    返回:        float: 列表中所有数字的平均值。如果列表为空,则返回0。    """    if not numbers:        return 0    return sum(numbers) / len(numbers)

通过

help(calculate_average_documented)

或IDE的提示,文档字符串能提供即时帮助。

函数过于庞大或职责不清一个函数承担了过多的任务,或者其功能边界模糊,这会导致函数难以理解、测试和重用。

提升代码质量的实践

遵循单一职责原则(SRP)一个函数应该只做一件事,并且把它做好。如果你的函数名中出现了“and”、“or”这样的连接词,或者你需要用很长的句子来描述它的功能,那可能就是它承担了太多职责的信号。

# 不好的例子:一个函数既处理数据又保存到文件def process_and_save_data(data):    processed_data = data.upper()    with open("output.txt", "w") as f:        f.write(processed_data)    return processed_data# 更好的做法:拆分成两个函数def process_data(data):    return data.upper()def save_data_to_file(data, filename):    with open(filename, "w") as f:        f.write(data)my_data = "hello world"processed = process_data(my_data)save_data_to_file(processed, "output.txt")

拆分函数不仅让每个函数更专注,也提高了它们的复用性。

使用有意义的函数名和参数名函数名应该清晰地表达其功能,参数名应该清晰地表达其含义。避免使用

a

,

b

,

x

,

y

等无意义的名称,除非在非常简单的数学运算中。

# 不好的例子def f(a, b):    return a * b + 10# 更好的例子def calculate_adjusted_product(factor1, factor2):    return factor1 * factor2 + 10

这听起来简单,但在实际项目中,清晰的命名能极大提升代码的可读性。

利用类型提示(Type Hints)Python是动态类型语言,但从Python 3.5开始引入了类型提示。虽然类型提示不会强制类型检查(除非你使用

mypy

这样的工具),但它们极大地提高了代码的可读性,并有助于IDE提供更好的自动补全和错误检查。

def greet_user(name: str) -> str:    """    根据提供的名字生成问候语。    """    return f"Hello, {name}!"def add(a: int, b: int) -> int:    return a + b

对我来说,类型提示就像是为我的函数写了一份迷你契约,清晰地表明了它期望什么输入和会产生什么输出,这在团队协作和大型项目中尤其宝贵。

通过避免这些常见误区并采纳这些实践,你不仅能写出能运行的代码,更能写出易于理解、维护和扩展的高质量Python代码。这不仅仅是技术细节,更是一种编程思维的体现。

以上就是python如何定义和调用函数_python函数定义与调用基础教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1371870.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 11:49:44
下一篇 2025年12月14日 11:49:56

相关推荐

  • 如何解决本地图片在使用 mask JS 库时出现的跨域错误?

    如何跨越localhost使用本地图片? 问题: 在本地使用mask js库时,引入本地图片会报跨域错误。 解决方案: 要解决此问题,需要使用本地服务器启动文件,以http或https协议访问图片,而不是使用file://协议。例如: python -m http.server 8000 然后,可以…

    2025年12月24日
    200
  • 使用 Mask 导入本地图片时,如何解决跨域问题?

    跨域疑难:如何解决 mask 引入本地图片产生的跨域问题? 在使用 mask 导入本地图片时,你可能会遇到令人沮丧的跨域错误。为什么会出现跨域问题呢?让我们深入了解一下: mask 框架假设你以 http(s) 协议加载你的 html 文件,而当使用 file:// 协议打开本地文件时,就会产生跨域…

    2025年12月24日
    200
  • 什么是功能类优先的 CSS 框架?

    理解功能类优先 tailwind css 是一款功能类优先的 css 框架,用户可以通过组合功能类轻松构建设计。为了理解功能类优先,我们首先要区分语义类和功能类这两种 css 类名命名方式。 语义类 以前比较常见的 css 命名方式是根据页面中模块的功能来命名。例如: 立即学习“前端免费学习笔记(深…

    2025年12月24日
    000
  • 正则表达式在文本验证中的常见问题有哪些?

    正则表达式助力文本输入验证 在文本输入框的验证中,经常遇到需要限定输入内容的情况。例如,输入框只能输入整数,第一位可以为负号。对于不会使用正则表达式的人来说,这可能是个难题。下面我们将提供三种正则表达式,分别满足不同的验证要求。 1. 可选负号,任意数量数字 如果输入框中允许第一位为负号,后面可输入…

    2025年12月24日
    000
  • SCSS – 增强您的 CSS 工作流程

    在本文中,我们将探索 scss (sassy css),这是一个 css 预处理器,它通过允许变量、嵌套规则、mixins、函数等来扩展 css 的功能。 scss 使 css 的编写和维护变得更加容易,尤其是对于大型项目。 1.什么是scss? scss 是 sass(syntropically …

    2025年12月24日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • 姜戈顺风

    本教程演示如何在新项目中从头开始配置 django 和 tailwindcss。 django 设置 创建一个名为 .venv 的新虚拟环境。 # windows$ python -m venv .venv$ .venvscriptsactivate.ps1(.venv) $# macos/linu…

    2025年12月24日
    000
  • css3选择器优化技巧

    CSS3 选择器优化技巧可提升网页性能:减少选择器层级,提高浏览器解析效率。避免通配符选择器,减少性能损耗。优先使用 ID 选择器,快速定位目标元素。用类选择器代替标签选择器,精确匹配。使用属性选择器,增强匹配精度。巧用伪类和伪元素,提升性能。组合多个选择器,简化代码。利用 CSS 预处理器,增强代…

    2025年12月24日
    300
  • 花 $o 学习这些编程语言或免费

    → Python → JavaScript → Java → C# → 红宝石 → 斯威夫特 → 科特林 → C++ → PHP → 出发 → R → 打字稿 []https://x.com/e_opore/status/1811567830594388315?t=_j4nncuiy2wfbm7ic…

    2025年12月24日
    000
  • css代码规范有哪些

    CSS 代码规范对于保持一致性、可读性和可维护性至关重要,常见的规范包括:命名约定:使用小写字母和短划线,命名特定且描述性。缩进和对齐:按特定规则缩进、对齐选择器、声明和值。属性和值顺序:遵循特定顺序排列属性和值。注释:解释复杂代码,并使用正确的语法。分号:每个声明后添加分号。大括号:左大括号前换行…

    2025年12月24日
    200
  • CSS的Word中的列表详解

    在word中,列表也是使用频率非常高的元素。在css中,列表和列表项都是块级元素。也就是说,一个列表会形成一个块框,其中的每个列表项也会形成一个独立的块框。所以,盒模型中块框的所有属性,都适用于列表和列表项。 除此之外,列表还有 3 个特有的属性 list-style-type、list-style…

    2025年12月24日
    000
  • 响应式HTML5按钮适配不同屏幕方法【方法】

    实现响应式HTML5按钮需五种方法:一、CSS媒体查询按max-width断点调整样式;二、用rem/vw等相对单位替代px;三、Flexbox控制容器与按钮伸缩;四、CSS变量配合requestAnimationFrame优化的JS动态适配;五、Tailwind等框架的响应式工具类。 如果您希望H…

    2025年12月23日
    000
  • html5能否禁用搜索框自动填充_html5autocomplete关闭方法【教程】

    禁用HTML5搜索框自动填充有五种方法:一、设autocomplete=”off”;二、随机化name/id值;三、用无效autocomplete值如”nope”;四、JS动态设置autocomplete;五、设autocomplete=”…

    2025年12月23日
    000
  • html5怎么导视频_html5用video标签导出或Canvas转DataURL获视频【导出】

    HTML5无法直接导出video标签内容,需借助Canvas捕获帧并结合MediaRecorder API、FFmpeg.wasm或服务端协同实现。MediaRecorder适用于WebM格式前端录制;FFmpeg.wasm支持MP4等格式及精细编码控制;服务端方案适合高负载场景。 如果您希望在网页…

    2025年12月23日
    300
  • 如何查看编写的html_查看自己编写的HTML文件效果【效果】

    要查看HTML文件的浏览器渲染效果,需确保文件以.html为扩展名保存、用浏览器直接打开、利用开发者工具调试、必要时启用本地HTTP服务器、或使用编辑器实时预览插件。 如果您编写了HTML代码,但无法直观看到其在浏览器中的实际渲染效果,则可能是由于文件未正确保存、未使用浏览器打开或文件扩展名设置错误…

    2025年12月23日
    400
  • html5怎么加php_html5用Ajax与PHP后端交互实现数据传递【交互】

    HTML5不能直接运行PHP,需通过Ajax与PHP通信:前端用fetch发送请求,PHP接收处理并返回JSON,前端解析响应更新DOM;注意跨域、编码、CSRF防护和输入过滤。 HTML5 本身是前端标记语言,不能直接运行 PHP 代码,但可以通过 Ajax(异步 JavaScript)与 PHP…

    2025年12月23日
    300
  • html5 js怎么加_html5用script标签内嵌或外链引入JS代码【添加】

    在HTML5中执行JavaScript需通过script标签:一、内联编写于head或body中;二、外链引入.js文件并建议放body末尾或加defer;三、defer按序执行,async独立执行;四、可动态创建script元素插入执行。 如果您希望在HTML5页面中执行JavaScript代码,…

    2025年12月23日
    000
  • node.js怎么运行html_node.js运行html步骤【指南】

    答案是使用Node.js内置http模块、Express框架或第三方工具serve可快速搭建服务器预览HTML文件。首先通过http模块创建服务器并读取index.html返回响应;其次用Express初始化项目并配置静态文件服务;最后利用serve工具全局安装后一键启动服务器,三种方式均在浏览器访…

    2025年12月23日
    300
  • html5能否插入带表单的文档_html5表单文档嵌入与数据提交【步骤】

    HTML5中无法直接嵌入外部带表单的HTML文档并原生提交;可行方案有四:一、用iframe嵌入,需同源或CORS支持,并用postMessage通信;二、用fetch+DOMParser动态加载表单片段并手动绑定事件;三、在当前页面直接编写表单,最规范且兼容性好;四、用JavaScript+fet…

    2025年12月23日
    000
  • html5游戏怎么修改_HT5改JS逻辑或资源文件调整游戏玩法效果【修改】

    需直接编辑核心JavaScript代码或替换图片、音频等资源文件;先用浏览器开发者工具的Sources面板定位含game、main等关键词的.js文件,再搜索score++、if (health等逻辑片段进行修改。 如果您下载了某个HTML5游戏的本地文件,希望调整其玩法逻辑或替换资源以改变视觉效果…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信