python之函数进阶介绍
1.函数的返回值return
1.1 基本定义
返回值return是将结果返回到调用的地方,并把程序的控制权一起返回(函数执行以后返回的结果)
程序运行到所遇到的第一个return即返回(退出def块),不会再运行第二个return。(函数执行到return后,就不再执行后面)
'''
函数执行以后返回的结果
可返回多个值,用逗号隔开多个返回值,并以元组返回
函数里面可以有多个return语句
'''
def fn(x,y):
z = x + y
return x,y,z
result = fn(1,2)
print(result) # 结果: (1, 2, 3)
def fn(x,y):
if x == y:
return x,y
else:
return ('x != y')
fn(1,2)
1.2 用法
'''
在函数中 return后面的代码都不会执行,return一旦执行函数自动结束
return 可以返回多个不同类型的对象,如函数
'''
#在函数中 return后面的代码都不会执行,return一旦执行函数自动结束
def fn(x):
return x
print('hello')
fn(1) # 无输出 hello
#return 可以返回多个不同类型的对象,如函数
def fn():
a = 30
def f1():
print('hello')
return f1
a = fn()
print(a) # 返回的是函数对象<function fn.<locals>.f1 at 0x000001721D2A91F8>
def fn():
a = 30
def f1():
print('hello')
return f1()
a = fn()
print(a) # 返回的是调用函数 hello None
'''
定义函数fn,fn是指向对象,输出内存地址,fn()是调用函数
函数中无return,则print的返回值为None
如果仅仅写一个return,或者不写return,则相当于return None
'''
def fn():
print('hello world!')
return
print(fn) # 结果为: <function fn at 0x000001BDB4EF4168>
print(fn()) # 结果为:hello world! \n None
def fn():
return
result = fn()
print(result) # None
1.3 print()和return差别
return和print都可以返回值,为什么要用return?
return返回的值可以传递保存计算
'''
return返回的值可以传递保存计算
print不可以传递保存计算
'''
print(fn()) # 98 98 ok
def fn(x):
if x<0 :
print(x)
else:
print('值不小于0')
a = fn(-2)
b = fn(-1)
print(a+b) # 报错: TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'
def fn(x):
if x<0 :
return x
else:
print('值不小于0')
a = fn(-2)
b = fn(-1)
print(a+b) # -3
如果你的函数只需打印语句,不需要传递值的时候可以使用print代替return
但绝大多数应用中仍需使用return打印值。
2.文档字符串
help()是Python中内置函数,通过__doc__方法、help()函数可以查询Python中函数的⽤法
在定义函数时,可以在函数内部编写⽂档字符串,⽂档字符串就是对函数的说明
'''
文档字符串(DocStrings):
用于解释文档程序,帮助你的程序文档更加简单易懂。
在函数体的第一行使用一对三个单引号 或者一对三个双引号来定义文档字符串。
文档字符串使用惯例:它的首行简述函数功能,第二行空行,第三行为函数的具体描述。
可以使用 __doc__(注意双下划线)\help()函数调用函数中的文档字符串属性。
'''
def fn(n=5):
'''
函数功能: 求0到n之间的和
参数:
n:设定求和范围,int,默认值为5
'''
result = 0
for i in range(0,n+1):
result += i
return result
fn()
print(fn.__doc__) # 函数功能: 求0到n之间的和 参数: n:设定求和范围,int,默认值为5
help(fn())
def fn(a:bool,b:int,c:str)->int:
'''
这个函数式一个文档字符串的实例
参数
a:作用 类型 默认值......
b:作用 类型 默认值......
c:作用 类型 默认值......
'''
return 100
help(fn)
'''
结果为:
fn(a: bool, b: int, c: str) -> int
这个函数式一个文档字符串的实例
参数
a:作用 类型 默认值......
b:作用 类型 默认值......
c:作用 类型 默认值......
'''
3. 函数的作用域
3.1 定义
- 作用域指的是变量生效的区域
3.2 全局作用域与函数作用域区别
- 全局作用域在程序执行时创建,在程序执行结束时销毁。所有函数以外的区域都是全局作⽤域
- 在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问
- 函数作用域函数作用域在函数调⽤时创建,在调结用束时销毁
- 函数每调用⼀次就会产生⼀个新的函数作用域
- 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
'''
- 全局作用域在程序执行时创建,在程序执行结束时销毁。所有函数以外的区域都是全局作⽤域
- 在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问
- 函数作用域函数作用域在函数调⽤时创建,在调结用束时销毁
- 函数每调用⼀次就会产生⼀个新的函数作用域
- 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
'''
a = 1 # a 是全局变量
def fn():
b = 10
print('函数外部的a:',a) # 全局变量可以在程序的任意位置进行访问
print('函数内部的b:', b) # 局部变量,只能在函数内部被访问
print('函数外部的a:',a) # 函数外部的a是全局变量,可以在程序的任意位置进行访问
print('函数内部的b:'b) # 函数内部的b是局部变量,无法从外部访问 报错: SyntaxError: invalid syntax
3.3 局部变量声明为全局变量
'''
局部变量改为全局变量 ,通过global
'''
a = 10
def fn():
a = 5
print('函数内部的a',a)
fn() # 函数内部的a 5
print('函数外部的a',a) # 函数外部的a 10
a = 10
def fn():
global a # 声明a为全局变量
a = 15
print('函数内部的a',a)
fn() # 函数内部的a 15
print('函数外部的a',a) # 函数外部的a 15
4.命名空间
- 命名空间实际上就是⼀个字典,是⼀个专⻔⽤来存储变量的字典
- locals()⽤来获取当前作⽤域的命名空间
- 如果在全局作⽤域中调⽤locals()则获取全局命名空间,如果在函数作⽤域中
调⽤locals()则获取函数命名空间
-返回值是⼀个字典
'''
- 命名空间实际上就是⼀个字典,是⼀个专⻔⽤来存储变量的字典
- locals()⽤来获取当前作⽤域的命名空间
- 如果在全局作⽤域中调⽤locals()则获取全局命名空间,如果在函数作⽤域中
调⽤locals()则获取函数命名空间
-返回值是⼀个字典
'''
a = 10
def fn():
b = 10
s = locals()
print(s)
'''
输出结果为:
{'__name__': '__main__',
'__doc__': '\n- 命名空间实际上就是⼀个字典,是⼀个专⻔⽤来存储变量的字典
\n- locals()⽤来获取当前作⽤域的命名空间
\n- 如果在全局作⽤域中调⽤locals()则获取全局命名空间,如果在函数作⽤域中
\n调⽤locals()则获取函数命名空间\n-返回值是⼀个字典\n',
'__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000020D593D2308>,
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
'__file__': 'F:/教材/python学习/python练习/25/demo4.py',
'__cached__': None, 'a': 10, 'fn': <function fn at 0x0000020D594A4168>, 's': {...}}
'''
a = 10
def fn():
b = 10
s = locals()
print(s)
fn() # 结果为 {'b': 10}
5.递归函数
5.1 基本介绍
'''
递归函数
# 从前有座山,山里有座庙,庙里有个老和尚在给一个小和尚讲故事,讲什么故事呢?
# 从前有座山,山里有座庙,庙里有个老和尚在给一个小和尚讲故事,讲什么故事呢?...
# 递归简单理解就是自己去引用自己
# 递归式函数,在函数中自己调用自己
# 无穷递归 类似于死循环
'''
def fn():
fn()
fn() # 报错: 陷入死循环 RecursionError: maximum recursion depth exceeded
5.2 用法
- 递归是一个解决问题的方式
- 它的整体思想,是将一个大的问题分解为一个一个的小问题,直到问题无法分解时,再去解决问题
- 递归式的函数有2个条件
1.基线条件:问题可以被分解为最小的问题,当满足基线条件时,递归就不在执行了
2.递归条件:将问题可以继续分解的条件
5.2.1 阶乘实现
# 阶乘实现
# 4! = 4*3*2*1
# 3! = 3*2*1
# 2! = 2*1
# 1! = 1
def fn(n):
# 1.基线条件
if n == 1:
return n
# 2.递归条件
if n > 1 :
return n * fn(n-1)
result = fn(4)
print(result)
5.2.3 幂运算
# 使用递归函数来创建一个函数来为任意数字做任意幂运算
# 10**6 = 10 * 10**5
# 10**5(fn(5)) = 10 * 10**4(fn(4))
# 10**4(fn(4)) = 10 * 10**3(fn(3))
# 10**3(fn(3)) = 10 * 10**2(fn(2))
# 10**2(fn(2)) = 10 * 10**1(fn(1))
# 10**1(fn(1)) = 10
def fn(n):
# 1.基线条件
if n == 1:
return 10**n
else:
return (10*fn(n-1))
result = fn(4)
print(result) # 10000
5.2.4 判断回文符
# 定义一个函数用来检测一个任意字符是否是回文字符如果是返回True,如果不是返回False
# 回文字符串,字符串从前往后念和从后往前念是一样的
# 例如 abcba
# abcdefgfedcba
# 先检查第一个字符和在最后一个字符是否一致,如果不一致一定不是回文字符串
# 如果一致就要检查剩余的部分是不是回文字符串
# bcdefgfedcb 是不是回文
# cdefgfedc
# defgfed
# efgfe
# fgf
# g
# 重复s[0] == s[-1]检查
def fn(s):
# 1.基线条件
if len(s)<2:
return True
elif s[0] != s[-1]:
return False
# 2.递归条件
return fn(s[1:-1]) # -1时取到的是索引为-2的值
result = fn('bcdefgfedcb')
print(result) # True