zoukankan      html  css  js  c++  java
  • 函数名, 闭包, 迭代器

    一. 函数名

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

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

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

    函数名可以存在列表中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__()只能一次迭代一个

  • 相关阅读:
    服务器端接受Json数据的绑定实现
    SQL 学习笔记
    asp.net mvc下的多语言方案 包含Html,Javascript和图片
    设计和创建自己的Sharepoint Site
    SharePoint类库简要总结
    TED-谷歌创始人演示谷歌眼睛
    为什么要有战争
    跨云应用部署:共享数据存储
    使用VNET-to-VNET连接Microsoft Azure国际版和中国版
    MySQL Database on Azure新功能
  • 原文地址:https://www.cnblogs.com/NachoLau/p/9456722.html
Copyright © 2011-2022 走看看