函数的定义及调用
1、有些功能可能需要反复使用
(循环虽然可以多次使用,但是是连续的)
复制粘贴,或导致代码 重复量过大,过于冗余,浪费资源
2、编程建议将相同功能的代码存放在一起,方便维护
函数: 可以重复使用的,用来实现单一或者相关功能的代码块。
ctrl + 鼠标单击函数名 可以定位到函数的定义处
函数的定义
def 函数名():
函数具体功能的代码块
函数的调用
函数名()
函数的命名规则与变量名一致
函数名可以向变量一样进行传递
使用变量接收函数名之后,同样可以使用变量() 的方式对这个函数进行调用
def is_trl():
num = input("请输入一个手机号:")
if num[0] !="1":
print("不是1开头")
elif len(num) !=11:
print("不是11位")
elif not num.isdigit():
print("不是纯数字")
else:
print("是手机号码")
函数返回值:用来传递函数的返回结果,将函数里面的数据返回出来
如果说,函数没有返回值,返回的结果就是None
return 是函数返回值的关键字,直接要把要返回的数据写在return后面就行
return 具有结束函数的功能,后续代码不在执行
多个返回值逗号隔开,会打包成元组进行返回、
def my_sum():
print("这是一个求和的函数")
a = 10
b = 20
return a + b
res = my_sum()
print(res)
需求:求任意两个数的和----参数
作用:让函数使用更加灵活
形参:函数的定义处(作用类似于变量名)
实参:函数的调用处(作用类似于变量值)
必备参数:一一对应原则
数量一一对应 位置一一对应
def my_sum (a,b): #形参
print("a:",a)
print("b":,b)
return a + b
res = my_sun(32,198) #实参
res = my_sum(32,298,15) #参数不对等,报错
print(res)
默认值参数
定义: 直接在函数定义处以 变量名=变量值 的形式进行指定
作用: 当我们没有传参,不会报错,而是使用默认的值
传参,覆盖原来的参数值
实例: print() end默认是换行, 我们可以自己定义
end=" " 不换行 sep=" " 默认间隔符是空格,我们也可以自行更改
不定长参数
*args 没有指定名称的参数,会被args以元组形式进行接收
**kwargs 指定了名称的参数,会被kwargs以字典形式进行接收
注意: *表示的是打包,args是变量名
参数的顺序: 必备、默认值、不定长
def my_sum(a, b, c=100, *args, **kwargs): # 形参
print("a:", a)
print("b:", b)
print("c:", c)
print("args", args)
print("args", kwargs)
return a + b + c
print(my_sum(1, 2, 3, 4, 5, 6, 7, d=300, e=400))
作用域:变量不是在每个地方都可以直接使用(取决于它定义的地方)
条件和循环语句没有作用域的概念
分类
● L(local):局部作用域,即函数中定义的变量;
● E(enclosing):嵌套的父级函数的局部作用域;
● G(global):全局变量,就是模块级别定义的变量;
● B(build-in):内建作用域,系统固定模块里面的变量
优先级:优先使用离自己最近的 作用域:内建 》 全局 》 嵌套 》 局部
全局变量(只要是这个文件里面,在这一行后面的都能够使用)
def fun1():
print(a)
A = "Fish"
print(A) # 局部变量,只能在这个函数里面使用
def fun2():
print(A) # 这个函数里面没有定义A,不能使用
fun1()
#类似于 print()这些不需要定义就能够使用的,就是内建作用域
print(a)
print(A) # 函数里面的变量在外面不能进行调用
闭包 存在于嵌套函数中
1、将子函数名使用 return 进行返回
2、使用变量接收返回的子函数名
3、通过接收这个函数名的变量+() 进行函数调用
作用:
1、方便调用子函数;
2、对子函数进行一个保护(直接调用父函数的时候,子函数不会执行)