Function函示
想像一个特别的工厂,叫做「点心工厂」。
这个工厂可以製作各种美味的点心,比如饼乾、蛋糕、糖果等等。
每种点心都有不同的味道和形状。
在这个比喻中,我们可以把「点心工厂」想像成是一个函式,而工厂製作的各种点心就是函式可以执行的事情。
每次我们想要吃某种点心,只需要告诉「点心工厂」我们想要什么,它就会为我们製作。
创建
函式(Function)是一个程式码块,它可以接收一些输入(称为参数),进行某些操作,并返回结果。
函式可以在程式中重複使用,提高了代码的可读性、可维护性和重用性。Python中使用 def 关键字来定义函式。
以下是一个简单的函式範例:
def greet(name): """这个函式用于问候""" print(f"Hello, {name}!")greet("Alice")greet("Bob")
在这个範例中,我们定义了一个名为 greet 的函式,它接收一个参数 name,然后打印出一个问候语。我们可以通过调用这个函式并传递参数来使用它。
函式的基本结构如下:
def function_name(parameters): """Docstring - 函式的说明文档""" # 函式的主体部分,执行一些操作 return result # 返回结果(可选)
def:关键字用于定义函式。function_name:函式的名称,遵循变数命名规则。parameters:参数列表,表示函式接收的输入。参数可以有多个,用逗号分隔。Docstring:函式的说明文档,通常用三重引号包裹。描述函式的功能、参数和返回值等。主体部分:执行实际操作的代码。return:返回调用者的结果。如果省略,函式将不返回任何值(隐式返回 None)。您可以通过调用函式并传递所需的参数,来使用函式的功能。函式可以帮助您将代码模块化,使代码更容易管理和维护。
多参数
多参数是指一个函式可以接收多个参数,这些参数是在函式呼叫时一併提供给它的。这使得函式能够处理更多的资讯,从而执行更複杂的任务。多参数让我们可以将多种资讯传递给函式,让它在执行时能更全面地了解工作内容。
def add_numbers(a, b): result = a + b return resultsum_result = add_numbers(5, 3) # 传递两个参数给函式print(sum_result) # 输出:8
在这个例子中,我们定义了一个函式 add_numbers,它接收两个参数 a 和 b。当我们呼叫这个函式并传递两个数字参数给它时,它会将这两个数字相加并返回结果。
指定参数
指定参数是指在函式呼叫时,我们可以明确地指定哪些参数要传递给函式,并略过其他参数。这在处理函式有许多参数时特别有用,因为我们不必提供所有参数,只需提供需要的参数。
def greet(name, age): print(f"Hello, my name is {name} and I am {age} years old")greet(name="Alice", age=25) # 指定参数的顺序并不重要
在这个例子中,我们定义了一个函式 greet,它接收两个参数 name 和 age。在呼叫函式时,我们使用 name="Alice" 和 age=25 来指定要传递的参数,而不需要依赖参数的顺序。
回传值与多回传值
在程式设计中,函式不仅可以执行某些操作,还可以产生结果并将其回传给呼叫者。这些回传的值可以供后续的程式码使用。回传值是函式和其他程式元件之间进行资料交换的一种方法,让我们可以更有效地编写程式。
单一回传值的函式:
def add(a, b): result = a + b return resultsum = add(3, 5)print(sum) # 输出:8
在这个範例中,add 函式接收两个参数 a 和 b,计算它们的和,然后将结果回传给呼叫者。
多回传值的函式:
def calculate(a, b): total = a + b difference = a - b return total, differencesum, diff = calculate(10, 5)print(sum) # 输出:15print(diff) # 输出:5
在这个範例中,calculate 函式计算两个数字的总和和差值,并同时回传这两个值。在呼叫函式时,我们可以使用多个变数来接收这些回传的值。
需要注意的是,函式可以有一个回传值(使用 return)或多个回传值(使用逗号分隔)。
在使用函式回传值时,我们可以将这些值储存在变数中,以供后续的程式码使用。这有助于将程式分解为更小的、可重複使用的部分,并提高程式的模组化程度。
参数预设值
在 Python 函式中,我们可以为函式的参数指定预设值。这意味着如果呼叫函式时没有提供特定参数的值,该参数将使用预设值。这可以使函式更具弹性,并允许我们在呼叫函式时省略某些参数。
以下是使用参数预设值的範例:
def greet(name, message="Hello"): print(f"{message}, {name}!")greet("Alice") # 输出:Hello, Alice!greet("Bob", "Hi there") # 输出:Hi there, Bob!
在这个範例中,greet 函式接收两个参数 name 和 message。message 参数有一个预设值 "Hello"。当我们呼叫 greet 函式时,如果只提供一个参数,则 message 将使用预设值。如果提供了两个参数,则 message 将使用提供的值。
使用参数预设值可以使函式更灵活,并减少重複的程式码。当函式有多个参数,但只有部分需要被提供值时,这种方式特别有用。
需要注意的是,带有预设值的参数应该放在参数列表的末尾,以确保在呼叫函式时能正确对应参数。
例如,def greet(message="Hello", name) 是无效的,
而 def greet(name, message="Hello") 是有效的。
可变参数 *args 和 **kwargs
在 Python 中,*args 和 **kwargs 是用来处理可变数量的参数的特殊语法。它们允许你在函式定义中处理不确定数量的参数,使得函式更具有弹性。
*args:这个语法允许你将不确定数量的非关键字参数传递给函式。*args 在函式内部被视为一个包含所有非关键字参数的元组。**kwargs:这个语法允许你将不确定数量的关键字参数传递给函式。**kwargs 在函式内部被视为一个包含所有关键字参数的字典。以下是使用 *args 和 **kwargs 的範例:
def print_args(*args): for arg in args: print(arg)def print_kwargs(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}")print_args(1, 2, 3) # 输出:1 2 3print_kwargs(a=10, b=20, c=30) # 输出:a: 10 b: 20 c: 30
这种方式对于定义不确定数量的参数很有用,特别是在写通用的函式时,或者当你不确定有多少参数需要传递给函式时。
需要注意的是,*args 和 **kwargs 是约定俗成的命名方式,你可以使用其他名称,但一般来说,使用这两个名称可以让你的程式码更易读。
全域变数 vs 区域变数
在程式设计中,全域变数(Global Variables)和区域变数(Local Variables)是两种不同範围的变数,它们在不同的区域内有效。
全域变数(Global Variables):
全域变数是在整个程式中都能够被存取和使用的变数,它们的作用範围延伸到程式的任何部分。
全域变数通常在程式的最外层定义,或者在函式外部定义。
如果在函式内部想要使用全域变数,需要使用 global 关键字进行声明,这样才能修改全域变数的值。
区域变数(Local Variables):
区域变数是在特定区域(例如函式内部)中有效的变数,只能在定义它们的区域内使用。
区域变数通常在函式内部定义,它们的作用範围仅限于该函式的内部。
区域变数在函式呼叫结束后就会被清除,无法在函式外部使用。
以下是全域变数和区域变数的示例:
global_var = 10 # 全域变数def example_function(): local_var = 5 # 区域变数 print(local_var) # 输出:5 print(global_var) # 输出:10example_function()print(global_var) # 输出:10# print(local_var) # 这样的写法会产生错误,因为 local_var 是区域变数,无法在函式外部存取
在Python中,global 关键字用于在函式内声明一个变数为全域变数,这样在函式内部就可以修改该全域变数的值。以下是使用 global 关键字的範例:
global_var = 10 # 全域变数def modify_global(): global global_var # 使用 global 关键字声明变数为全域变数 global_var = 20 # 修改全域变数的值print("Before:", global_var) # 输出:Before: 10modify_global()print("After:", global_var) # 输出:After: 20
在上面的範例中,我们使用 global 关键字将 global_var 变数声明为全域变数,然后在 modify_global 函式内部修改了该变数的值。这样,在函式外部也能够看到变数值的变化。
需要注意的是,尽管可以使用 global 关键字修改全域变数的值,但过度使用全域变数可能会使程式码变得难以理解和维护。在设计程式时,应尽量避免过度使用全域变数,儘可能将变数的作用範围限制在函式内部。
总结来说,全域变数在整个程式中都有效,而区域变数仅在特定的区域内有效。因此,在使用变数时需要根据需要来选择是使用全域变数还是区域变数。
匿名函示
匿名函式,也称为lambda函式,是一种在程式中定义的简单的、无名称的函式。它在某些情况下可以代替一般的函式定义,特别适用于简单的运算或函式操作。以下是一个常见的使用範例,展示了如何使用匿名函式来对一个清单中的数字进行排序:
# 原始清单numbers = [5, 2, 8, 1, 3]# 使用匿名函式对清单中的数字进行排序sorted_numbers = sorted(numbers, key=lambda x: x)print(sorted_numbers)
在这个例子中,我们使用了内建的 sorted 函式,并通过 key 参数指定了一个匿名函式(lambda函式)。这个匿名函式会将每个数字作为参数,并直接返回该数字,这样就实现了对数字的排序。
使用匿名函式的情况是当我们只需要一个简单的函式来执行某些操作,而不想为它们额外命名或定义整个函式。
以下是一个简单的匿名函式範例,该函式将两个数字相加:
add = lambda x, y: x + yresult = add(5, 3)print(result) # 输出:8
在这个範例中,我们使用 lambda 关键字来定义一个匿名函式,然后在冒号后面编写函式的程式码。这个匿名函式接收两个参数 x 和 y,并返回它们的和。
匿名函式通常用于传递给其他函式,如 map()、filter() 或 sorted() 等,这些函式可以接收函式作为参数。匿名函式也可以在需要一个简单的小功能时使用,而不必在程式中额外定义一个完整的函式。
儘管匿名函式非常方便,但值得注意的是,它们的使用应该保持简单和清晰。它们不适用于所有场景,因为它们的功能有限,无法处理较複杂的逻辑。在需要更多逻辑的情况下,还是建议使用一般的函式定义。
系列文章
分享所学贡献社会
[Python教学]开发工具介绍
[开发工具] Google Colab 介绍
[Python教学] 资料型态
[Python教学] if判断式
[Python教学] List 清单 和 Tuple元组
[Python教学] for 和 while 迴圈
[Python教学] Dictionary 字典 和 Set 集合
[Python教学] Function函示
[Python教学] Class 类别
最后最后有一件小小的请求,请大家帮我填写一下问卷,
让我们知道你想上怎么样课程,感激不尽。
问卷这边
Facebook 粉丝页 - TechMasters 工程师养成记
程式教育 - 工程师养成记
Python程式种子班-现正开放报名中
同步分享到部落格