不定长参数
* 参数
带有“*”参数,是指根据位置进行传递参数,输出格式是元组形式,“( )”
DEMO:
def fn_1(a,b,*c):
print('a=',a)
print('b=',b)
print('c=',c)
fn_1(1,2,3,4,5)
'''
输出结果:
a= 1
b= 2
c= (3, 4, 5)
'''
** 参数
带有**参数,是指根据关键字参数进行传递参数,输出格式是字典形式,“{ }”
DEMO:
def fn_1(a,b,**c):
print('a=',a)
print('b=',b)
print('c=',c)
fn_1(a=1,b=2,c=3,d=4,e=5)
'''
输出结果:
a= 1
b= 2
c= {'c': 3, 'd': 4, 'e': 5}
'''
综上所述,带有“*”和“**”都属于函数的不定长参数传值,区别对比:
* | ** |
---|---|
输出格式为元组“( )” | 输出格式为字典“{ }” |
根据参数位置进行传递参数 | 根据关键字“=”进行传递参数 |
函数的返回值
python函数中,返回值一般使用return来指定函数的返回值
def 函数():
代码块
return 函数或者值…
def fn_2():
return 1
r=fn_2()
print(r)
'''
结果是:
1
return将值“1”返回给函数fn_2(),然后再复制给r,最后输出r
'''
在函数中,代码在执行过程中一旦遇到return关键字,后面的所有代码将不再执行
函数的作用域
函数的作用域主要分为:
局部作用域
局部作用域主要是指在函数体中进行定义的变量
DEMO:
a = 1
def fn_3():
a=2
print('局部作用域 a =',a)
fn_3()
print('全局作用域 a =',a)
'''
输出结果:
局部作用域 a = 2
全局作用域 a = 1
a=2就是局部作用域,函数体内输出a的值就是局部作用域定义的(函数体内的)
'''
全局作用域
全局作用域是指在函数体外进行定义的变量
DEMO:
a = 1
def fn_3():
a=2
print('局部作用域 a =',a)
fn_3()
print('全局作用域 a =',a)
'''
局部作用域 a = 2
全局作用域 a = 1
a=1就是全局作用域,函数体外输出a的值就是全局作用域定义的(函数体外的)
'''
因此,作用域的优先级:局部作用域>全局作用域,如果有函数嵌套的时候,那么函数间的变量定义域就叫做函数间作用域,其优先级大于全局作用域,而小于局部作用域。
递归函数
递归函数就是在函数中自己调用自己,具有2个基本条件:基线条件(递归函数需要设定一个结束条件,无法会无线循环);递归条件(分解问题的条件,达到自己调用自己的目的满足要求)
DEMO:求4的阶乘和
分析:4!=2+3+2+1,当条件达到最小值1时,该递归函数结束
def fn_5(a):
if a==1:#设置递归函数结束条件(基线条件)
return 1
return a+fn_5(a - 1)#实现递归,调用自身
r=fn_5(4)
print(r)
'''
输出结果:
10
'''
建议:在用递归函数时,能用循环实现的尽量使用循环来做,因为递归函数效率比较低
python检查字符是否是回文,例如TNT
a = 'abaa'
b = a[::-1]
if a ==b:
print('是回文')
else:
print('不是回文')