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

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

 def func():
  print("呵呵")
print(func)
结果:
<function func at 0x1101e4ea0> #函数名内存地址
 def func():
  print("呵呵")
print(func)
a = func # 把函数当成一个变量赋值给另一个变量
a() # 函数调用 func()
 #函数名可以当做容器类的元素
def func1():
3  print("呵呵")
def func2():
5  print("呵呵")
def func3():
  print("呵呵")
def func4():
print("呵呵")
lst = [func1, func2, func3]
for i in lst:
i()
 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() # 执⾏上⾯返回的函数

二、闭包

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

 def func1():
name = "alex"
def func2():
print(name) # 闭包
func2()
func1()
结果:
alex

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

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

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

 def outer():
name = "alex"
# 内部函数
def inner():
print(name)
return inner
fn = outer() # 访问外部函数, 获取到内部函数的函数地址
fn() # 访问内部函数

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

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

三、迭代器

  可以通过dir函数来查看类中定义好的所有⽅法,可以看到可以进⾏for循环的东⻄都有__iter__函数, 包括range也有。
  我们还可以通过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__函数. 那么我们认为这个对象遵守了可迭代协议. 就可以获取到相应的迭代器. 这⾥的__iter__是帮助我们获取到对象的迭代器. 我们使⽤迭代 器中的__next__()来获取到⼀个迭代器中的元素。

 s = "我爱北京天安门"
c = s.__iter__() # 获取迭代器
print(c.__next__()) # 使用迭代器进行迭代. 获取一个元素 我
print(c.__next__()) # 爱
print(c.__next__()) # 北
print(c.__next__()) # 京
print(c.__next__()) # 天
print(c.__next__()) # 安
print(c.__next__()) # 门
print(c.__next__()) # StopIteration

  for循环迭代实质

 li = [1,2,3,4,5,6,7,8,9,0]
it = li.__iter__()
while 1:
try:
print(it.__next__())
except StopIteration:
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. 使用Spring 简化MyBatis

    1.导入mybatis所有的jar 和 spring 基本包,spring-jdbc,spring-tx,spring-aop,spring整合mybatis的包等. 2.编写spring配置文件ap ...

  2. 【转】CentOS 7 安装配置 NFS

    环境 nps 192.168.1.97 client 192.168.1.98 一.yum 安装 yum -y install nfs-utils rpcbind nfs 的配置文件 /etc/exp ...

  3. windows下如何修改mysql的端口号

  4. 2018.10.27 bzoj3209: 花神的数论题(数位dp)

    传送门 数位dpdpdp经典题. 题面已经暗示了我们按照二进制位来数位dpdpdp. 直接dpdpdp多少个数有111个111,222个111,333个111-, 然后快速幂算就行了. 于是我们枚举前 ...

  5. python报错ModelNotFoundError

    很可能是因为工作目录并不在sys.path中,系统无法默认的找到您的脚本文件,通过以下命令可以解决该问题: >>> import sys>>> sys.path.a ...

  6. yii2 控制器渲染

    render() : 渲染一个 视图名并使用一个 布局返回到渲染结果. renderPartial() : 渲染一个 视图名并且不使用布局. renderAjax() : 渲染一个 视图名并且不使用布 ...

  7. CentOS 7 / RHEL 7 运行单用户模式进行root的密码重置

    步骤一,开机时随便按下键盘,进入以下菜单 步骤二: 选择第一项,按e键进行修改 步骤三,定位到 ro(  linux 16 or linuxefi  ) 步骤四:把ro改成 “rw init=/sys ...

  8. [好文分享]MySQL 加锁处理分析

    原文转自:http://hedengcheng.com/?p=771 背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经 ...

  9. .net 根据网址生成静态页

    生成HTML页面代码 public int Htmls(int id) { ; string strHtmlContent = ""; HttpWebRequest request ...

  10. 把sublime text打造成python交互终端(windows和Ubuntu)

    作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7015958.html 把sublime text打造成python交互终端 ...