python基础——函数(一)

本文最后更新于:1 年前

(一)概述

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段,能提高应用的模块性,和代码的重复利用率。

1. 基本概念:

函数用于在程序中分离不同的任务,主要目的是代码的复用,也就是同一块代码的执行特定功能的重复使用,定义和使用函数是Python程序设计的重要组成部分。

函数允许自己调用自己,此过程称为递归调用。

2. 函数功能:

  • 实现特定功能:通过函数完成特定功能的设计,可以实现各种复杂算法。

  • 结构化程序设计:通过把程序分割为不同的功能模块可以实现自顶向下的结构化设计。

  • 减少程序的复杂度:简化程序的结构,提高程序的可阅读性。

  • 实现代码复用:一次定义多次调用,实现代码的可重用性。

  • 提高代码的质量:实现分割后子任务的代码相对简单,易于开发、调试、修改和维护。

  • 协作开发:在将大型项目分割成不同的子任务后,团队多人可以分工合作,同时进行协作开发。

3. 函数分类:

  • 内置函数:Python语言的内置函数,在程序中可以直接使用,是一些常用的函数。

  • 标准库函数:Python语言中有一些标准库,是特定功能/程序的集合,通过import导入标准库后可以使用标准库的函数简化程序实现。

  • 第三方库函数:Python语言中的社区开发的其他库,由用户开发,功能繁多,可以根据需要下载、安装、导入再使用其定义的函数。

  • 用户自定义的函数,如何利用Python语言定义、使用自己的函数。

下面分别说明函数的定义、调用和函数式编程。

(二)定义

1. 格式及语法:

def functionname( parameters ):

"函数_文档字符串"

function_suite

return [expression]

  • def:定义函数的关键词,必须包含。

  • functionname:函数标识符,也就是函数名,是我们调用函数时的使用依据。

  • (parameters):形参列表,在**”()“内定义函数需要使用的参数,多个参数用”,“分割,允许使用空形参列表定义函数,但是不能省略“()”和后面的”:“**

    形参列表用于接收调用传入的各种参数,形参数量和使用/传入类型必须一一匹配,但注意形参列表中是不需要说明参数类型的,主要是使用时进行检查

  • "函数_文档字符串":函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。

    现在不建议直接使用此格式,用注释即可完成说明。

    如果要使用,可以通过调用Python的help()内置函数或者_doc_属性来查看某个函数的使用说明文档

  • function_suite:执行语句代码块,利用传入的函数和内部的代码完成函数要执行的功能,是函数的主体,允许没有此代码块。

    函数的执行会引入一个用于函数局部变量的新符号表,此局部符号表存储了所有新定义的变量和传入的参数变量,而如果是变量引用,会首先在最内层的局部符号表中查找,然后是外层函数的局部符号表,再然后是全局符号表,最后是内置名称的符号表。

    在函数被调用时,实际参数(实参)会被引入被调用函数的本地符号表中——实参是通过按值调用传递的,值是对象引用而不是对象的值)

    函数调用另一个函数,会为其创建一个新的本地符号表,新局部符号表被视为内部的符号表。

    实质:变量作用域从内向外递归查找。

    重命名机制:函数定义会把函数名也引入到符号表中,其类型为用户定义函数类型,此值因此可以分配给一个新的名称,新名称即可作为函数使用

  • return [expression]:返回值,函数执行命令的处理结果被返回,如果不需要返回值可以不写return,但是实际上还是有函数默认返回值None。

    一般情况下需要设置指定返回值,返回值可以返回多个对象,对象间用”,“进行分割,当为多个返回类型时,返回类型被视为一个元组,因此其返回值的保存需要按照元组的赋值来进行。

2. 定义的四个基本类型:

(1)无参数无返回值,通常是执行一些固定的内容。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
def my_print_defalut():
print("你干嘛,哎呦~")
def my_sleep_onetime():
print("运行中")
i=0
while i<100000000:
i=i+1
my_sleep_onetime()
my_print_defalut()
# 运行结果:
# 运行中
# 你干嘛,哎呦~
(2)无参数有返回值,用于获得一些需要的固定内容:

多个return语句也只会返回第一个执行的return结果

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def my_input_number():
print("请只输入数字")
temp = input()
if temp.isdigit():
return temp
else:
return None
result = my_input_number()
print(result)
# 运行结果:
# 请只输入数字
# abc
# None
# 请只输入数字
# 1234
# 1234
(3)有参数无返回值,可以用于参数的输出或者参数的一些操作等等。

例子:

1
2
3
4
5
6
7
8
9
10
def add_twonum(a,b):
c = a + b
print(a+b)
add_twonum(2,3)
def get_str_index3(str):
print(str[2])
get_str_index3("abcd")
# 运行结果:
# 5
# c
(4)有参数有返回值,最常用。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def get_abs(n):
if n<0:
n=-n
return n
print(get_abs(-2))
def abs_to_num(n):
if n>0:
return n,-n
else:
return None
print(abs_to_num(3))
print(abs_to_num(-3))
# 运行结果:
# 2
# (3, -3)
# None

3. 全局和局部变量:

变量声明的位置不同,其可以被访问的范围也不同。变量的可被访问范围称为变量的作用域。变量按其作用域大致可以分为全局变量、局部变量和类成员变量。

(1)全局变量:

在函数和类定义之外声明的变量称为全局变量,其作用域只在定义的模块之内,从其定义的位置开始,直到模块结束的位置。

单个模块的变量可以通过import引入访问。

不同引入模块都可以使用全局变量,多语句对其的修改可能会导致全局变量的管理混乱,降低模块之间的通用性和可读性,应当尽量避免使用去全局变量反复修改,而是作为常量使用。

(2)局部变量:

在函数中定义的变量和参数变量都是局部变量,作用域范围只在函数体内,一旦脱离作用域,不允许被使用。

全局代码不能用局部变量,不同函数之间的局部变量也不可以互相使用。

重名的局部变量会覆盖全局变量。

(3)global语句和nonlocal语句:

如果想要在函数中直接使用全局变量,需要在函数内对变量增加global声明,此时是显式说明不使用局部变量,而是使用全局变量。

同样的,对于多个函数的嵌套,可以用nonlocal完成相对应的功能。

例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
n = 10
def add_use(a):
i=5
global n
print(i+a)
print(n+a)
def add_use_2(b):
j=1
nonlocal i
print(j+b)
print(i+b)
add_use_2(a)
add_use(20)
#运行结果:
# 25
# 30
# 21
# 25

4. 进阶:匿名函数

python 使用 lambda 来创建匿名函数。(lambda是一个关键字)

匿名是指不适用def的标准形式来定义函数。

匿名函数可以省略定义函数的过程,主要目的是精简代码,减少函数命名,便于理解代码和避免只用一次的函数被定义而增大工作量。

(1)语法:

lambda函数的语法只包含一个语句:

<variable>=lambda [arg1 [,arg2,.....argn]]:expression

实际上,等价于:

<变量>=lambda 参数列表:return [表达式] 变量

variable表示对lambda的封装,也就是实际上让这个变量作为了一个函数名,很多时候可以省略,省略时就是真正的匿名函数。

arg1,2......n表示的是参数,对应参数列表,expression则是表达式,对应的是返回值的表达式变量。

(2)说明:
  • lambda返回的是函数对象(构建的是一个函数对象),所以需要定义一个变量去接收

  • lambda 只是一个表达式,函数体比 def 简单很多。

  • lambda的主体是一个表达式,而不是一个代码块,所以仅仅能在lambda表达式中封装有限的逻辑

  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数

(3)例子:
1
2
3
4
5
6
7
8
9
fun = lambda x,y:x*y
fun2 =lambda x:len(x)
print("add result:",(lambda a, b:a+b)(1,2))
print(fun(3,4))
print(fun2("我的心总是不安"))
#运行结果:
# add result: 3
# 12
# 7

python基础——函数(一)
https://github.com/xiaohei07/xiaohei07.github.io/2023/07/11/python基础——函数(一)/
作者
07xiaohei
发布于
2023年7月11日
许可协议