函数名的应用

1:函数名的应用

  1.函数名就是函数的内存地址。

def func():
    pass
print(func)

  2.函数名可以作为变量

def num():
    def num1():
        print(33)
    num1()
f1 = num
f1()

  3.函数名可以作为参数:

def num():
    print(123)
def num1(x):
    x()
m = num
num1(m)

  4.函数命可以作为返回值。

def num():
    print('我运行')
def inner(x):
        print('233')
        return x
s = inner(num())

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

  

def num1():
    print('111')
def num2():
    print('222')
def num3():
    print('333')
def num4():
    print('444')
l = [num1,num2,num3,num4]
for i in l:
    i()

 

2:globals(),locals()

  globals()返回全局变量中的一个,locals()返回局部变量中的一个字典

  

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

3.闭包

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

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

  2.闭包的作用:当程序执行时遇到函数,会在内存空间开辟一个局部命名空间,如果这个函数形成了闭包,它不会随着函数结束而关闭。

如,网页爬取时,形成闭包,那么爬取的数据一直都是使用同一个局部空间,从而节省内存。

 

4.可迭代对象:

  1.对象内部含有__iter__方法的就是可迭代对象。可迭代对象满足可迭代协议。

  2.可迭代对象:tuple,str,dict,list.range

  3.判断一个对象是否可迭代。

       

s1 = 'asdf'  #方法1
dic = {'name':'黎明'}
print('__iter__' in dir(s1))
print('__iter__' in dir(dic))

5.迭代器: 

  1.什么是迭代器:对象内部含有__iter__ 切含有  __next__方法的就是迭代器。

  

f = [1,2,3,45,6,7]
f1  = f.__iter__()
print('__iter__' in dir(f1))
print('__next__' in dir(f1))

  2.
        可迭代对象vs迭代器
可迭代对象不能取值,迭代器是可以取值的。
可迭代对象 --->(转化成)迭代器
  
# lis = [1,2,3,4]
# # lis1 = lis.__iter__()  #可迭代对象转化为迭代器,方法1
# lis1 = iter(lis)  #可迭代对象转化为迭代器,方法2
# print('__iter__' in dir(lis))
# print('__next__' in dir(lis))
# print('__iter__' in dir(lis1))
# print('__next__' in dir(lis1))

  3 迭代器如何取值? next一次,取一个值

    

print(ite1.__next__())
print(ite1.__next__())
print(ite1.__next__())
print(ite1.__next__())

  4.

    1.可迭代对象不能取值,迭代器是可以取值的。

    2.迭代器是非常节省内存。

    3.迭代器每次只会取一个值

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

  5.

    1.将可迭代对象转化成迭代器。

    2.调用__next__方法取值

    3.利用异常处理停止报错

iter1 = s1.__iter__()
while 1:
    try:
        print(iter1.__next__())
    except StopIteration:
        break

  


  

  

posted @ 2018-08-17 20:45  俏如來  阅读(143)  评论(0编辑  收藏  举报