zoukankan      html  css  js  c++  java
  • day 11 前方高能-迭代器

    第一类对象 -----函数名  == 变量名
    函数对象可以像变量一样进行赋值
    还可以作为列表的元素进行使用
    可以作为返回值返回
    def wrapper():
        def inner():
            print("哈哈哈")
        return inner  # 函数名可以像返回值一样返回
     
    ret = wrapper()
    ret() # 在函数外面访问了函数内部的函数
    函数可以进行参数进行传递
    def func1():
        print("朱祁镇")
     
    def func2():
        print("徐阶")
     
    def func3():
        print("王阳明")
     
    def func4():
        print("魏忠贤")
     
    lst = [func1, func2, func3, func4] # 函数+() 就是调用.
    print(lst)    ###function func2 at 0x000001A53FB298C8>, <function func3 at 0x000001A53FB29950>, <function func4 at 0x000001A53FB299D    是一个内存地址
    lst = [func1(), func2(), func3(), func4()]     ##函数是调用的,没有retrun返回的是None
    print(lst)
    ###朱祁镇
    徐阶
    王阳明
    魏忠贤
    [None, None, None, None]
    函数外面的访问了函数内部的函数
    def wrapper():
        def inner():
            print("哈哈哈")
        return inner   ###函数名可以像返回值一样返回
    ret = wrapper()
    ret()  ##在函数外面方位了函数内部的函数
    闭包------函数的嵌套
          内层函数中使用外层函数的变量
    优点:1.保护变量不被其他人侵害
             2.保持一个变量常驻内存
    超级简易版爬虫
    from urllib.request import urlopen # 导入一个模块
    # 干掉数字签名
    import ssl
    ssl._create_default_https_context = ssl._create_unverified_context
     
     
    def func():
        # 获取到网页中的内容, 当网速很慢的时候. 反复的去打开这个网站. 很慢
        content = urlopen("https://www.dytt8.net/").read()
     
        def inner():
            return content.decode("gbk") # 网页内容
        return inner
     
    print("开始网络请求")
    ret = func() # 网络请求已经完毕
    print("网络请求完毕")
    print("第一次", ret()[5])   ret()就是return返回的值,调用inner函数
    print("第二次", ret()[5])
    如何查看一个是闭包
      __closure__ 有东西就是闭包,没有东西就不是闭包
    迭代器---固定的思路.for循环
    一个数据类型中包含了__iter__函数表示这个数据是可迭代的
    dir(数据): 返回这个数据可以执行的所有操作
    判断迭代器和可迭代对象的方案(野路子)
            __iter__            可迭代的
            __iter__  __next__  迭代器
    lst = ['贾樟柯', '利安', '杨德昌', '王家卫']
    it = lst.__iter__()
    print(it.__next__())
    print(it.__next__())
    print(it.__next__())
    print(it.__next__())
    print(it.__next__())    ###StopIteration    停止迭代
    #想回去
    it = lst.__iter__()     #只能重新获取迭代器
     判断迭代器和可迭代对象的方案(官方)
            from collections import Iterable, Iterator
            isinstance(对象, Iterable) 是否是可迭代的
            isinstance(对象, Iterator) 是否是迭代器
    官方通过代码判断是否是迭代器
    借助于两个模块 Iterator迭代器, Iterable可迭代的
    from collections import Iterable, Iterator
     
    lst = [1,2,3]
    # print(lst.__next__())
     
    print(isinstance(lst, Iterable)) # xxx是否是xxx类型的. True
    print(isinstance(lst, Iterator)) # False
     
    it = lst.__iter__()  # 迭代器一定可迭代,  可迭代的东西不一定是迭代器
     
    print(isinstance(it, Iterable)) # xxx是否是xxx类型的. True
    print(isinstance(it, Iterator)) # True
     
    for el in it:
        print(el)
    结束的时候给我们扔出来一个错误stopiteration
    模拟for循环
    lst= []
    # 拿迭代器
    it = lst.__iter__()    #获取迭代器
    while 1:
        try:     #尝试
            el = it.__next__()    #数据
            print(el)
        except StopIteration:    #####出错误,意味着数据拿完了
            break   #退出循环
    特征:
                1. 省内存(生成器)
                2. 惰性机制
                3. 只能向前. 不能后退
    整合所有的数据类型进行遍历(int,bool除外)
    想回去:只能重新获取迭代器
    print(dir(bool)) # 没有__iter__
    for i in True: # 'bool' object is not iterable
        print(i)
     
    print(dir(range))
    f = open("呵呵", mode="r", encoding="utf-8")
    print(dir(f))
     
    共性:所有带有__iter__的东西都可以进行for循环, 带有__iter__的东西就是可迭代对象
     
    lst = ["贾樟柯", "李安", "杨德昌", "王家卫"]
     
    # 1. 只能向下执行, 不能反复
    # 2. 结束的时候会给我们扔出来一个错误 StopIteration
    # 3. 整合所有的数据类型进行遍历(int,bool除外)
     
    # print("__iter__" in dir(lst))
    it = lst.__iter__()  # 拿到的是迭代器 <list_iterator object at 0x0000000001DCC160>
     
    print(it.__next__()) # 下一个
    print(it.__next__()) # 下一个
    print(it.__next__()) # 下一个
    print(it.__next__()) # 下一个
    # print(it.__next__()) # 下一个 # StopIteration 停止迭代
    # 想回去
    it = lst.__iter__() # 只能重新获取迭代器
     
    s = {"张无忌", "贾樟柯", "宝宝", "风扇哥", "门神"}
    it = s.__iter__()
    print(it.__next__())
    print(it.__next__())
    print(it.__next__())
    print(it.__next__())
    print(it.__next__())
     
  • 相关阅读:
    KlayGE 4.0功能规划
    Kinect for Windows SDK发布
    CENTOS下用syslogng集中管理日志并压缩保存
    Eclipse+Plugin
    struts2 获取request、session的方法
    ActiveMQ使用经验
    springmock + dbutil 用来测试数据库操作
    英语学习
    如何查看eclipse版本
    jQuery插件的开发
  • 原文地址:https://www.cnblogs.com/yanghongtao/p/10099103.html
Copyright © 2011-2022 走看看