自定义函数及函数基本使用
函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,比如print()等。也可以创建用户自定义函数。说白了就是将一系列的代码封装起来,实现代码的复用。
语法
函数的代码块以 def 开头,后面接函数标识符名称和小括号 () ,也可以传入参数和自变量,传参和自变量必须放在小括号内。
函数的内容,以冒号开始,并且缩进。
如果函数有返回值,使用 return(expression) 结束函数,不带return 表达式等同于返回 none
函数的调用与注释及小知识点
函数中,通常使用三个单引号来注释说明函数的作用;
函数体内容不能为空,可以使用 pass 占位符来表示空语句;
下面我们来看一下几个简单的函数样例
#自定义函数
def func_name(a): #关键字 函数名称(参数):
'''函数体注释'''
pass #占位符
'''
def:是python的关键字,专门用来自定义函数的
func_name:是函数名,用以以后调用的
(a):a为函数的参数,为函数里面的操作提供数据使用的
pass:为占位符,函数体不可为空,不写占位符会报错
'''
def my_print():
print("哈士奇")
my_print() #调用上文的自定义函数,打印输出"哈士奇"
def my_print_name():
print(__name__)
if __name__=="__main__"
my_print_name()
'''
__name__的作用:只有在本模块启动的时候,__name__ 才会等于 __main__
__main__:主函数
那么 __name__ 在什么时候使用呢?
1、作为入口模块在别的语言当中,main也可以作为入口函数
2、也可以作为调试使用。
原因是:在其他模块调用本模块时,__name__==__main__的结果会判断为 false ,所以不执行。
在其他模块的调用的方式
from def_my_func import my_print_name
#这里的 def_my_func 是模块名,不是上文打印输出"哈士奇"的自定义函数
my_print_name()
#打印输出结果为 "def_my_func"
#这里验证了上述的 只有在本模块启动的时候,__name__ 才会等于 __main__
'''
附:name 可以理解为特殊的系统预留的一个变量
函数的参数
必须参数
#必须参数
def my_func_1(p1,p2)
print(p1)
print(p2)
my_func_1(1)
'''
这里只传入 一个参数
执行打印输出会报错:TypeError:my_func_1() missing 1 required positional argument:'p2'
缺失了参数 p2 ,所以才报错。
'''
既然讲到了参数,就不得不说一下形参与实参
形参:形式参数。是一种意义上的参数,在定义的时候并不占用内存地址
实参:实实在在的参数,占用了内存地址。
def my_func_1(p1,p2):这里的 p1,p2 就是形参
my_func_1(1): 这里的(1),就是实参
关键字参数
#关键字参数
def my_func_2(name,age)
print(name)
print(age)
my_func_2(name="zhou",age=30) #指定参数
my_func_2(age=30,name="zhou") #可以不按照顺序传参数,输出的结果是一致的
'''
输出的结果为 zhou 30
'''
默认参数
#默认参数
def my_func_3(name="zhou",age=30)
print(name)
print(age)
my_func_3("Tony") #输出结果为 Tony 30
混合使用
#混合使用
def my_func_4(name,age=30)
print(name)
print(age)
my_func_4("zhou",35)
递归
#递归
def my_func_5(x):
print(x)
my_func_5(x+1)
my_func_5(1) #自己调用自己的过程叫递归
'''
Python中存在一种机制防止栈溢出,所以上述代码输出到997就会自行结束,如果是其他语言,就会出现把自己写死的情况。
递归涉及 堆、栈、内存调度的内容较多
这里不进行过多的介绍,后续会有详细的篇幅进行讲解
'''
我们再来看一个小例子
def f(x):
if x == 1:
return 1
print("计算" + str(x) + "+" + str(x-1))
return x + f(x-1)
print(f(5)) #打印输出的结果为:15,其实整个计算过程为 5+4+3+2+1
#5 + (5-1) + ((5-1)-1) + (((5-1)-1)-1) + ((((5-1)-1)-1)-1)
'''
递归算法解决问题的特点:
1、在函数中,自己调用自己
2、必须要明确递归结束的条件,否则就成为了死循环了
3、写法简洁,缺点是递归的效率低,用不好就栈内存溢出了
'''
递归算法解决问题的特点:
1、在函数中,自己调用自己
2、必须要明确递归结束的条件,否则就成为了死循环了
3、写法简洁,缺点是递归的效率低,用不好就栈内存溢出了