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