Day04-Python基础函数

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

1.可以被引用

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

func=foo      ##foo值赋给了func

print(foo)    ##<function foo at 0x006E4108>
print(func)   ##<function foo at 0x006E4108>
func()        ##foo值赋给了func ,所以可以直接()引用

2.可以当做参数传递

def foo():
    print('from foo111111')
def bar(func):
    print(func)
    func()
bar(foo)

3.返回值可以是函数

def foo():
    print('from foo')
def long(func):
    return func
f=long(foo)
print(f)
f()

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

def foo():
    print('from foo')
dic = {'fuck':foo}
print(dic['fuck'])
dic['fuck']()

 

def select(sql):
    print('------>select')
def update(sql):
    print('------>update')
def delete(sql):
    print('------>delete')
def insert(sql):
    print('------>insert')

fun_dit={
    'select':select,
    'update':update,
    'delete':delete,
    'insert':insert
}
def main():
    while True:
        sql = input('>>>:').strip()
        if not sql: continue
        l = sql.split()
        cmd= l[0]
        if cmd  in fun_dit:
            fun_dit[cmd](l)
main()

二.函数的嵌套

 1.函数的嵌套调用

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,80,31,20))

 2.函数嵌套定义

def f1():

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

        f3()
    f2()
f1()

 三.名称空间与作用域 

名称空间,存放名字的地方以及,三种名称空间

1.内置名称空间  (随着Python解释器的启动而产生)

print(sum)      #<built-in function sum>   #内存函数的地址
print(max)      #<built-in function max> 
print(min)       #<built-in function min>

查看内置名称空间

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

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

 

x = 1
if x ==1:
    y=2
class foo():

import time

name = 'long'

def func():
    pass

#以上是全局定义的名字

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

x = 1111
def func():
    x=1
    def f1():
        pass

2.作用域:

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

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

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

x = 1 
def func():
    x=2
    print(x)  #输出结果为:先查找局部空间内的x=2,如果局部空间没有则查找全局空间,全局没有查找内置名称空间
def func():
    sum=123123
    print(sum)
func()   #输出结果123,如把sum注释掉就会去全局找,全面局没有,内置找,内置中找到的sum内存地址

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

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

查看局部作用域内的名字:locals()

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

全局作用域:全局有效,在任何位置都能被访问到,除非del删掉,否则一直存活到文件执行完毕

局部作用域的名字:局部有效,只能在局部范围调用,只在函数调用时才有效,调用结束时失效

 

四.闭包函数(定义在内部函数包含对外部作用域或而非全局作用域的引用,该内部函数就成为闭包函数)

def f1():
    x=1
    def f2():
        print(x)
    return f2
f=f1()
f()                     #

 五.装饰品(修饰别人的工具,修饰添加功能,工具指的函数)

装饰品本身可以是任何可调用对象,被装饰的对象也可以是任意可调用对象

为什么要用装饰品:

    开放封闭原则:对修改是封闭的,对扩展是开放的

 装饰器就是为了在不修改被装饰对象的源代码以及调用方式前提下,为期添加新功能

 

posted @ 2017-07-12 16:59  人生苦短,别学py  阅读(202)  评论(0编辑  收藏  举报