函数的对象、嵌套及作用域

1、函数的对象

函数的第一类对象的含义是函数可以被当做数据处理

# def func(): #func=<function func at 0x0584BA50>
# print('from func')
# print(func) #打印函数名的地址 加括号即调用函数内容
(1)引用
def func(): #func=<function func at 0x0584BA50>
print('from func')
f=func
print(f)
f()
2)把自己当成个参数传给函数
def func(): #func=<function func at 0x0584BA50>
print('from func')
def foo(m):
# print(m)
m() #现在m就等于func,加括号就返回func函数的内容
foo(func)

3、可以当作函数的返回值
def func(): #func=<function func at 0x0584BA50>
    print('from func')
def foo(x): #x=func
return x #return func
res=foo(func)
print(res) #打印了func函数的内存地址
res() #返回了func的内容

4、可以当作容器类型的元素
def func(): #func=<function func at 0x0584BA50>
print('from func')
l=[func,]
print(l) #打印函数内存地址
# l[0]() 通过列表的索引取到函数的内存地址,加括号,返回函数内容

func_dic={
'1':pay,
'2':withdraw,
'3':transfer,
'4':check_balance,
'6':shopping
}

while True:
msg="""
1 支付
2 取款
3 转账
4 查看余额
5 退出
6 购物
"""
print(msg)
choice=input('>>: ').strip()
if choice == '5':break
if choice not in func_dic:
print('输入的指令不存在傻叉')
continue
func_dic[choice]()
 
2、函数的嵌套定义
def f1():
def f2():
print('from f2')
f2()
f1()

# from math import pi
# def circle(radius,action='area'): 求面积和周长
# def area():
# return pi*(radius **2 )
# def perimeter():
# return pi *2*radius
# if action == 'area':
# return area()
# if action == 'perimeter':
# return perimeter()
# print(circle(15))
# print(circle(15,action='perimeter') )

函数嵌套的调用
def max2(x,y):
if x>y:
return x
else:
return y
def max4(a,b,c,d):
res1=max2(a,b)
res2 = max2(res1,c)
res3= max2(res2,d)
return res3
print(max4(2,3,4,5))

3、名称空间与作用域
(1)名称空间是存放名字与值绑定关系的地方
2)名称空间分为三大类
内置名称空间:存放python解释器自带的名字(在解释器启动时生效,在解释器关闭时失效)
全局名称空间:除了内置与局部名字外,其余都是全局名称空间(在文件执行时生效,在文件执行完毕时失效)
局部名称空间:用于存放函数调用期间函数体产生的名字(如果调用某个函数才会临时生效,在函数执行完毕后失效)

(3)三种名称空间的加载顺序是:
内置-》全局-》局部
(4)、作用域

作用域:
    域指的是区域、范围,作用域即作用的范围

全局作用范围,全局作用域(内置名称空间与全局名称空间)
全局有效,全局存活
局部作用范围,局部作用域(局部名称空间)
局部有效,临时存活

(5)函数对象+作用域:******
x=1

def f1()
def inner():
# print('from inner',x)
# return inner
#
# f=f1()
#
# # print(f)
#
# def bar():
# x=1111111111111111111111111111111111 #
作用域关系是在函数定义阶段就固定死了,但凡调用函数都需要跑到定义阶段去找作用域关系

# f()
#
# bar()










 
posted @ 2018-06-11 21:41  朝朝哥  阅读(405)  评论(0编辑  收藏  举报