函数名的应用:

1.函数名可以做为函数的参数

def func1():
    print(666)
def func2(x):
    print(x)
    x()
print(func1)  

2.函数名可以作为函数的返回值

def wraaper():
    def inner():
        print('inner)
    return inner
ret = wraaper()
ret() 

3.函数名可以作为函数的内存地址

print(func)

4.函数可以作为变量

def func1():
    print(666)
f1 = func1
f2 = f1
f2() 

5.函数名可以作为容器类型的元素

def func1():
    print('in func1')
def func2():
    print('in func2')
def func3():
    print('in func3')
def func4():
    print('in func4')
l1 = [func1, func2, func3, func4]
for i in l1:
    i()

globlas() : 返回全局变量的一个字典

locals():返回当前位置的局部变量的字典

def func1():
    a = 2
    b = 3
    print(globals())
    print(locals())
    def inner():
        c = 5
        d = 6
        print(globals())
        print(locals())
    inner()
func1() 

闭包:内层函数对外层函数变量(非全局变量)的引用,并返回,这样就形成了闭包

def wraaper():
    name = 'alex'
    def inner():
        print(inner.__closure__)
        inner()
        return inner
wraaper()

 当name是全局变量时

name = 'alex'
def wraaper():
    def inner():
        print(name)
    print(inner.__closure__)     #返回的是None
    inner
    return inner
wraaper()

但是,当wraaper的实参是name时,将会有返回值

name = 'alex'
def wraaper(n):         #n = 'alex'
    def inner():
        print(n)
    print(inner.__closure__)
    inner()
    return inner
wraaper(name)  

闭包的作用:当程序遇到函数执行时,会开辟出一个内存空间,儿如果这个函数形成了闭包,name他不会随着函数的消失而消失。

迭代对象:内部含有__inter__,满足可迭代协议

判断方法:

s1 = 'strs'
dic = {'name': 'alex'}
print('__iter__'in dir(s1))        #True 
print('__iter__'in dir(dic))       #True  

第二种方法:

from collections import Iterable
from collections import Iterator
print(isinstance('alex', Iterable))        #True
print(isinstance('alex', Iterator))        #False
print(isinstance('alex', str))             #True

迭代器:对象内部含有__iter__方法且含有__next__方法就是迭代器

f = open('register', encoding='utf-8')
print('__iter__'in dir(f))          #True
print('__next__'in dir(f))          #True
print('__iter__'in dir(dict))       #True
print('__next__'in dir(dict))       Flase 

迭代器与迭代对象的区别:

迭代对象不能取值,迭代器可以取值

迭代对象可以转化成迭代器

迭代器非常节省内存

迭代器每次只取一次值

迭代器是单向的,一条路走到头

s = 'kfdsjla'
iter1 = s.__iter__()
while 1:
    try:
        print(iter1.__next__())
    except StopIteration:
        break  

用while循环模拟出for循环 

 

 posted on 2018-08-20 20:38  beriuta  阅读(84)  评论(0编辑  收藏  举报