目录
• 1. 函数的返回值
• 2. 文档字符串
• 3. 函数的作用域
• 4. 命名空间
• 5. 递归函数
1. 函数的返回值
• 返回值就是函数执行以后返回的结果
• 通过return来指定函数的返回值
• return后面可以跟任意对象,返回值甚至可以是一个函数
def fn():
# return 100
# return 'python'
# return [1,2,3]
# return {'name':'张三'}
def fn2():
print('hello')
return fn2 #返回函数本身
r = fn()
print(r)
#.fn2 at 0x000001D3338ACBF8>
print(fn())
#.fn2 at 0x0000025DCF53CB70>
r()
# hello
- 如果仅仅写一个return,或者不写return,则相当于return None
def fn2():
return
r = fn2()
print(r)
# None
- 在函数中 return后面的代码都不会执行,return一旦执行函数自动结束
#没讲return什么,还是返回none
def fn3():
print('hello')
return
print('123')
r = fn3()
print(r)
# hello
# None
def fn3():
print('hello')
return
print('123')
r = fn3()
# print(r)
r
# hello
return v.s. break
def fn4():
for b in range(5):
if b == 3:
# break
return # 用来结束函数
print(b)
print('循环执行完毕')
fn4()
# 0
# 1
# 2
def fn4():
for b in range(5):
if b == 3:
break
# return # 用来结束函数
print(b)
print('循环执行完毕')
fn4()
# 0
# 1
# 2
# 循环执行完毕
- fn5和fn5()的区别
fn5是函数对象 #print结果:func of f5...
fn5()是在调用函数
2. 文档字符串
• help()是Python中内置函数,通过help()函数可以查询Python中函数的用法。
• 在定义函数时,可以在函数内部编写文档字符串,文档字符串(```)就是对函数的说明。
def fn(a:bool,b:int,c:str)->int: #对传参&返回值格式有要求
'''
这个函数式一个文档字符串的实例
参数
a:作用 类型 默认值......
b:作用 类型 默认值......
c:作用 类型 默认值......
'''
return 100
help(fn)
3. 函数的作用域
• 作用域(scope):变量生效的区域
- 在Python中一共有两种作用域
全局作用域
• 全局作用域在程序执行时创建,在程序执行结束时销毁
• 所有函数以外的区域都是全局作用域
• 在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问
函数作用域
• 函数作用域在函数调用时创建,在调用结束时销毁
• 函数每调用一次就会产生一个新的函数作用域
• 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
函数作用域可以从内往外看,不能从外网内调用
在函数内部修改全局作用域 global 变量
def fn3():
# global a
a = 50
print('函数内部:','a =',a)
fn3()
print('函数外部:','a =',a)
# 函数内部: a = 50
# 函数外部: a = 20
def fn3():
# 如果希望在函数内部修改全局变量,则使用global关键字,来声明变量
# 声明在函数内部使用的变量a是全局变量,则此时在去修改a时,就是在修改全局变量
global a
a = 50
print('函数内部:','a =',a)
fn3()
print('函数外部:','a =',a)
# 函数内部: a = 50
# 函数外部: a = 50
4. 命名空间
• 命名空间实际上就是一个字典,是一个专门用来存储变量的字典
• locals()用来获取当前作用域(函数/全局)的命名空间
• 如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用locals()则获取函数命名空间。
def fn3():
global a
a = 50
print('函数内部:','a =',a)
s = locals()
print(s)
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002179630B240>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'C:/Users/DELL/Desktop/基础资料-第十讲/课堂源码/命名空间.py', '__cached__': None, 'a': 20, 'fn3': , 's': {...}}
s['c']=100 #在空间里新增一个键值对‘c’:100
print(c)
#100
- 在函数中用globals()获取全局命名空间
def fn4():
# a = 10
# s = locals() # 获取函数内部的命名空间
# s['b'] = 20
# print(s)
global_s = globals()
global_s['a'] = 30 #修改全局变量
print(global_s)
fn4()
#{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000208D86AB240>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'C:/Users/DELL/Desktop/基础资料-第十讲/课堂源码/命名空间.py', '__cached__': None, 'a': 30, 'fn4': }
• 返回值是一个字典
5. 递归函数
• 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题。
e.g.求任意数的阶乘
# 求任意数的阶乘
def fn(n):
# 定义一个函数,储存结果
result=n
for i in range(1,n):
n*=i
return result
print(fn(3))
- 递归简单理解就是自己去引用自己
- 递归式函数,在函数中自己调用自己
• 递归式函数有2个条件
• 1. 基线条件 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
• 2. 递归条件 可以将问题继续分解的条件
def fn2(n):
# 参数 n要求阶乘的数字
# 1.基线条件
if n == 1:
# 1的阶乘就是1 直接返回结果
return 1
# 2.递归条件
return n * fn2(n-1)
print(fn2(10))
#3628800
# 10**6=10*10**5
def fn(i,k):
# 基数条件
if k==1:
return i
# 递归运算
return i*fn(i,k-1) #i**(k-1)
print(fn(2,2))
找回文字符
def fn2(s):
# 参数s就是要检查的字符串
# 1.基线条件
# 字符串的长度小于2 则字符串一定是个回文
if len(s)<2:
return True
# # 第一个字符和最后一个字符不相同,则一定不是回文字符串
elif s[0] != s[-1]:
return False
# 2.递归条件
return fn2(s[1:-1])
print(fn2('abcdefgfedcba'))