一、函数名(第一类对象)

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

  1. def func():
  2.   print("呵呵")
  3. print(func)
  4. 结果:
  5. <function func at 0x1101e4ea0> #函数名内存地址
  1. def func():
  2.   print("呵呵")
  3. print(func)
  4. a = func # 把函数当成一个变量赋值给另一个变量
  5. a() # 函数调用 func()
  1. #函数名可以当做容器类的元素
  2. def func1():
  3. 3  print("呵呵")
  4. def func2():
  5. 5  print("呵呵")
  6. def func3():
  7.   print("呵呵")
  8. def func4():
  9. print("呵呵")
  10. lst = [func1, func2, func3]
  11. for i in lst:
  12. i()
  1. def func():
  2.   print("吃了么")
  3. def func2(fn):
  4.   print("我是func2")
  5.   fn() # 执⾏传递过来的fn
  6.   print("我是func2")
  7. func2(func) # 把函数func当成参数传递给func2的参数fn.
  1. def func_1():
  2.   print("这⾥是函数1")
  3.   def func_2():
  4.     print("这⾥是函数2")
  5.   print("这⾥是函数1")
  6.   return func_2
  7. fn = func_1() # 执⾏函数1. 函数1返回的是函数2, 这时fn指向的就是上⾯函数2
  8. fn() # 执⾏上⾯返回的函数

二、闭包

  1、闭包是内层函数,对外层函数(非全局)的变量的引用。

  1. def func1():
  2. name = "alex"
  3. def func2():
  4. print(name) # 闭包
  5. func2()
  6. func1()
  7. 结果:
  8. alex

  2、__closure__来检测函数是否是闭包. 使⽤函数名.__closure__返回cell就是 闭包. 返回None就不是闭包。

  1. def func1():
  2.   name = "alex"
  3.   def func2():
  4.     print(name) # 闭包
  5.   func2()
  6. 6   print(func2.__closure__) # (<cell at 0x10c2e20a8: str object at0x10c3fc650>,)
  7. func1()

  3、函数外边调⽤内部函数

  1. def outer():
  2. name = "alex"
  3. # 内部函数
  4. def inner():
  5. print(name)
  6. return inner
  7. fn = outer() # 访问外部函数, 获取到内部函数的函数地址
  8. fn() # 访问内部函数

  python规定,如果你在内部函数中访问了外层函数中的变量。那么这个变量将不会消亡。 将会常驻在内存中。也就是说, 使⽤闭包, 可以保证外层函数中的变量在内存中常驻。

  1. from urllib.request import urlopen
  2. def but():
  3. content = urlopen("http://www.xiaohua100.cn/index.html").read()
  4. def get_content():
  5. return content
  6. return get_content
  7. fn = but() # 这个时候就开始加载校花100的内容
  8. # 后面需要用到这里面的内容就不需要在执行非常耗时的网络连接操作了
  9. content = fn() # 获取内容
  10. print(content)
  11. content2 = fn() # 重新获取内容
  12. print(content2)
  
  综上, 闭包的作⽤就是让⼀个变量能够常驻内存. 供后⾯的程序使⽤. 

三、迭代器

  可以通过dir函数来查看类中定义好的所有⽅法,可以看到可以进⾏for循环的东⻄都有__iter__函数, 包括range也有。
  我们还可以通过isinstence()函数来查 看⼀个对象是什么类型的。

  1. l = [1,2,3]
  2. l_iter = l.__iter__()
  3. from collections import Iterable
  4. from collections import Iterator
  5. print(isinstance(l,Iterable)) #True
  6. print(isinstance(l,Iterator)) #False
  7. print(isinstance(l_iter,Iterator)) #True
  8. print(isinstance(l_iter,Iterable)) #True

  综上. 我们可以确定. 如果对象中有__iter__函数. 那么我们认为这个对象遵守了可迭代协议. 就可以获取到相应的迭代器. 这⾥的__iter__是帮助我们获取到对象的迭代器. 我们使⽤迭代 器中的__next__()来获取到⼀个迭代器中的元素。

  1. s = "我爱北京天安门"
  2. c = s.__iter__() # 获取迭代器
  3. print(c.__next__()) # 使用迭代器进行迭代. 获取一个元素 我
  4. print(c.__next__()) # 爱
  5. print(c.__next__()) # 北
  6. print(c.__next__()) # 京
  7. print(c.__next__()) # 天
  8. print(c.__next__()) # 安
  9. print(c.__next__()) # 门
  10. print(c.__next__()) # StopIteration

  for循环迭代实质

  1. li = [1,2,3,4,5,6,7,8,9,0]
  2. it = li.__iter__()
  3. while 1:
  4. try:
  5. print(it.__next__())
  6. except StopIteration:
  7. break

总结:

  Iterable: 可迭代对象. 内部包含__iter__()函数
  Iterator: 迭代器. 内部包含__iter__() 同时包含__next__(). 
  迭代器的特点: 1. 节省内存. 2. 惰性机制 3. 不能反复, 只能向下执⾏. 
  我们可以把要迭代的内容当成⼦弹. 然后呢. 获取到迭代器__iter__(), 就把⼦弹都装在弹夹 中. 然后发射就是__next__()把每⼀个⼦弹(元素)打出来.也就是说, for循环的时候.                  开始的时候是__iter__()来获取迭代器. 后⾯每次获取元素都是通过__next__()来完成的. 当程序遇到 StopIteration将             结束循环. 

11_python_闭包迭代器的更多相关文章

  1. day11 第一类对象 闭包 迭代器

    今日主要内容: 1 . 第一类对象 -->函数名--> 变量名 2. 闭包 -->函数的嵌套 3. 迭代器 --> 固定的思想 for 循环 第一类对象  : 函数对象介意向变 ...

  2. Python_Mix*函数名的使用以及第一类对象,闭包,迭代器,for循环的内部机制

    一:函数名的应用(第一类对象) 函数名的命名规范和变量是一样的,函数名其实就是变量名, 0)函数名可以赋值给其他变量 def func(): #定义一个名为func的函数 print('my ange ...

  3. Day11--Python--函数名,闭包,迭代器

    通过 lst.__iter__()拿到lst.的迭代器 1.函数名第一类对象 函数名就是变量名 1.函数名可以像变量一样互相赋值. 2.可以作为函数的参数,进行传递 3.可以作为返回值返回 4.可以作 ...

  4. python 第一类对象 闭包 迭代器

    ########################总结########################### 1. 函数名 -> 第一类对象 函数名就是变量名. 函数可以赋值 函数可以作为集合类的 ...

  5. python摸爬滚打之day11----函数闭包,迭代器

    1.函数名 函数名就是一个变量名, 函数名存储的是该函数的内存地址.    函数名都可以进行哪些应用? 函数名可以赋值给其他的变量; 函数名可以作容器里的元素使用; 函数名可以当做形参传进另一函数; ...

  6. python --- 11 第一类对象 函数名 闭包 迭代器

    一 .函数名的运用    ①函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量 ②函数名是一个内存地址    ③ 函数名可以赋值给其他变量         ④函数名可以当做容器类 ...

  7. python记录_day11 闭包 迭代器

    一.第一类对象: 函数名是一个变量,可以当普通变量使用,但它又是一个特殊的变量,与括号配合可以执行函数. 函数名的运用 1.单独打印是一个内存地址 2.可以给其他变量赋值 3.可以作为容器类变量的元素 ...

  8. python之路---11 第一类对象 函数名 闭包 迭代器

    二十九. 1.函数名的运用    ①函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量 ②函数名是一个内存地址    ③ 函数名可以赋值给其他变量         ④函数名可以当 ...

  9. day10作业—(闭包迭代器递归)

    补充:一个星号的  打散和聚合 a, b , *c = [1,2, 1,4] print( a , b , *c) #1 2 1 4 print(a, b, c) #1 2 [1, 4] *c , = ...

随机推荐

  1. AOP 环绕通知 (Schema-base方式) 和 AspectJ方式在通知中获取切点的参数

    环绕通知(Schema- base方式) 1.把前置通知和后置通知都写到一个通知中,组成了环绕通知 2.实现步骤: 2.1 新建一个类实现 MethodInterceptor 接口 public cl ...

  2. 转--O2O刷单“黑市”折射下的泡沫#神作#

    “XX打车和XX用车这样的公司,太不真诚.从前补贴的是现金,现在补贴的都是各种券,还有各种使用上的规则,为什么要设置这么多的限制?反正都要花一样的钱,为什么不能痛快点?让用户体验好一点?” 说这个话的 ...

  3. 纯css实现蒙层loading效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. js正则 - 正则判断是否为数字与字母的混合

    function istrue(str){  var reg=/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i;  return reg.test(str); ...

  5. Mybatis-Plus 实战完整学习笔记(三)------导入MybatisPlus环境

    1.dao层接口引入 package com.baidu.www.mplus.mapper; import com.baidu.www.mplus.bean.Employee; import com. ...

  6. 第22章:MongoDB-聚合操作--聚合管道--$out

    ①$out $out:利用此操作可以将查询结果输出到指定的集合里面. ②范例:将投影的结果输出到集合里

  7. Jquery 单击_双击_鼠标经过_鼠标离开_背景样式变化

    列表页点击.鼠标经过离开背景变化 <script type="text/javascript"> $(function () { $("table tr&qu ...

  8. jquery取消事件冒泡的三种方法展示

    jquery取消事件冒泡的三种方法展示 html代码 <!doctype html> <html> <head> <meta charset="ut ...

  9. c#+web下载文件夹

    最近公司在做工程项目,实现文件夹下载. 网上找了很久,发现网上的代码都有相似的问题,不过最终还是让我找到了一个符合的项目. 工程: 进行项目文件夹下载功能分析,弄清楚文件夹下载的原理,提供的数据支持. ...

  10. CMake和静态库顺序

    目录 目录 1 前言 1 方法 1 附1:链接静态库的顺序问题 2 附2:再议GCC编译时的静态库依赖次顺问题 3 附3:gcc链接参数--whole-archive的作用 4 附4:让有些“-l”链 ...