首页Python【Python基础】13....

【Python基础】13.函数基础


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Basic/lab/index.html
链接:https://pan.baidu.com/s/1x2Ynh_VibPY2u-HWTaJo8w?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Basic

—————————————————

1.函数的定义:

到目前为止,编写的Python代码示例都是代码片段,在处理重复任务时就需要重复编写这些代码片段,当代码较长时会比较麻烦。为了避免上述情况,我们就需要使用函数的方法将一些特定代码片段组织成可管理的部分。

因此,可以看出函数就是一段具有特定功能的、可重复使用的语句组。也就是说函数是一种功能抽象。

每个函数都有一个函数名来表示,通过函数名可以对函数进行功能调用。使用函数主要有两个目的:降低编程难度和代码复用。

Python语言中,使用def保留字定义函数,语法形式如下:

1def <函数名>(<参数列表>):
2    <函数体>
3    return <返回值列表>

  • 函数名可以是任意有效的Python标识符;

  • 参数列表是调用该函数时传递的值,可以有0个及以上个,使用圆括号包裹。当有多个参数时,各个参数由逗号分隔。函数定义中的参数是形式参数,简称“形参”。

  • 函数体是函数被调用时执行的代码,由若干语句组成。

  • 如需返回值时,使用return保留字加返回值列表组成,当返回多个值时会以元祖类型保存。当函数没有明确使用return,则函数调用结果为None

1def simple_func(x,y,z):
2    return x,y,z

2.函数的调用:

函数只有在被调用时才会执行,函数调用的一般形式如下所示,每次调用函数可以提供不同的参数作为输入,以实现对不同数据的处理。对函数的调用不需要了解函数内部的实现原理,只需要了解函数的输入输出方式即可。

1<函数名>(<参数列表>):

在调用函数时将实际参数(实参,argument)代替函数定义中的形式参数(形参,parameter)。

2.1 位置实参(positional argument):

函数调用时,实参默认采用按照位置顺序的方式传递给函数。

1simple_func(1,2,3)

但是当需要传递的参数较多时,这种传参方式的可读性就比较差。

2.2 关键字实参(keyword argument):

为了解决上述问题,Python提供了按照形参名称传递实参的方式,此时函数调用如下,由于指定参数名称,因此参数之间的顺序可以任意调整:

1simple_func(x=1,z=3,y=2)

调用函数时,也可以同时使用位置实参和关键字实参,此时位置实参必须放在最前面。

3.函数的参数传递:

3.1 可选参数:

在定义函数时,如果有些参数存在默认值的话,可以在定义函数时直接为这些参数指定默认值。当函数被调用时,如果没有传入对应的参数值,则会使用定义函数时指定的默认值。

由于调用函数时需要按顺序输入参数,因此可选参数必须定义在非可选参数的后面。

1>>def multiple_copy(x , times=3):
2...     return (str(x) + '-') * times
3>>> multiple_copy(123)
4'123-123-123-'
5>>> multiple_copy('字符串' , times=2)
6'字符串-字符串-'

3.2 可变数量参数:

在定义函数时,通过在参数前增加星号(*)定义可变数量参数,带星号的可变数量参数只能出现在参数列表的最后。定义可变参数的目的是为了简化调用。

星号的作用为打包参数。

  • 使用一个星号(*args)代表非键值对的可变数量的参数。

在调用函数时,将传递参数打包成元祖类型传递到函数体中。

 1>>def cumulative_sum(x , *args):
2...     print(type(args))
3...     print(args)
4...     for i in args:
5...         x = x + i
6...     return x
7>>> cumulative_sum(10)
8<class 'tuple'>
9()
1010
11>>> cumulative_sum(10 , 2 , 3)
12<class 'tuple'>
13(23)
1415
15>>> cumulative_sum(10 , 2 , 3 , 4)
16<class 'tuple'>
17(234)
1819

  • 使用两个星号(**kwargs)代表可变数量的键值对参数

在调用函数时,将传递参数打包成字典类型传递到函数体中。

 1>>def message(**kwargs):
2...     print(type(kwargs))
3...     print(kwargs)
4...     for k , v in kwargs.items():
5...         print(f'键:{k},值:{v}')
6>>> message(name='Tom',age=10)
7<class 'dict'>
8{'name''Tom''age'10}
9键:name,值:Tom
10键:age,值:10

当要同时使用*args和**kwargs时,*args必须写在**kwargs之前。

4.函数的文档字符串(docstrings):

函数的文档字符串用于解释函数功能,使其更简单易懂。

可以在函数体的第一行使用一对三个单引号或者一对三个双引号来定义文档字符串。

文档字符串的使用惯例一般包括:

  • 首行用于简单描述函数的功能;

  • 第二行空行;

  • 第三行为函数的具体描述。

1def determine_num(num):
2   '''判断输入数字的奇偶。
3
4    num参数必须为正整数。'''

5    if num % 2 ==0:
6        print(f'{num}为偶数。')
7    else:
8        print(f'{num}为奇数。')

想要打印出函数的文档字符串,可以将函数名作为参数传入help()函数,得到函数的参数列表以及格式整齐的文档字符串。

1>>> help(determine_num)
2Help on function determine_num in module __main__:
3
4determine_num(num)
5    判断输入数字的奇偶。
6
7    num参数必须为正整数。

可以使用__doc__调用函数中的文档字符串属性,得到未经格式化的原始文档字符串。

1>>> determine_num.__doc__
2'判断输入数字的奇偶。n    n    num参数必须为正整数。'

5.函数对变量的作用:

Python程序中有各种名称空间,特定的名称在其中是唯一的,与其他名称空间中的同名名称没有任何关系。

主程序定义了全局名称空间,在其中定义的变量就是全局变量。


一个程序中的变量包括两类:

  • 全局变量:指在函数之外定义的变量,在程序执行全过程有效;

  • 局部变量:指在函数内部使用的变量,仅在函数内部有效,当函数执行完退出时,变量也将被释放,不再存在。

Python中函数对变量的作用原则主要有以下几点:

  • 简单数据类型变量无论是否与全局变量重名,仅在函数内部创建和使用,函数退出后变量被释放,如有全局同名变量,其值不变。
1>>> n = 10 # n为全局变量
2>>def func(x , y):
3...     z = x + y # z为局部变量
4...     n = z # 函数内部的变量n是在函数内存中新生成的局部变量
5...     return z
6>>> func(1,2) , n
7(310)

  • 简单数据类型变量在使用global保留字声明后,将作为全局变量使用,函数退出后该变量保留且值被函数改变。
1>>> n = 10 # n为全局变量
2>>def func(x , y):
3...     global n # 显式声明变量n为全局变量
4...     z = x + y # z为局部变量
5...     n = z # 将局部变量z的值赋值给全局变量n
6...     return z
7>>> func(1,2) , n
8(33)

  • 对于组合数据类型的全局变量,如果在函数内部没有被真实创建的同名变量,则函数内部可以直接使用并修改全局变量的值。
1>>> ls = [] # ls为全局列表变量
2>>def func(x , y):
3...     z = x + y # z为局部变量
4...     ls.append(z) # 将局部变量z的值添加到全局列表变量ls中
5...     return z
6>>> func(1,2) , ls
7(3, [3])

  • 如果函数内部真实创建了组合数据类型变量,无论是否有同名全局变量,函数仅对局部变量进行操作,函数退出后局部变量被释放,全局变量值不改变。
1>>> ls = [] # ls为全局列表变量
2>>def func(x , y):
3...     ls = [] # 创建名为ls的局部列表变量
4...     z = x + y # z为局部变量
5...     ls.append(z) # # 将局部变量z的值添加到局部列表变量ls中
6...     return z
7>>> func(1,2) , ls
8(3, [])


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments