一、函数
python中使用关键字def开头,后续的代码使用缩进符区分函数内容,如有返回值则使用return返回,如无返回值可直接不写
def 函数名(多个参数): #如无可不填
代码
(return 值)
#实例
def demo():
print("这是一个demo")
return 1
二、调用
函数的调用可以直接使用 函数名() 的方法调用
注意:在python中,函数的定义必须在调用的前面(代码行数在前)因为python解析器是从头向后解析的,如果在调用函数钱未定义,会被认为是无此函数
三、参数
1、必备参数
只函数参数出必须填写的参数,位置和数量要和函数定义时的内容完全一致,如不填写会直接报错
def Demo(name, age):
print(f"我是{name},今年{age}岁")
demo("张三", 18)
2、 默认参数
在定义函数时,为参数设置了一个初始值,此时可以直接调用,不用传入参数,但是使用函数时,会将参数按照顺序进行赋值,所有只有后面的参数才可以不填,前面的必须填写
def demo1(name="张三",age=18):
print(f"大家好,我是{name},今年{age}岁了")
demo1()
# 大家好,我是张三,今年18岁了
demo1(name="李四")
# 大家好,我是李四,今年19岁了
3、不定长参数
python自定义函数中有两种不定长参数,第一种是*XXX,在传入额外的参数时可以不用指明参数名,直接传入参数值即可。第二种是**XXX,这种类型返回的是字典,传入时需要指定参数名。
加了一个星号变量在函数中作为元组导入,用于存放所有未命名的参数。家了两个星号的参数会以字典的形式导入,存放已命名的变量参数。
另外,函数的输入参数必须按照确定参数、单星号变长、双星号变长的顺序输入
def demo2(num, *args, **kwargs):
print(num)
print(args)
print(kwargs)
demo2(11, 22, 33, a=18, b=19, c=20)
输出:
11
(22, 33)
{'a': 18, 'b': 19, 'c': 20}
4、变量作用域
每一个变量都有使用的范围,如果仅出现在函数内的变量,函数外就不能够使用,在函数外的变量,函数内的同名变量,也不是同一个变量;但是在函数内对函数外的变量增加一个关键字global,标明此变量为函数外的变量。
四、递归
所谓递归,即使函数自己调用自己,可以看作是一种另外意义上的while循环,必须要有打断自身无限循环的方法;
所以函数的递归有三大原则:
1、递归必须有停止条件
2、函数递归的状态改变必须是朝着停止递归的方向前进
3、函数的递归必须递归的调用自身
五、闭包
函数的闭包是只在函数内部再次定义了一个函数,外部的函数会将内部函数作为返回值return,内部函数会在修改外部函数的部分信息
def outer():
num = 10
def inner():
nonlocal num # 声明使用外部变量 num 不重新定义
num = 100
print(f'调用inner之前:{num}')
inner()
print(f'调用inner之后:{num}')
return inner
func = outer()
func()
#输出:
#调用inner之前:10
#调用inner之后:100
六、装饰器
装饰器的本质上是一个闭包函数,但是区别在于闭包函数是先完成外部函数,再去完成内部函数,装饰器则是在现有函数的基础上,在外部增加写新的功能。