• python 基础学习笔记(7)--迭送器


    **函数名的运用**

    - [ ] 函数名是一个变量, 但它是一个特殊的变量, 与括号配合可以执行函数的变量

    **函数名的内存地址**

    ```
      def func():
      print('666')
      print(func)
      ##结果<function func at 0x000001CAA4FCC1E0>
    ```
    **函数名可以赋值给其他变量**

    ```
      def func():
      print('666')
      a = func #将func的函数名赋值给a
      a() #a() = func()

      ##结果 666
    ```
    **函数名可以当作容器类的元素**

    ```
      def func1():
      print('666')
      def func2():
      print('555')
      def func3():
      print('444')
      def func4():
      print('333')
      func_list = [func1,func2,func3,func4]
      for item in func_list:
      item()

      ## 结果
      666
      555
      444
      333
    ```

    **函数名可以当作函数的参数**

    ```
      def func():
      print("吃了么")
      def func2(fn):
      print("我是func2")
      fn() # 执行传递过来的fn
      print("我是func2")
      func2(func) # 把函数func当成参数传递给func2的参数fn.
    ```
    **函数名可以作为函数的返回值**

    ```
      def func_1():
      print("这里是函数1")
      def func_2():
      print("这里是函数2")
      print("这里是函数1")
      return func_2
      fn = func_1()
      # 执行函数1. 函数1返回的是函数2, 这时fn指向的就是上面函数2
      fn() # 执行func_2函数
    ```
    **闭包**

    - [ ] 闭包就是内层函数,对外层函数(非全局)的变量的引用

    ```
      def func1():
      name = "张三"
      def func2():
      print(name)
      # 闭包
      func2()
      func1()
      # 结果: 张三
    ```
    **检测闭包**

    - [ ] 我们可以使用__closure__ 来检测函数是否是闭包. 使用函数名.__closure__返回cell就是
    闭包. 返回None就不是闭包

    ```
    def func1():
    name = "张三"
    def func2():
    print(name)
    func2()
    print(func2.__closure__)
    func1()
    结果:
    张三
    (<cell at 0x0000020077EFC378: str object at 0x00000200674DC340>,)
    ```
    **迭送器**

    - [ ] 迭代操作对象有 str, list, tuple, dic, set。

    ```
      s = 'abc'
      for i in s:
      print(i)
      结果:
      a
      b
      c
    错误的代码:
    for i in 123:
    print(i)
    结果
    Traceback (most recent call last):
    File "D:/python_object/二分法.py", line 62, in <module>
    for i in 123:
    TypeError: 'int' object is not iterable
    ```
    注意看报错信息,报错信息中有这样一句话: ‘int’ object is not iterable 翻译过来就是整数类型对象是不可迭代的.
    iterable表示可迭代的.表示可迭代协议 那么如何进行验证你的数据类型是否符合可迭代协议.我们可以通过dir函数来查看类中定义好的所有方法

    ```
    a = 'abc'
    print(dir(a)) # dir查看对象的方法和函数
    # 在打印结果中寻找__iter__ 如果存在就表示当前的这个类型是个可迭代对象
    ```
    这是查看一个对象是否是可迭代对象的第一种方法,我们还可以通过isinstence()函数来查看一个对象是什么类型的

    ```
    l = [1,2,3]
    l_iter = l.__iter__()
    from collections import Iterable
    from collections import Iterator
    print(isinstance(l,Iterable)) #True #查看是不是可迭代对象
    print(isinstance(l,Iterator)) #False #查看是不是迭代器
    print(isinstance(l_iter,Iterator)) #True
    print(isinstance(l_iter,Iterable)) #True
    ```

    通过上边的我们可以确定.如果对象中有__iter__函数,那么我们认为这个对象遵守了可迭代协议.就可以获取到相应的迭代器
    **总结**
    Iterable: 可迭代对象. 内部包含__iter__()函数

    ​ Iterator: 迭代器. 内部包含__iter__() 同时包含__next__().

    迭代器的特点:

    ​ 1. 节省内存.

    ​ 2. 惰性机制

    ​ 3. 不能反复, 只能向下执行.

    我们可以把要迭代的内容当成子弹. 然后呢. 获取到迭代器__iter__(), 就把子弹都装在弹夹中. 然后发射就是__next__()把每一个子弹(元素)打出来. 也就是说, for循环的时候.一开始的 时候是__iter__()来获取迭代器. 后面每次获取元素都是通过next()来完成的. 当程序遇到 StopIteration将结束循环.

  • 相关阅读:
    QT解决方案中新建动态链接库工程,且继承于QObject,解决无法生成moc_XXX.cpp文件的问题,解决工程之间的引用问题
    MATLAB Simulink中解算器的定步长和各模块采样时间之间的关系
    simulink使用MATLAB function的端口多出入多输出,输入输出向量设置
    simulink error:Error in default port dimensions function of S-function ‘XXXXXXXXXXX’. This function does not fully set the dimensions of output port 2.
    Git 问题:SSL certificate problem: self signed certificate
    git push失败:ssh:connect to host github.com port 22:Connection timed out
    戴尔笔记本插耳机听歌暂停后继续声音突然变大
    PDF阅读器和编辑器选择
    21天战拖记——Day15:填坑:行动任务项目的区别(2014-05-18)
    21天战拖记——Day14:如何养成一个习惯?(2014-05-17)
  • 原文地址:https://www.cnblogs.com/haoshaoqian/p/11257943.html
Copyright © 2020-2023  润新知