5.函数[函数定义、函数调用、函数参数、变量作用域]
一函数简介(function)
- 函数也是一个对象
- 对象是内存中专门用来存储数据的一块区域
- 函数可以用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次的调用
- 创建函数:
-
def 函数名([形参1,形参2,...形参n]) :
-
代码块
-
-
- 函数名必须要符号标识符的规范
- (可以包含字母、数字、下划线、但是不能以数字开头)
- 函数中保存的代码不会立即执行,需要调用函数代码才会执行
- 调用函数:
- 函数对象()
- 定义函数一般都是要实现某种功能的
- Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
Python的内置函数
- 数学相关: abs / divmod / pow / round / min / max / sum
- 序列相关: len / range / next / filter / map / sorted / slice / reversed
- 类型转换: chr / ord / str / bool / int / float / complex / bin / oct / hex
- 数据结构: dict / list / set / tuple
- 其他函数: all / any / id / input / open / print / type
Python常用模块
- 运行时服务相关模块: copy / pickle / sys / ...
- 数学相关模块: decimal / math / random / ...
- 字符串处理模块: codecs / re / ...
- 文件处理相关模块: shutil / gzip / ...
- 操作系统服务相关模块: datetime / os / time / logging / io / ...
- 进程和线程相关模块: multiprocessing / threading / queue
- 网络应用相关模块: ftplib / http / smtplib / urllib / ...
- Web编程相关模块: cgi / webbrowser
- 数据处理和编码模块: base64 / csv / html.parser / json / xml / ...
二、定义函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。函数可以同时返回多个值,return 返回的其实就是一个tuple,可以是函数、多个数值等。
语法:
Python 定义函数使用 def 关键字,一般格式如下:
def 函数名(参数列表): 函数体
三、函数的调用:
要调用一个函数,需要知道函数的名称和参数。
函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”
>>> a = abs # 变量a指向abs函数 >>> a(-1) # 所以也可以通过a调用abs函数 1
调用方法:
函数对象(参数)
四、函数的参数:
- 在定义函数时,可以在函数名后的()中定义数量不等的形参, 多个形参之间使用,隔开
- 形参(形式参数),定义形参就相当于在函数内部声明了变量,但是并不赋值
- 实参(实际参数)
- 如果函数定义时,指定了形参,那么在调用函数时也必须传递实参,
- 实参将会赋值给对应的形参,简单来说,有几个形参就得传几个实参
以下是调用函数时可使用的正式参数类型:
- 位置参数
- 关键字参数
- 默认参数
- 不定长的参数
①位置参数
- 位置参数就是将对应位置的实参复制给对应位置的形参
- 第一个实参赋值给第一个形参,第二个实参赋值给第二个形参 。。。
②关键字参数
- 关键字参数,可以不按照形参定义的顺序去传递,而直接根据参数名去传递参数
- 位置参数和关键字参数可以混合使用
- 混合使用关键字和位置参数时,必须将位置参数写到前面
③默认参数
- 默认参数必须在后面
- 当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
- 默认参数必须指向不变对象!
def fn(a = 5 , b = 10 , c = 20): #这种给定值的是默认参数 print('a =',a) print('b =',b) print('c =',c) fn(1 , 2 , 3) #这个就是位置参数 fn(b=1 , c=2 , a=3) #这个就是关键字参数
④不定长的参数
- 需要一个函数能处理比当初声明时更多的参数
- 第一种方式:加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
- 第二种方式:**形参可以接收其他的关键字参数,它会将这些参数统一保存到一个字典中
#语法:以元组的形式导入
def functionname([formal_args,] *var_args_tuple ): "函数_文档字符串" function_suite return [expression]
#以字典的形式导入,传参是键值对方式
def functionname([formal_args,] **var_args_dict ):
"函数_文档字符串"
function_suite
return [expression]
五、变量作用域
Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:
- L (Local) 局部作用域
- E (Enclosing) 闭包函数外的函数中
- G (Global) 全局作用域
- B (Built-in) 内置作用域(内置函数所在模块的范围)
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。
g_count = 0 # 全局作用域 def outer(): o_count = 1 # 闭包函数外的函数中 def inner(): i_count = 2 # 局部作用域