一、函数的返回值
返回值是函数执行以后返回的结果
通过 return 来指定函数的返回值
return 后面可以跟任意对象,甚至可以是一个函数
函数内的 return 后无内容或者没有 return ,都相当于 return None
def fn():
def fn1():
print('hello world')
return fn1
r = fn()
r()
#结果为 hello world
def fn():
def fn1():
print('hello world')
return fn1()
r = fn()
print(r)
#结果为
hello world
None函数内 return 后的代码都不会被执行, return 一旦执行函数结束
return 用来退出函数,返回指定的返回值
break 用来退出循环
continue 用来退出当前循环
def fn():
print('zqc')
return
print('xrr')
r = fn()
print(r)
#结果为
zqc
Nonefn 是函数对象,fn() 是调用函数
print(fn) 打印出来的是函数对象
print(fn()) 打印出来的是函数的返回值
二、文档字符串
help() 是 Python 中内置函数,通过 help() 函数可以查询 Python 中函数的用法
注意:括号里面是函数对象
help(len)
#结果为
Help on built-in function len in module builtins:
len(obj, /)
Return the number of items in a container.在定义函数时,可以在函数内部编写文档字符串,文档字符串就是对函数的说明,这时的 help() 函数可以打印出文档字符串
def fn(a, b, c=2):
'''
这是fn函数的文档字符串说明:
:param a: 第一个参数为list类型
:param b: 第二个参数为str类型
:param c: 第三个参数为int类型,默认为2
:return: 无返回值
'''
help(fn)
#结果为
Help on function fn in module __main__:
fn(a, b, c=2)这是fn函数的文档字符串说明:
:param a: 第一个参数为list类型
:param b: 第二个参数为str类型
:param c: 第三个参数为int类型,默认为2
:return: 无返回值
三、函数的作用域
作用域 ( scope ) 指的是变量生效的区域
在 Python 中一共有两种作用域
3.1 全局作用域
全局作用域在程序执行时创建,在程序执行结束时销毁所有函数以外的区域都是全局作用域
在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问
a = 1
def fn():
print(a)
fn()
#结果为 13.2 函数作用域
函数作用域在函数调用时创建,在调用结束时销毁函数每调用一次就会产生一个新的函数作用域
在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
a = 1
def fn():
a = 2
print('函数内部为', a)
fn()
print('函数外部为', a)
#结果为函数内部为 2
函数外部为 1
3.3 函数内部申明全局变量
在函数内部修改全局变量,需要用 global 关键字申明对应的局部变量,申请之后修改该局部变量,全局变量也会被修改
a = 1
def fn():
global a
a = 2
print('函数内部为', a)
fn()
print('函数外部为', a)
#结果为函数内部为 2
函数外部为 2
四、命名空间
命名空间是一个用来存储变量的字典
4.1 locals()
locals() 函数用来获取当前作用域的命名空间
如果在全局作用域中调用 locals() 则获取全局命名空间,如果在函数作用域中调用 locals() 则获取函数命名空间
函数的返回值是一个字典
a = 1
b = 2
print(locals())
#结果为
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.sourcefileloader object at>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'E:/untitled/venv/测试.py', '__cached__': None,
'a': 1, 'b': 2}
a = 1
b = 2
def fn():
a = 10
b = 20
print(locals())
fn()
#结果为 {'b': 20, 'a': 10}4.2 对命名空间进行操作
命名空间实则为字典,所以可以将它看做字典进行操作
a = 1
b = 2
def fn():
a = 10
b = 20
l = locals()
print(l['a'])
l['c'] = 30
print(l)
fn()
#结果为
10
{'b': 20, 'a': 10, 'c': 30}4.3 函数内部查看全局命名空间
在函数内部调用 globals()
a = 1
b = 2
def fn():
a = 10
b = 20
print(globals())
fn()
#结果为
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.sourcefileloader object at>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'E:/untitled/venv/测试.py', '__cached__': None,
'a': 1, 'b': 2, 'fn': }五、递归函数
5.1 递归函数简介
递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个
的小问题,直到问题无法分解,再去解决问题
5.2 递归函数的2个条件
1、基线条件
。 问题逐步被分解,直到最后分解不了时满足的条件就是基线条件
。 当满足基线条件时,递归就不执行了
2、递归条件
。 可以将问题继续分解的条件
5.3 递归函数第一个例子
写出一个递归函数计算任意数的阶乘
分析问题:
。 如何将问题分解:
例如求10的阶乘:
10!=10 * 9!
9!=9 * 8!
8!=8 * 7!
…
2!=2 * 1!
1!=1 * 1!=1。 基线条件:当最后分解到1时结束
if n == 1 :
return 1。 递归条件:10!=10 * 9! ,… ,2!=2 * 1!,1!=1
return n * fn(n-1)
def fn(a):
if a == 1:
return 1
return a * fn(a - 1)
print(fn(10))
#结果为 36288005.4 递归函数的第二个例子
求任意数的任意次幂
分析问题:
。 如何将问题分解:
例如求5的三次方:
5^3 = 5 * 5^2
5^2 = 5 * 5^1
5^1 = 5。 基线条件:当最后分解到指数为1时结束
if z == 1 :
return d。 递归条件:5^3 = 5 * 5^2, 5^2 = 5 * 5^1 , 5^1 = 5
return d * fn(d,z-1)
def fn(d, z):
if z == 1:
return d
return d * fn(d, z - 1)
print(fn(5, 3))
#结果为 1255.5 递归函数的第三个例子
判断任意一个字符串是不是回文字符串
分析问题:
。 如何将问题分解:
例如判断字符串 ‘asxdsa’ 是否是回文字符串:
1、‘asxdsa’ 头尾是否一样
2、‘sxds’ 头尾是否一样
3、‘xd’ 头尾是否一样,不一致返回 False
。 基线条件:字符串长度小于2返回 True , 头尾不一致返回 False
if len(a) < 2:
return True
if a[0] != a[-1]:
return False。 递归条件:字符串去头尾
return fn(a[1:-1])
def fn(a):
if len(a) < 2:
return True
if a[0] != a[-1]:
return False
return fn(a[1:-1])
print(fn('asdxdsa'))
#结果为 True
















