函数的返回值 return
返回值就是函数执行以后的返回结果
返回值可以直接使用,也可以通过一个变量来接收函数返回值的结果
def fn(*sum):
result = 0
for i in sum:
result += i
# print('输出结果为:',result)
return result
fn(10,20,30)
print(fn(10,20,30)) #直接使用fn函数实参来使用
a = fn(10,20,30) #也可以通过变量来接收函数返回值的结果来输出
print('接收变量输出的结果为:',a)
运行结果:
60
接收变量输出的结果为: 60
return 后面可以跟任意的对象,甚至可以是一个函数,如下:
def fn2():
def fn():
print('python')
return fn
r = fn2()
print('返回结果为:',r)
运行结果:
返回结果为: <function fn2.<locals>.fn at 0x000002883247A8C8>
如果仅仅写一个return或者不写return则相当于返回return ——None
def fn3():
print('hellow')
print('python')
r = fn3()
print(r)
运行结果:
hellow
python
None
在return后面的代码都不会被执行,使用return函数将自动结束
def fn1():
print('hello')
return #return后面的代码将不会执行,return后面的代码都不会执行
print('python')
fn1()
运行结果:
hello
def fn():
for i in range(5):
if i == 4:
return #用来结束函数
print(i)
print('退出当前循环')
fn()
运行结果:
0
1
2
3
fn5与fn5()的一个区别
#fn5()与fn5的一个区别
def fn5():
return 100
print(fn5()) #是在调用对象,实际上是打印fn5()函数的返回值
print(fn5) #是函数对象,实际上是打印函数对象
运行结果:
100
<function fn5 at 0x000001EFB37A3E18>
文档字符串
help()可以查询Python函数中的用法
语法:help(函数对象)
help(input)
运行结果:
Help on built-in function input in module builtins:
input(prompt=None, /)
Read a string from standard input. The trailing newline is stripped.
The prompt string, if given, is printed to standard output without a
trailing newline before reading input.
If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.
On *nix systems, readline is used if available.
Python的作用域
在Python当中有两种作用域 全局作用域和函数作用域
全局作用域:在程序执行时创建,在程序结束时销毁,所以函数以外的区域都是作用域,在全局作用域中定义的变量,都是属于全局变量,全局变量可以在程序中的任意位置访问
局部作用域:在函数调用时创建,在函数调用结束时销毁,函数每调用一次就会产生一个新函数的作用域,在函数作用域中定义的变量都是局部变量,它只能在函数内部被访问
(从内层作用域可以看到外层作用域,从外层看不到内层)意思是:定义一个函数当函数内部有自己的变量时,将会无视全局变量,调用自己的局部变量
代码如下:
a = 30
def fn():
a = 10
print('a = ',a) #函数内部有自己定义的变量值,将无视全局变量
fn()
def fn3():
print('a = ',a) #当函数内部没有赋值的时候,将使用全局变量
fn3()
运行结果:
a = 10
a = 30
如果希望在函数内部修改全局变量,则需要使用global关键字来声明变量
a =20
def fn():
#如果希望在函数内部修改全局变量,则需要使用global关键字来声明变量
global a #当使用gloal关键字的时候,声明在函数内部的使用是全局变量,此时再去修改a时,是一个全局变量
a = 530
print('a = ', a)
fn()
print('a =',a)
运行结果:
a = 530
a = 530
命名空间
命名空间实际上就是一个字典,是一个专门用来存储变量的字典locals()用来获取当前作用域的命名空间。
如果在全局作用域中调用locals()函数则获取全局作用域命名空间,如果在函数作用域中调用locals()则获取函数命名空间
返回的就是一个字典
a = 100 #当变量值放在locals上面则无函数定义的情况下,将调用的是全局变量获取全局变量
s = locals()
print(s)
print(s['__file__']) #命名空间如同于函数的键值对信息
运行结果:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000019D2695C128>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/Pycharm/Python——函数(2).py', '__cached__': None, 'a': 100, 's': {...}}
E:/Pycharm/Python——函数(2).py
def name():
a = 100
s = locals() # 在函数内部调用locals()会获取函数的命名空间
# print(s)
s['b'] = 20
print(s)
name()
运行结果:
{'a': 100, 'b': 20}
def fn3(n):
# 创建一个变量,来接收结果
result = n
for i in range(1, n):
result = result * i
return result
print(fn3(10))
# 递归式函数
# 递归简单理解就是函数自己在调用自己
# 递归式函数就是函数自己调用自己
def fn3(n):
if n == 1:
return 1
return n * fn3(n - 1)
print(fn3(10))
运行结果:
3628800
3628800
递归式函数的两个条件
1、基线条件
#问题可以被分解成最小问题,当满足基线条件时,递归不在执行
2、递归条件
#将问题继续分解的条件
# 递归式函数
# 递归简单理解就是函数自己在调用自己
# 递归式函数就是函数自己调用自己
def fn3(n):
# 基线条件
if n == 1:
# 1的阶乘就是1
return 1
# 递归条件
return n * fn3(n - 1) #为什么使用fn3呢,因为使用到一个函数递归的作用
print(fn3(10))
运行结果:
3628800
3628800
练习:创建一个函数,来为任何数做任何幂运算
#2 ** 4 2 * 2 * 2 * 2 =16
#2 ** 3 2 * 2 * 2 =8
#2 ** 2 2 * 2 = 4
#2 ** 1 2 * 1 =2
def fn4(n,i):
#定义一个函数,其中有两个参数 n要做幂运算,i做幂运算的次数
if i == 1: #当幂运输为1时,返回的结果相当于就是n
return n
return n*fn4(n,i-1)
print(fn4(2,4))
运行结果:
16