首页 > 编程源码 > 函数的return和作用域

函数的return和作用域

楼主:冒得感情 [2级] · 2019-11-19 ·  浏览1128 · 编程源码 · ID:

高阶函数:

高阶函数时至少满足下列条件的函数:

接受一个或多个函数作为输出

输出一个函数

在这里插入代码片def add(x,y,f):

return f(x) + f(y)

res = add(3,-6,abs)

print(res)

###################
def foo():
x=3
def bar():
return x
return bar
在这里插入代码片def f(n):
return n*n
def foo(a,b,func):
func(a)+func(b)
ret=func(a)+func(b)
return ret
foo(1,2,f,)
print(foo(1,2,f))
def f():
print('ok')
fpp=f
def bar(a,b,func):
func()
return 1
bar(1,2,f)
def foo2():
x=5
return x
print(foo2())
def foo3():
def inner():
return 8
return inner
ret=foo3()
print(ret)
print(ret())
1 函数名可以进行赋值
2 函数名可以作为函数参数,还可以作为函数的返回值。
函数的返回值:
要想获取函数的执行结果,就可以用return语句把结果返回
注意:
1.函数在执行过程中只要遇到return语句就会停止执行并返回结果,so
也可以理解为return语句代表着函数的结束
2.如果未在函数中指定return,那这个函数的返回值为none
3.return多个对象,解释器会把这多个对象组装成一个元组作为一个一个整体结束输出。
在这里插入代码片def f():
print('ok')
return 10
返回什么内容,给谁呢?
a=f()
print(a)
print(f())
def add(*arge):
print(args):
Sum=0
for i in args # args=(1,2,3,4,5)

Sum+=1

print(Sum)

return Sum

a=add(1,4)

print(a)

def foo():

return 1,'123',[1,2,3]

print(foo())# (1,'123',8)

# 注意点:1.函数里如果没有return,会默认返回一个None
# 2.如果return多个对象,那么python会帮我们把多个对象封装成一个元组返回
作用域
作用域的介绍:
python中的作用域分4种情况:
L: local,局域作用域,即函数中定义的变量;
E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
G:globa,全局变量,就是模块级别定义的变量;
B:built-in,系统固定模块里的变量,比如int,bytearray等。搜索变量
的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python
内置作用域,也就是LEGB。
在这里插入代码片x = int(2.9) # int built-in

g_count = 0 # globaldef outer(): o_count = 1 # enclosing

def inner():

i_count = 2 # local print(o_count) # print(i_count) 找不到

inner()

outer()

#print(o_count) #找不到

- 版权声明 - 1、本帖所有言论和图片等纯属网友个人意见,与流星社区立场无关;
2、其他单位或个人使用、转载或引用本帖时必须同时征得该帖子作者冒得感情流星社区的同意;
3、备注原文地址:https://bbs.liuxingw.com/t/17919.html,可忽略第2条;
4、帖子作者需承担一切因本文发表而直接或间接导致的相关责任;
5、如本帖内容或部分内容转载自其它媒体,这并不代表本站赞同其观点和对其真实性负责;
6、如本帖若为资源类,将仅限用于学习和研究目的,您必须在下载后的24个小时之内,从您安装或使用的设备中彻底删除上述内容;
7、如果您喜欢该程序,请支持正版软件,购买注册,可以得到更好的正版服务;
8、如本帖侵犯到任何版权或违法问题,请立即邮件告知我们,我们将及时予以处理。
12条回复 |  最后回复于2019-11-19

冒得感情 [2级]

在这里插入代码片count = 10

def outer():
global count
print(count)
count - 5
print(count)


outer()

def outer():
count = 10
def inner():
nonlocal count
count = 20
print(count)
inner()
print(count)
outer()kk0
发布于2019-11-19

回复列表

  • 内容加载中...

说点什么...

冒得感情 [2级]

当然local和enclosing是相对的,enclosing变量相对上层来说也是local。

作用域产生:
在python中,只有模块(module),类(class)以及函数(def、lambda)在会
引入新的作用域,其他的代码块如(如if、try、for等)是不会引起新的作用域的,如下代码:
在这里插入代码片if 2>1:
x = 1
print(x) # 1
发布于2019-11-19

回复列表

  • 内容加载中...

说点什么...

冒得感情 [2级]

如果没有问题的,if并没有引入一个新的作用率,x仍处在当前作用域中
后面代码可以使用。
在这里插入代码片def test():
X = 2
print(x) # NameError: name 'x2' is not defingd

def、class、lambda是可以引入新作用域。
发布于2019-11-19

回复列表

  • 内容加载中...

说点什么...

冒得感情 [2级]

变量的修改:在这里插入代码片################
x=6
def f2():
print(x)
x=5
f2()

# 错误的原因在于print(x)时,解释器会在局部作用找,会找到x=5(函数已经加载到内存),但x使用在声明前了,所以报错:
# local variable 'x' referenced before assignament.如何证明找到了x=5呢?简单:注释掉x=5,x=6
# 报错为:name 'X' is not defined
# 同理
x=6
def f2():
x+=1 #local variadle 'x' referenced defore assignament.
f2()
发布于2019-11-19

回复列表

  • 内容加载中...

说点什么...

小小的时光ꦿ℘゜ [1级]

发布于2019-11-19

回复列表

  • 内容加载中...

说点什么...

冒得感情 [2级]

global关键字:
党内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了
当修改的变量是在全局作用域(global作用域)上的,就要使用global先声明一下,代码如下:
在这里插入代码片count = 10
def outer():
global count
print(count)
outer()
10
100
发布于2019-11-19

回复列表

  • 内容加载中...

说点什么...

冒得感情 [2级]

nonlocal关键字:
global关键字声明的变量必须在全局作用域上,不能嵌套作用域上,当要修改嵌套作用域(enclosing作用域,外层非全局作用域)中的变量怎么办呢,这时就需要nonlocal关键字了
在这里插入代码片def outer():
count = 10
def inner():
nonlocal count
count = 20
print(count)
inner()
print(count)
outer()
#20
#20
发布于2019-11-19

回复列表

  • 内容加载中...

说点什么...

冒得感情 [2级]

小结:
(1)变量查找顺序:LEGB,作用域局部>外层作用域>当前模块中的全局>python内置作用域
(2)只有模块、类、及函数才能引入新的作用域;
(3)对于一个变量,内部作用域先声明就会覆盖外部变量,不声明直接使用,就会使用外部作用域的变量;
(4)内部作用域要修改外部作用域变量的值的时,全部变量要使用global关键字
,嵌套作用域变量要使用nonlocal关键字ninlcal时python3新增的关键字,有了这个 关键字,就能完美的实现闭包了。
发布于2019-11-19

回复列表

  • 内容加载中...

说点什么...

冒得感情 [2级]

发布于2019-11-19

回复列表

  • 内容加载中...

说点什么...

小小的时光ꦿ℘゜ [1级]

发布于2019-11-19

回复列表

  • 内容加载中...

说点什么...
登录注册 后才可进行评论
签到
48人签到
已签0天
  • 46639帖子
  • 1936951热点量
  • 185050火热值