文章目录
一、函数(方法)的基本概念
函数是什么: 可以重复使用的代码块,这个代码块可以用来实现某些特定的功能。
python 语言中也定义了很多函数,这些函数可以通过直接调用或者导包调用来使用。每一个函数都有自己独有的功能,比如 sum():获取全部数字的总和。。。。
1.1 python 函数的分类
-
Python中函数的分为以下几类:
-
内置函数; 无需任何操作,直接就可以使用的函数,比如说 str(),list(),len()
-
标准库函数: 通过 import 语句导入库,然后使用其中定义的函数
-
第三方库函数: Python社区也提供了很多高质量的库,下载安装这些库后,也是通过 import 语句 到导入,然后可以使用这些第三方库的函数
-
自定义函数: 根据实际需求个人自定义的函数方法
-
1.2 python 函数的定义
def: 声明函数的关键字
-
定义无返回值函数的语法: def 函数名( [参数列表] ):
无返回值函数: 执行完函数之后什么都不返回,调用者得不到任何数据
-
代码示例:
def info(name,age,address): print(f"name:{name},sex:不锈钢铁人,age:{age},address:{address}") info("姚青",999,"吉林省-吉林市-桦甸市")
- 运行结果:
-
-
函数的返回值:如果函数体中包含 return 语句,则结束函数执行并返回值
-
定义有返回值函数的语法: 在函数体中添加 return
有返回值函数: 执行完函数之后将函数方法得到的结果返回给调用者
-
代码示例:
def info(name,age,address): return f"name:{name},sex:不锈钢铁人,age:{age},address:{address}" print(info("姚青",999,"吉林省-吉林市-桦甸市"))
- 运行结果:
-
-
1.3.1 函数的参数
-
参数列表
-
- 圆括号内是形式参数列表,有多个参数则使用逗号隔开
-
- 形式参数不需要声明类型,也不需要指定函数返回值类型
-
- 无参数,也必须保留空的圆括号
-
- 实参列表必须于形参列表一 一 对应
-
1.3.1.1 参数的类型
-
位置参数:函数调用时,实参默认按位置顺序传递,需要个数和形参匹配,按位置传递的参数,称为:"位置参数"
-
def f1(a,b,c): print(a,b,c) f1(2,3,4) f1(2,3) #报错,位置参数不匹配 : TypeError: f1() missing 1 required positional argument: 'c'
-
-
默认值参数:为某些参数设置默认值,这样这些参数在传递时就是可选的,称为"默认值参数",默认值参数放到位置参数后面
-
注: 默认参数必须在普通参数后面写,否则传入会找不到对应参数的位置而报错
-
def f1(a,b,c=10,d=20): #默认值参数必须位于普通位置参数后面 print(a,b,c,d) f1(8,9) f1(8,9,19) f1(8,9,19,29)
-
-
-
命令参数:按照形参的名称传递参数,被称为"命名参数",也称"关键字参数"
-
注:如果有位置参数和关键字参数,关键字参数一定要放在位置参数的后面
-
def f1(a,b,c): print(a,b,c) print(8,9,10) #位置参数 f1(c=10,a=20,b=30) #命名参数 通过形参名称来匹配
-
-
-
可变参数/不定长参数:可变参数指的是"可变数量的参数",分以下两种情况:
*param:(一个星号),将多个参数收集到一个"元组"对象中
**param:(两个星号),将多个参数收集到一个"字典"对象中-
注1:位置参数必须写在可变参数的前面
-
注2:如果有多个关键字参数多出来的关键字参数以字典形式保存
-
注3: 可变长参数扩展
-
def f1(a,b,*c): e = a+b for agr in c: e += agr return e print(f1(8,9,19,20)) def f2(a,b,**c): print(a,b,c) f2(8,9,name='longzai',age=18) def f3(a,b,*c,**d): print(a,b,c,d) #元祖打散 print(*c) f3(8,9,20,30,name='longzai',age=18)
-
-
-
强制命名参数:在带星号的"可变参数"后面增加新的参数,必须在调用的时候是"强制命名参数"
-
def f1(*a,b,c): print(a,b,c) #f1(2,3,4) #会报错,由于a是可变参数,将2,3,4全部收集,造成b和c没有赋值 f1(2,b=3,c=4)
-
1.3 函数的作用域
-
python中的作用域分4种情况:
-
L:local,局部作用域,即函数中定义的变量;
-
E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
-
G:globa,全局变量,就是模块级别定义的变量;
-
B:built-in,系统固定模块里面的变量,比如int, bytearray等。 搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。
- 代码示例:
-
x = int(2.9) # int built-in a = 100 # 这个变量是全局变量 在整个Py文件里面都可以进行访问 globa word = "hello" def text(): x = "hello" # 这个变量是在函数内部定义的变量,它是局部变量,只能在函数内部使用 local print('x = {}'.format(x)) # 如果局部变量的名和全局变量同名,会在函数内部又定义一个新的局部变量 # 而不是修改全局变量 a = 10 print('函数内部a = {}'.format(a)) # 函数内部如果想要修改全局变量 # 使用global对变量进行声明,可以通过函数修改全局变量的值 global word word = 'ok' text() # print(x) #只能在函数内部使用 print('函数外部a = {}'.format(a)) print('函数外部word = {}'.format(word))
-
- 代码示例:
-
-
注:在Python中 只有函数能够分割作用域
1.3.1 作用域的查找范围
先是局部变量(L),其次是向外的或者lambda的局部作用域(E),之后是全局作用域(G),最后是内置作用域(B),如果变量名在这一查找过程中没有找到,Python会报错
1.3.2 内置函数
-
locals(): 查看全部局部变量
-
globals(): 查看全部全局变量
- 代码示例:
a = 100 # 这个变量是全局变量 在整个Py文件里面都可以进行访问 word = "hello" def text(): x = "hello" # 这个变量是在函数内部定义的变量,它是局部变量,只能在函数内部使用 print('x = {}'.format(x)) # 如果局部变量的名和全局变量同名,会在函数内部又定义一个新的局部变量 # 而不是修改全局变量 a = 10 print('函数内部a = {}'.format(a)) # 函数内部如果想要修改全局变量 global word word = 'ok' print("locals = {},globals= = {}".format(locals(), globals())) text() # print(x) #只能在函数内部使用 print('函数外部a = {}'.format(a)) print('函数外部word = {}'.format(word))
- 代码示例: