函数名的本质

函数名本质上就是函数的内存地址

函数名的五种运用:

 1、函数名是一个变量

  1. def func():
  2. print(666)
  3. print(func) # 函数的内存地址 <function func at 0x000002B6D2559AE8>

2、函数名可以当做变量赋值

  1. def func():
  2. print(666)
  3. f1 = func
  4. f2 = f1
  5. f2()

3、函数名可以当做容器类数据类型的元素

  1. def func1():
  2. print(111)
  3. def func2():
  4. print(222)
  5. def func3():
  6. print(333)
  7. l1 = [func1, func2 ,func3]
  8. for i in l1:
  9. i()

4、函数名可以当做函数的参数

  1. def func(x): # x == func1
  2. x()
  3. print('in func')
  4. def func1():
  5. print('in func1')
  6. func(func1)

5、函数名可以当做函数的返回值

  1. def func(x): # x ---> func1
  2. return x # func1
  3.  
  4. def func1():
  5. print('in func1')
  6.  
  7. ret = func(func1) # ret = func1
  8. ret() # func1()
  9. func(func1)() # x() == func1()

满足3,4,5 函数名也称为第一类对象

闭包:

什么是闭包:

  1. def func():
  2. name = 666
  3. print(111)
  4. def func1():
  5. print(name) # 这就是闭包, 内层函数对外层函数(非全局)变量的引用
  6. func1()
  7. func()
  1. 1,内层函数对外层函数(非全局)变量的引用。
    2,闭包只存在于内层函数中。
    3,函数都要逐层返回,最终返回给最外层函数。
  1. def func():
  2. name = 'alex'
  3. def inner():
  4. print(name)
  5. return inner
  6. f = func() # f = inner
  7. f()

闭包的判断

  1. f.__closure__[0].cell_contents 闭包引用的外部变量
  1. def func():
  2. name = 'alex'
  3. age = 19
  4. def inner():
  5. print(name)
  6. print(age)
  7. return inner
  8. f = func() # 定义f,因为f是闭包
  9. # 获取闭包引用的外层变量,如果不是闭包则报错
  10. print(f.__closure__[0].cell_contents) #固定用法 19
  11. print(f.__closure__[1].cell_contents) # alex

闭包有什么用?

闭包:解释器执行程序时,如果遇到函数,随着函数的结束而关闭临时名称空间,但是!!!如果遇到闭包,有一个机制:那么闭包的空间不会随着函数的结束而关闭。

  1. def wrapper(step):
  2. num =1
  3. def inner():
  4. nonlocal num
  5. num += step
  6. print(num) # 输出 4 7 10 13 16
  7. return inner
  8. f = wrapper(3)
  9. j = 0
  10. while j < 5:
  11. f()
  12. j += 1

  1. 闭包就是在内存中开一个空间,常贮存一些内容,以便后续程序调用
  1. 闭包的应用:
    1、装饰器
    2、爬虫
  2.  
  3. 迭代对象:
  1. iterable: 可迭代对象
  1. 内部含有__iter__方法的就是可迭代对象,遵循可迭代协议
  1. s1 = 'barry'
  2. l1 = [1, 2, 3]
  3. print('__iter__' in dir(s1)) # True 是可迭代对象

可迭代对象不能直接取值(含索引的迭代对象除外) ,需要转换成迭代器才能取值

迭代器

迭代器:内部含有'__iter__'并且含有'__next__'方法的就是迭代器,遵循迭代器协议。

可迭代对象转换成迭代器:

  可迭代对象.__iter__()

  obj = iter(可迭代对象)

判断一个一个对象是否是迭代器(含iter,next)或迭代对象

 方法一:  看__iter__ , __next__  在不在dir() 里面

  1. s1 = 'abcdefg'
  2. obj = iter(s1) # 将s1转换成迭代器
  3. print('__iter__' in dir(s1)) # True
  4. print('__iter__' in dir(obj)) # True
  5. print('__iter__' in dir(s1) and '__next__' in dir(s1)) # False
  6. print('__iter__' in dir(obj) and '__next__' in dir(obj)) # True
  1. 方法二: isinstance(obj, Iterable/Iterator)
  1. s1 = 'abcdefg'
  2. obj = iter(s1) # 将s1转换成迭代器
  3. from collections import Iterable # 迭代对象
  4. from collections import Iterator # 迭代器
  5. print(isinstance(obj,Iterator)) # 判断obj是否为迭代器 True
  6. print(isinstance(obj,Iterable)) # 判断obj是否为可迭代对象 True
  7. print(isinstance(s1,Iterator)) # 判断obj是否为迭代器 False
  8. print(isinstance(s1,Iterable)) # 判断obj是否为可迭代对象 True
  1.  

迭代器取值

  1. s2 = [1, 2, 3]
  2. obj = iter(s2)
  3. print(obj.__next__()) # 方法一
  4. print(next(obj)) # 方法二
  1. type() isinstance()区别?

    # type()只是判断该对象的数据类型
    # isinstance()不仅可以判断该对象的数据类型,而且可以判断其他很多
  2.  
  3. 迭代器的作用:
    1、节省内存
    2、惰性机制 netx())一下,出一个值
    3、一条路走到黑,不走回头路
  4.  
  5. While循环模拟for循环机制
  1. l1 = [i for i in range(10)]
  2. obj = iter(l1)
  3. while 1:
  4. try: # 试一试,如果报错就执行下面的命令
  5. print(next(obj))
  6. except StopIteration:
  7. break
  1.  
  1.  

  

day 10 函数名的运用,闭包,迭代器的更多相关文章

  1. day12 python函数名的应用 闭包 迭代器

    day12 python   一.函数名的应用(是第一类对象)     函数名的命名规范和变量是一样的     函数名其实就是变量名 def func():     print('i am funct ...

  2. 【学习笔记】--- 老男孩学Python,day12 函数名的应用,闭包,迭代器

    1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 1.赋值 def func(): print("你吃了么?") # print(func) # a = func # ...

  3. day 12 函数名的应用 闭包 迭代器

    今日主要内容 1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用   #再函数名后面添加() 才是对函数的调用, 否则打印的是函数的内存地址 1.赋值 2.作为list元素 3.作为参数 d ...

  4. 11.Python初窥门径(函数名,可迭代对象,迭代器)

    Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...

  5. python基础之函数名的使用,闭包以及迭代器

    内容梗概: 1. 函数名的使⽤用以及第⼀一类对象 2. 闭包 3. 迭代器 1.函数名一. 函数名的运⽤.函数名是一个变量, 但它是⼀个特殊的变量, 与括号配合可以执行函数的变量.1.1 函数名的内存 ...

  6. python--函数名的使用,闭包,迭代器

    1.函数名的使用和第一类对象 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数 函数对象可以像变量一样进行赋值,还可以作为列表的元素进行使用,可以作为返回值返回,可以作为参数进行传递 1 ...

  7. python学习之生函数名的理解

    4.4.10 函数名的应用 函数名就是一个特殊的变量,后边跟上()之后可以执行函数: 1.作为一个变量使用 def func(): print('123') f1 = func f2 = f1 f1( ...

  8. Python函数二(函数名,闭包,迭代器)之杵臼之交

    函数名的使用: 函数名可以作为值,赋值给变量. 函数名可以作为参数传参给函数. 函数名可以作为返回值. 函数名可以作为元素存储在容器里. 闭包:在嵌套函数内,使用外层局部变量(非全局变量)就是一个闭包 ...

  9. Python基础之 函数名,闭包,和迭代器

    1.函数名作用 函数名本质上就是函数的内存地址或对象. 1.可以被引用 2.可以被当作容器类型的元素 3.可以当作函数的参数和返回值 4.如果记不住的话,那就记住一句话,就当普通变量用 2.闭包 什么 ...

随机推荐

  1. [Redis]Redis的快速配置使用(图)

    --------------------------------------------------------------------------------------------------- ...

  2. git工作操作步骤

    上班开始,打开电脑,git pull:拉取git上最新的代码: 编辑代码,准备提交时,git stash:将自己编辑的代码暂存起来,防止git pull时与库中的代码起冲突,否则自己的代码就白敲了: ...

  3. HTML5的新标签之一的Canvas

    一. <canvas>简介(了解) 1. 什么是canvas: 是HTML5提供的一种新标签 <canvas></canvas>  英 ['kænvəs]  美 [ ...

  4. django中使用mysql数据库的事务

    django中怎么使用mysql数据库的事务   Mysql数据库事务: 在进行后端业务开始操作修改数据库时,可能会涉及到多张表的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起 ...

  5. tomcat修改上下文path

    server.xml <Host name="localhost" appBase="webapps" unpackWARs="true&quo ...

  6. JUC(java.util.concurrent)

    在 Java 5.0 提供了 java.util.concurrent (简称JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池.异步 IO 和轻 ...

  7. java 递归 树形

    //菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { JSONArray childMenu = new ...

  8. CentOS上开启MySQL远程访问权限

    在CentOS上安装完MySQL后,默认不开始远程访问控制.可以进行如下设定开启. 登录MySQL: mysql -uroot -p 如需修改密码,第一次: mysqladmin -u root pa ...

  9. Signed Distance Field Technique

    [Distance Field Technique] 一种小纹理高清放大的技术. A distance field is generated from a high resolution image, ...

  10. VSC KeyNote

    [VSC KeyNote] 1.前后跳转. Alt + LeftArrow, Alt + RightArrow 2.缩进问题. vsc默认缩进为4,但js代码里缩进依旧是2. 因为vscode默认启用 ...