• 闭包,迭代对象与迭代器


    闭包
    内层函数对外层函数的变量(非全局变量)的引用,并返回函数名就形成了闭包。
     1 def packet():
     2     name = '孙飞'
     3     def inner():
     4         print(name)
     5         print(inner.__closure__)    #判断是否是闭包,如果是闭包对象则返回一个cell
     6     return inner
     7 f1 = packet()
     8 f1()
     9 
    10 name = 'alex'   #全局变量
    11 def wraaper():
    12     def inner():
    13         print(name)
    14     print(inner.__closure__)  # None,非闭包
    15     inner()
    16     return inner
    17 wraaper()
    闭包作用:
    当程序执行时,遇到了函数执行,他会在内存中开辟一个空间,局部名称空间,
    如果这个函数内部形成了闭包,
    那么他就不会随着函数的结束而消失。

    可迭代对象
    1 for i in 'abc':
    2     print(i)
    3 for i in 123:
    4     print(i)  # 'int' object is not iterable
    对象内部含有__iter__方法就是可迭代对象.
    可迭代对象满足可迭代协议。

    可迭代对象:str list dict,tuple,set,range()
    str= 'abddef'
    print(dir(str))
    Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案。

    __dict__与dir()的区别:

    dir()是一个函数,返回的是list;
    __dict__是一个字典,键为属性名,值为属性值;
    dir()用来寻找一个对象的所有属性,包括__dict__中的属性,__dict__是dir()的子集;
    ​ 并不是所有对象都拥有__dict__属性。许多内建类型就没有__dict__属性,如list,此时就需要用dir()来列出对象的所有属性。
    判断一个对象是否是可迭代对象:
    第一个方法
    1 dic = {'name':'alex'}
    2 print('__iter__' in dir(s1))
    3 print('__iter__' in dir(dic))
    第二种方法
    1 from collections import Iterable    #注意前面的iterable和iterator首字母要大写I
    2 from collections import Iterator
    3 
    4 print(isinstance('alex',Iterable))  # True
    5 print(isinstance('alex',Iterator))  # True
    6 print(isinstance('alex',str))
    7 isinstance是Python中的一个内建函数
    语法:
    isinstance(object, classinfo)

    如果参数object是classinfo的实例,或者object是classinfo类的子类的一个实例, 返回True。如果object不是一个给定类型的的对象, 则返回结果总是False。
    如果classinfo不表示一个类(类型对象), 那么它要么是一个类的元组, 或者递归地包含这样的(由数据类型构成的)元组.其他的序列类型是不被允许的。
    如果classinfo不是一种数据类型或者由数据类型构成的元组,将引发一个TypeError异常。

    举例:
    >> > isinstance(1, int)
    True
    >> > isinstance(1.0, float)
    True

    迭代器?

    对象内部含有__iter__方法且含有__next__方法就是迭代器.
    1 f = open('register', encoding='utf-8')
    2 print('__iter__' in dir(f))
    3 print('__next__' in dir(f))
    4 print('__iter__' in dir(dict))
    5 print('__next__' in dir(dict))
    可迭代对象vs迭代器
    可迭代对象不能取值,迭代器是可以取值的。
    可迭代对象 --->(转化成)迭代器
    lis = [1, 2, 3]  # 可迭代对象# ite1 = lis.__iter__()  # 迭代器  #<list_iterator object at 0x0000027A183BFFD0>
    ite1 = iter(lis)  # 迭代器  <list_iterator object at 0x0000027A183BFFD0>
    print(ite1)

    迭代器如何取值? next一次,取一个值
    1 print(ite1.__next__())
    2 print(ite1.__next__())
    3 print(ite1.__next__())
    4 print(ite1.__next__())
    1, 可迭代对象不能取值,迭代器是可以取值的。
    2, 迭代器非常节省内存。
    3,迭代器每次只会取一个值。
    4,,迭代器单向的,一条路走到头。
    1 s1 = 'kfdsjl'
    2 for i in s1:
    3     print(i)

    1,将可迭代对象转化成迭代器。
    2,调用__next__方法取值。
    3,利用异常处理停止报错。

    用while模拟for遍历对象的过程
    1 iter1 = s1.__iter__()
    2 while 1:
    3     try:
    4         print(iter1.__next__())
    5     except StopIteration:
    6         break
    1 l1 = [i for i in range(100)]
    2 print(l1)
    3 ret =( i for i in range(1000000))
    4 print(ret.__next__())
    5 print(ret.__next__())
    6 print(ret.__next__())
    7 print(ret.__next__())
    8 print(ret.__next__())
  • 相关阅读:
    web前端笔记1
    前端与后台交互所需技术
    js的HTML属性操作
    浮动塌陷
    前端与后端的交互(定义接口)
    AjAX(第3章 Ajax的简单例子(Ajax+PHP)
    AjAX(简单概要介绍)
    Bootstrap 学习之js插件(折叠(collapse)插件)
    Net core 项目 EF CodeFist 多重外键约束问题
    对VS 2017中ASP.NET Core项目解决:Add-Migration : 无法将“Add-Migration”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
  • 原文地址:https://www.cnblogs.com/qilin610/p/9519544.html
Copyright © 2020-2023  润新知