函数返回值return
返回函数的值,可以是任意python对象
如果没有return或return后没有对象,则相当于return None
return 一旦执行函数自动结束,return下面的代码不会执行。与循环语句中的break有点类似。
print 与print()的区别
- print是函数对象
>>> print(print)
<built-in function print>
>>> id(print)
2931764592504
- print()是调用函数,执行函数中的代码块
>>> print('hello')
hello
函数中文档字符串
def s(a:int,b:float,c:True)-> int: #在参数后用冒号提示参数使用的类型
'''
#三引号注释多行字符,可以写各种注释,说明函数用法,参数类型等
:param a: 参数a
:param b: 参数b
:param c: 参数c
:return: 返回值
'''
pass
help(s) #用help(函数对象),查看函数的使用方法
执行结果
s(a:int, b:float, c:True) -> int
#三引号注释多行字符,可以写各种注释,说明函数用法,参数类型等
:param a: 参数a
:param b: 参数b
:param c: 参数c
:return: 返回值
函数的作用域,gloable,nonlocal关键字
作用域,指变量生效的区域
- 全局作用域
全局变量在任意位置都可以访问,如图a变量,可以被函数1,2,3访问,使用a之前,会从本作用域寻找是否有变量a,若本作用域没有定义该变量,需要用global声明才能使用外部变量a - 函数作用域
只在本函数内生效,如b只在函数1生效,c只在函数2和函数3生效,变量d只在函数3生效 - 函数内部使用global 参数 ,声明参数为全局变量,此时如果修改参数值,则可以修改的是全局变量
- global
一般在函数内部使用,声明变量为全局变量 - nonlocal
嵌套的函数内使用,声明变量为外层函数变量
1、global的使用
def s()-> int:
global a
a= 10
pass
a=1
print(a)
s()
print(a)
执行结果
1 执行函数前a的值
10 执行函数后a的值
2、nonlocal的使用
name = 'asd'
def fn():
# nonlocal name
name = 'ABC'
def fn1():
nonlocal name
print('name1=', name) #ABC
name = '孙悟空'
print('name2=', name) #孙悟空
def fn2():
nonlocal name
print('name5=', name)#孙悟空
name = '猪八戒'
print('name6=',name)#猪八戒
fn2()
fn1()
print('name3=', name)#猪八戒
fn()
print('name4=',name)
执行结果
name1= ABC
name2= 孙悟空
name5= 孙悟空
name6= 猪八戒
name3= 猪八戒
name4= asd
命名空间locals(),globals()
命名空间返回的是一个字典,是一个专门用来存储变量的字典。
locals()获取当前作用域的命名空间。
可以用字典的方式添加或修改值,一般不建议这么做。
globals() 函数可以用来在任意位置获取全局命名空间。
a=1
def s()-> int:
global a
a= 10
print(a)
b=10
print(locals())
pass
print(a)
s()
print(a)
结果
1
10
{'b': 10} a声明为全局变量,所以不出现在函数的命名空间中
10
递归函数
递归式函数,在函数中,调用自己
创建递归函数的2个条件
- 基线条件
问题可以被分解为最小的问题,当满足基线条件的时候,递归就不在执行了 - 递归条件
将问题可以分解的条件
- 任意数的阶乘
5! = 5x4x3x2x1= 5x4!
4! = 4x3x2x1 = 4x3!
3! = 3x2x1 = 3x2!
2! = 2x1 = 2x1!
1! = 1
def jie_cheng(n):
#基线条件
if n==1:
return 1
#递归条件
return n*jie_cheng(n-1)
print(jie_cheng(5)) #120
- 任意数字幂运算
5**5 = 5x5x5x5x5 = 5x(5**4)
5**4 = 5x5x5x5 = 5x(5**3)
5**3 = 5x5x5 = 5x(5**2)
5**2 = 5x5 = 5x(5**1)
5**1 = 5
def jie_cheng(n,i):
#基线条件
if i==1:
return n
#递归条件
return n*jie_cheng(n,i-1)
print(jie_cheng(5,5)) #3125
- 判断回文字符串
字符串从后往前读和从后往前读是一样的 例如 abcba ,abc
abcdcba 判断头尾字符是否相等,相等进入下一步,否则退出
bcdcb 除去上面字符串头尾字符后,再判断头尾字符相等,相等进入下一步,否则退出
cdc 除去上面字符串头尾字符后,判断头尾字符相等,相等进入下一步,否则退出
d 返回True
def hui_wen(s):
#if s[0]==s[-1]:
if len(s)<2: #长度小于2肯定是回文
return True
elif s[0]!=s[-1]:
return False
return hui_wen(s[1:-1]) #递归
print(hui_wen('abcdcba'))