一、什么是自定义函数
在Python中,函数(function)是一段能够完成指定任务的可重用代码块,可以帮助我们更好地组织程序,并节省重复代码的开发时间。而自定义函数是指我们自己定义的函数,不同于Python内置函数。自定义函数一般具有如下特点:
1、需要进行声明和定义。
2、可以在函数内部定义变量和使用Python表达式。
3、可以接受任意多个参数,并返回任意数据类型的返回值。
通过自定义函数,我们可以将程序拆分成多个小模块,实现了程序结构的模块化。
二、自定义函数的基本语法
自定义函数的基本语法如下:
def function_name(parameters): """ function_name函数说明 """ # 函数体 return value
其中,function_name是自定义函数的名称,parameters是函数参数列表,多个参数之间用逗号隔开。函数体包括了函数的具体逻辑实现,并可以使用Python表达式来计算和处理数据。return语句用于将计算结果返回给函数调用者。
三、函数参数传递
Python函数参数传递有两种方式:
1、位置参数传递:传递参数时按照函数定义的顺序进行传递。
例如:
def add(x, y): return x + y print(add(1, 2)) # 输出3
2、关键字参数传递:传递参数时通过指定参数名的方式进行传递。
例如:
def add(x, y): return x + y print(add(y=2, x=1)) # 输出3
四、函数返回值
函数的返回值可以是任意数据类型,包括数字、字符串、列表、字典、函数等。如果函数没有显示的return语句,则返回值为None。
例如:
def get_name(): name = "小明" return name print(get_name()) # 输出"小明"
五、函数递归调用
函数递归调用是指在函数中调用该函数本身。函数递归调用一般分为两种情况:
1、基本情况:函数内部包含一个停止条件,可以直接返回结果。
2、递归情况:函数内部包含一个可以把问题分解成更小的子问题的递归操作。
例如:实现阶乘函数的递归调用方式:
def factorial(n): if n == 1: return 1 else: return n * factorial(n-1) print(factorial(5)) # 输出120
六、函数装饰器
函数装饰器是将一个函数作为参数并返回一个新函数的函数。装饰器的作用是在不修改原函数代码的情况下,添加新的功能或修改函数行为。常用于函数权限控制、函数调试、函数性能分析等场景。
例如:实现一个计算函数运行时间的装饰器:
import time def calculate_time(func): def wrapper(): start_time = time.time() func() end_time = time.time() print("函数运行时间为:{}".format(end_time-start_time)) return wrapper @calculate_time def run(): for i in range(100000000): pass run() # 输出函数运行时间为:4.123821258544922e-06
七、函数参数默认值
函数参数默认值是指在函数定义时,为参数指定一个初始值。在函数调用时,如果未给该参数传值,则会使用初始值作为参数值。
例如:
def say_hello(name="小明"): print("你好,{}".format(name)) say_hello() # 输出"你好,小明" say_hello("小红") # 输出"你好,小红"
八、函数参数收集
函数参数收集是指在函数定义时,收集不定数量的参数作为一个可迭代的序列。函数参数收集有两种方式:
1、*args: 收集不定数量的位置参数,并将其包装成元组。
例如:
def func(*args): for arg in args: print(arg) func(1, 2, "a", "b") # 输出1, 2, "a", "b"
2、**kwargs: 收集不定数量的关键字参数,并将其包装成字典。
例如:
def func(**kwargs): for key, value in kwargs.items(): print("{}: {}".format(key, value)) func(a=1, b=2, c="hello") # 输出a: 1, b: 2, c: "hello"
九、函数作用域
函数作用域是指变量的可见性范围。Python中有三种函数作用域:
1、全局作用域:变量在函数外部定义,所有函数内部都可以访问。
2、局部作用域:变量在函数内部定义,只能在函数内部访问。
3、内置作用域:Python内置函数的作用域,所有函数内部都可以访问。
当Python查找变量时,会按照以下顺序进行查找:
局部作用域 -> 全局作用域 -> 内置作用域
例如:
a = 10 # 全局变量,所有函数都可以访问 def test(): b = 20 # 局部变量,只能在函数内部访问 print(a) # 可以访问全局变量a print(b) # 可以访问局部变量b test() print(a) # 可以在函数外部访问全局变量a print(b) # 会报错,无法访问函数内部的局部变量b
十、函数重载
函数重载是指在一个函数名下实现多个函数,并根据不同的参数类型或数量调用相应的函数。但是,Python中并没有函数重载的概念,因为Python是一种动态类型语言,变量的类型只有在运行时才能确定,因此函数重载没有太大的必要性。
例如:
def add(a, b): return a + b def add(a, b, c): return a + b + c print(add(1, 2)) # 报错,没有对应的函数可以调用 print(add(1, 2, 3)) # 输出6
总结
自定义函数是Python编程中非常重要的一部分,通过自定义函数,我们可以将程序结构化、模块化。在编写自定义函数时,需要注意函数声明、参数传递、函数返回值、函数递归、函数装饰器、函数参数默认值、函数参数收集、函数作用域等知识点,掌握这些知识点可以让我们更好的编写高质量、复用性强的Python程序。