# 函数
'''
函数就是完成特定功能的代码块,是对代码的封装。
函数的特点:
代码可复用
代码可维护性搞
容易排错
可读性好
利于团队开发
函数语法:
def 函数名([参数1],[参数2]、、、)
函数体
函数的命名规则:
函数名命名规则与变量名相同,要满足标识符名规则
不能和系统函数重名,否则系统函数无法使用
函数定义分为两部分,函数头和函数体
函数体就是实现功能的代码块,以: 开头,必须缩进
函数名的命名风格:一般使用下划线分隔的小写单词组成:num_random
eg:
def table(row,col):
for i in range(1, row + 1):
for j in range(1, col + 1):
if j <= i:
print("%d*%d = %2d" % (i, j, i * j), end=' ')
print('')
#⼀次编码,到处运⾏
table(8,8)
table(5,5,8)
'''
# 2.函数参数
'''
实参和形参
形参:就是函数定义时小括号里的变量
实参:函数调用的时候,小括号里的表达式
函数可以没有形参和实参
参数分类
位置参数,要求实参顺序必须和形参顺序完全一致,由形参顺序决定实参顺序
def say_hello(name,age,home): ==>name就是形参
print(你好,我的名字叫{},今年{}岁,来自{})
say_hello('张三',18,'叙利亚') ==> 张三就是实参,实参和形参个数必须相同且顺序要求相同
关键字参数,函数调用时,实参可以是键值对,键就是形参名,这样的调用,实参不必关心形参的顺序
def say_hello(name,age,home):
print(你好,我的名字叫{},今年{}岁,来自{})
say_hello(name='张三',age=18,home='叙利亚')
函数默认值,如果形参在定义的时候给定一个值,那么函数在调用时就可以不用传实参,简化调用
默认值参数必须放在参数的最右边
如果传入了实参,那么实参有限调用,不会使用默认值
默认值只计算一次
默认值必须是不可变对象
def num_calculate(x,n=2):
return (x*n)
num_calculate(5)
num_calculate(5,0.5)
def test(a=[]):
a.append('end')
print(a)
test([1,2,3]) ==>[1,2,3,end]
test() ==>['end']
test() ==>['end','end']
可变参数
传入的参数个数是可变的,可以是1个或者多个,还可以是0个。
使用*接收任意数量的参数
*的不定长参数会被当做元组处理
def demo(a,b,*args):
print(a,b,args)
demo(11,22) => 11,22,()
demo(1,2,3,4,5)
a=(1,2,3)
demo(*a) ==> 1,2,(3,) *解包
使⽤**接收任意数量的关键字参数
**的不定⻓参数被当做字典处理
def demo1(a,**args):
print(a,args)
demo1(1,name='kk',age=3)
b = {'a':20,'b':12,'c':32}
demo(**b)
参数组合
形参顺序需要按照以下顺序:位置参数、默认值参数、*args、**kwargs
'''
# 3.函数的调用
'''
函数调用必须在函数定义之后
函数调用必须能够正确传递实参
def demo(a,b,c=0,*arg1,**arg2):
print(a,b,c,arg1,arg2)
demo(1,3,k=4)
demo(1,2,3,4,5)
demo(1,b=3,c=3,d=5)
demo(*(1,2,3),**{'name':12}) ==> 任何函数都可以通过这种方式传递实参
'''
# 5.函数返回值
'''
可以通过return语句返回计算结果。语法:return 表达式
return的作用是终止函数的执行,当执行了return后,后面的语句不会执行
如果米有return语句,则默认返回None
return还可以返回给调用者数字
return可以返回一个值,如果要返回多个值,那么返回的类型是一个元组
def demo2():
return 1
def demo3():
return 1,2,3
print(demo2())
print(demo3()) #(1,2,3)
'''
# 5.函数文档字符串
'''
函数⽂档字符串是在函数开头,⽤来解释其接⼝的字符串。简⽽⾔之:帮助⽂档
包括了函数的基本信息、函数的功能介绍、每个形参的类型,使用信息等
文档字符串书写规则:
必须在函数内首行
使用三引号注释多行字符串
def test():
"""
函数名:test
功能:测试
参数:⽆
返回值:⽆
"""
print("函数输出成功") #使⽤__doc__属性查看⽂档字符串
print(test.__doc__)
'''
# 6.参数传递(**)
'''
python的参数传递是简单的值传递,这⾥的值是指变量的引⽤(地址),不
是变量的值。不存在值传递和引⽤传递的区分。简⽽⾔之,python的参数传递可
以称之为对象引⽤传递,对象可以分为:
不可变对象:int、float、None、bool、tuple、str
在函数内部不可能修改函数外部的变量
可变对象: dict、list
可以在函数内部修改
'''
# 7.空函数
'''
pass语句实现,函数体不完成任何功能,只有一个pass语句
def test():
pass
'''
# 8.函数类型
'''
函数也是⼀种类型,我们⾃定义的函数就是函数对象,函数名保存了函数对象的引⽤(地址)
def test():
print('测试函数')
print(test) ==>函数名是变量,指向了函数对象
pf = test ==>pf变量也指向了函数对象,所以也可以通过pf调⽤test函数
pf()
'''
# 9.匿名函数
'''
不再使⽤def 函数名()这种形式定义函数,⽽是使⽤lambda来创建匿名函数
lambda函数特点:
lambda只是⼀个表达式,函数体⽐def定义的函数简单的多
lambda的函数体不再是代码块,⽽是⼀个表达式
lambda只有⼀⾏,运⾏效率很⾼
语法:lambda [arg1,arg2、、、]
num_sum = lambda a,b:a + b
print(num_sum(1,2))
'''
# 10.传入函数
'''
⼀个函数就可以接收另⼀个函数作为参数,这种函数就称之为⾼阶函数,也可以称
之为传⼊函数。可以实现通⽤编程,排序等复杂功能
def add(a,b):
return a + b
def compute(a,b,func):
return func(a,b)
#调⽤
compute(3,5,add) ==> 8
'''
# 11.递归函数
'''
⼀个函数直接或间接的调⽤⾃⼰则称为递归调⽤
def fac(n):
if n ==0: #递归终⽌条件,如果n为0,则结束递归调⽤,返回
return 1
else:
tmp = fac(n-1) ==>调⽤⾃⼰,最后返回1,然后回调
return n * tmp ==>返回的是 1 * 2 * 3 * 4 * 5
print(factorial(5)) ==>120
传入过程:
tmp = func(5-1)
tmp = func(4-1)
tmp = func(3-1)
tmp = func(2-1)
tmp = func(1-1) ==>if判断结束,返回1
逆向递归返回
tmp = 1 ==>最后一次函数调用结束,返回1
return 1*2
tmp = 2
return 2*3
tmp = 6
return 6*4
tmp = 24
return 24*5 ==>fac函数结束
'''
# 12.递归适用条件
'''
如果⼀个问题规模缩减后,求解⽅式和原来⼀样,⼩规模问题解决后导致问题的最
终解决,则可适⽤递归
形式是递归的 阶乘和斐波那契数列
结构是递归的 列表遍历
解法是递归的 汉诺塔
递归的写法:
⼀个递归程序必须包含两部分:
递归终⽌条件
递归调⽤⾃⼰
def recurve(*args,**kw):
if 递归终⽌条件: #递归终⽌条件必须在递归调⽤前
pass
else:
recurve(参数)
pass
'''