◎知识点
函数的概述
为什么需要函数?
函数的定义和调用
◎脚本练习
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @FileName: function_def.py @Function: python function definition @Author: Zhihe An @Site: https://chegva.com @Time: 2021/7/4 """ """一、函数的概述""" """ 1、什么是函数? 简单地说,函数就是个黑匣子,它接收输入(参数),然后执行特定任务以完成特定功能,最后生成输出(返回值), 其中,输入(参数)和输出(返回值)都是可选的,也就是说,可以有也可以没有。 函数就是执行特定任务以完成特定功能的一段代码。可以在程序中将某段代码定义成函数,并指定一个 函数名及接收的输入(参数),这样,就可以在程序的其它地方通过函数名多次调用并执行该段代码了 每次调用并执行后,都会根据接收的输入(参数)执行特定任务以完成特定功能从而生成相应的输出(返回值) python语言已经定义了很多内置函数。我们可以在程序中通过函数名直接调用这些内置函数。 例如:当我们调用内置函数id()时,输入(参数)是任意的对象,完成的特定功能是获取输入(参数)的唯一标识, 输出(返回值)是输入(参数)的唯一标识 """ # 第1次调用内置函数id(),输入(参数)是一个整数类型的对象 print(id(18)) # 第2次调用内置函数id(),输入(参数)是一个字符串类型的对象 print(id('Hello')) # 第3次调用内置函数id(),输入(参数)是一个列表类型的对象 print(id([1, 2, 3])) """二、为什么需要函数?""" """ 1、复用代码 如果在程序中需要多次完成某个特定的功能,我们无需把这个特定功能的相关代码在多个地方编写多次, 完全可以把这个特定功能的相关代码定义成函数,然后在多个地方调用该函数,每次调用都会把函数对应的 相关代码执行一遍 2、隐藏实现细节 函数就是个黑匣子,将实现细节隐藏起来了。很多时候我们无需关注函数的实现细节,只需关注其接收 的输入(参数)及生成的输出(返回值)就可以了 3、提高可维护性 把完成某段特定功能的代码定义为函数后,如果需要对这段代码进行修改,只需要在一个地方进行修改, 提高了程序的可维护性。否则,你需要找到这段代码的多个不同地方,每个地方都要进行同样的修改, 费时费力还容易出错 4、提高可读性、便于调试 每个函数都对应一段完成特定功能代码,提高了程序的可读性,也便于程序调试 """ """三、函数的定义和调用""" """ 1、定义函数 定义函数的语法格式: def 函数名([形式参数1, 形式参数2, ..., 形式参数n]): 函数体 其中,def是python定义的关键字 关于函数名的说明: (1) 每个函数都有一个函数名,用于函数的调用 (2) 函数名属于标识符,因此,必须遵守标识符的命名规划,推荐遵守标识符的命名规范。此外,函数名 最好是动宾格式,以表明函数完成的特定功能,例如:handle_message、print_result 关于形式参数的说明: (1) 形式参数简称形参 (2) 形参用于调用参数时接收输入,也就是接收传递的实际参数(简称实参) (3) 形参用中括号起来,表示形参是可选的,也就是说,可以定义也可以不定义 (4) 形参的本质是变量,其作用域(起作用的范围)仅限于函数体 关于函数体的说明: (1) 函数体是用于执行特定任务以完成特定功能的主体代码 (2) 函数体对应的代码块必须缩进 (3) 如果函数需要有输出(返回值),可以在函数体内通过语句return xxx进行返回,同时结束函数体的 执行。如果函数不需要有输出(返回值),可以在函数体内通过语句return直接结束函数体的执行,或者让 函数体正常执行结束,其实,函数在这两种情况下都是有返回值的,其返回值都是None (4) 函数体在调用函数时才会被执行,因此,定义函数不会改变程序的执行流程 """ def decide_args(arg1, arg2): if arg1 and arg2: return arg1, arg2 elif (not arg1) and (not arg2): return else: result = arg1 or arg2 """ 定义函数后,就创建了一个函数对象,它的类型是function """ print(decide_args) # <function decide_args at 0x10b1381f0> print(type(decide_args)) # <class 'function'> """ 2、调用函数 调用函数时,每个实参都被用于初始化相应的形参。所有形参都被初始化之后,函数体对应的代码块 被执行。程序的执行流会跳转到定义函数的函数体内,执行函数体对应的代码块,执行完函数体后再跳回到 调用函数的地方,继续执行下一条语句 """ print(decide_args(18, 'Hello')) # (18, 'Hello') print(decide_args([], {})) # None print(decide_args(18, [])) # None
▽ 定义函数
▽ 实参初始化形参
▽ 调用函数的执行流程