函数名, 闭包, 迭代器

一. 函数名

函数名是一个特殊变量, 加了()可以执行函数. 

函数名的命名规范和变量是一样的. 

函数名可以赋值给其他变量, 其它变量加上()也可以运行函数, 其他变量也可以赋值给函数名, 打应函数名会输出其他变量名

 

函数名可以存在列表中lst = [func1, func2], 可作为参数传递给函数func1(func2), 作为函数的返回值return func2, 可以被重新赋值def func(): pass  func = 1 print(func) => 3. 

 

func()()先运行func()再在返回值上加()

 

 

二. 闭包

闭包: 在内层函数中访问外层函数的局部变量

好处: 保护变量不受外界影响, 可以让变量常驻内存

 

def outer():

    a = 10

    def inner():

        print(a)

    return inner

def outer():
    a = 10
    def inner():
        print(a)
        return 5
    return inner
a = 20
fun = outer() print(fun()) print(a) # 10 # 5 # 20

  

from urllib.request import urlopen

def outer():
    s = urlopen("http://www.xiaohua100.cn/index.html").read()
    def getContent():
        return s
    return getContent

print("爬取内容.....")

qwe = outer()

asd = 1
while 1:
    print(outer()())
    print(asd)
    asd += 1

  经过尝试: 在while1: print(outer()())时, 用第一层函数的变量s被爬虫爬取网页内容赋值时, 且在后面写了qwe = outer()时, 当拔取网线, 会停止输出. 判断为print(outer()())并没有用常驻内存的变量的值, 而是重新获取了变量的值. 与qwe = outer()    print(qwe())时, 直接使用常驻内存的fun = outer()的变量不同. print(outer()())每次运行都会每次都给s赋一次值, 而print(qwe())是执行函数里面的getContent, s的赋值已经在之前的qwe = outer()赋值完了, 执行print(qwe())时, 并没有再给s赋值. 

 

 

三.迭代器

使用dir来查看该数据包含了哪些方法

lst = []

print(dir(lst))

 

用来遍历列表, 字符串, 元组...可迭代对象

可迭代对象:    Iterable, 有__Iter__获取迭代器, 没有__next__

迭代器:           Iterator, 有__Iter__获取迭代器, 有__next__

 

特点:

只能向前

惰性机制

省内存

 

it = lst.__iter__()

while 1:

    try:

        data = it.__next__()

        print(data)

    except StopIteration:

        break

 

判断数据是否可迭代:

print('__iter__' in dir(lst.__iter__()))

print('__next__' in dir(lst.__iter__()))

官方方案:

from collections import Iterable # 可迭代对象

from collections import Iterator # 迭代器

print(isinstance(lst, Iterable))

print(isinstance(lst, Iterator))

print(isinstance(lst.__iter__(), Iterable))

print(isinstance(lst.__iter__(), Iterator))

 

lst.__iter__().__next__()只能一次迭代一个

posted @ 2018-08-10 18:16  NachoLau  阅读(123)  评论(0编辑  收藏  举报