python函数(二)

我是研究僧i 提交于 2020-04-08 07:02:21

一:函数对象:函数是第一类对象,即函数可以当作数据传递

=================================
1 可以被引用
2 可以当作参数传递
3 返回值可以是函数
4 可以当作容器类型的元素

=================================

1.函数可以被引用

1 def foo():
2     print('from foo')
3 func=foo
4 
5 print(foo)
6 print(func)
7 func()

执行结果

<function foo at 0x00000000006FF598>
<function foo at 0x00000000006FF598>
from foo

函数名本身表示的就是内存地址,可以被其他对象引用

2.被当做参数传递

def foo():
    print('from foo')

def bar(func):
    print(func)
    func()

bar(foo)
View Code

执行结果

<function foo at 0x000000000082F598>
from foo

3.返回值可以是函数

def foo():
    print('from foo')

def bar(func):
    return func

f=bar(foo)

print(f)

f()

执行结果

<function foo at 0x0000000000A6F598>
from foo

bar(foo)返回的就是foo本身,所有f和foo都指向同一块内存地址

4.可以当做容器类型的元素

 

def select(sql):
    print('==========select')

def delete(sql):
    print('==========delete')

def insert(sql):
    print('==========insert')

def update(sql):
    print('==========update')


func_dict={
    'select':select,
    'update':update,
    'insert':insert,
    'delete':delete
}

while True:
    in_sql=input('sql>').strip()
    sql=in_sql.split()
    cmd=sql[0]
    if cmd in func_dict:
        func_dict[cmd](sql)
    else:
        print('error')
View Code

二、函数嵌套

1.函数的嵌套定义

def f1():
    def f2():
        print('from f2')
        def f3():
            print('from f3')
        f3()
    f2()

 f1()
View Code

2.函数的嵌套调用

def max2(x,y):
    return x if x > y else y

def max4(a,b,c,d):
    res1=max2(a,b)
    res2=max2(res1,c)
    res3=max2(res2,d)
    return res3

print(max4(10,99,31,22))
View Code

三、名称空间与作用域

(一)名称空间包含有三种

1.内置名称空间

2.全局名称空间

3.局部名称空间

 

引:名字(名称)的定义

变量

name='larry'

函数

def func():

   pass

class human:

  pass

1.内置名称空间

随着解释器的启动而产生

import builtins
for i in dir(builtins):
  print(i)

2.全局名称空间

文件的执行会产生全局名称空间,指的是文件级别定义的名字都会放入该空间

3.局部名称空间

调用函数时会产生局部名称空间,只在函数调用时临时绑定,调用结束解绑定

x=10000
def func():
    x=1
    print(x)

func()
print(x)
View Code

执行结果

1

10000

(二)作用域

1.全局作用域:内置名称空间,全局名称空间

2.局部作用域:局部名称空间

名字的查找顺序:局部名称空间---》全局名层空间---》内置名称空间

x=1
def func():
    x=2
    print(x)
    sum=123123
    print(sum)
func()
View Code

执行结果

2

123123

#查看全局作用域内的名字:gloabls()
#查看局局作用域内的名字:locals()

x=1000
def func():
    x=2
print(globals())
print(locals())
print(globals() is locals())
View Code

执行结果

{'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000556C18>, '__spec__': None, '__package__': None, '__file__': 'C:/Users/larry/PycharmProjects/python/day04/fun_exc.py', '__cached__': None, '__name__': '__main__', '__doc__': None, 'func': <function func at 0x000000000071D6A8>, 'x': 1000, '__builtins__': <module 'builtins' (built-in)>}
{'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000556C18>, '__spec__': None, '__package__': None, '__file__': 'C:/Users/larry/PycharmProjects/python/day04/fun_exc.py', '__cached__': None, '__name__': '__main__', '__doc__': None, 'func': <function func at 0x000000000071D6A8>, 'x': 1000, '__builtins__': <module 'builtins' (built-in)>}
True

x=1000
def func():
    x=2
    print(globals())
    print(locals())
    print(globals() is locals())

func()
View Code

执行结果

{'func': <function func at 0x000000000102D6A8>, '__name__': '__main__', '__doc__': None, '__package__': None, '__spec__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000006B6C18>, '__file__': 'C:/Users/larry/PycharmProjects/python/day04/fun_exc.py', '__cached__': None, '__builtins__': <module 'builtins' (built-in)>, 'x': 1000}
{'x': 2}
False

#全局作用域:全局有效,在任何位置都能被访问到,除非del删掉,否则会一直存活到文件执行完毕
#局部作用域的名字:局部有效,只能在局部范围调用,只在函数调用时才有效,调用结束就失效

x=1

def f1():
    print(x)

def foo():
    print(x)

def f(x):
    x=4
    def f2():
        x=3
        def f3():
            x=2
            print(x)

        f3()
    f2()

f(4)
View Code

函数调用时局部有效

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!