第十一天 函数名的使用以及第一类对象, 闭包, 迭代器

本节主要内容:

  1.函数名的使用以及第一类对象

  2.闭包

  3.迭代器

一.函数名的运用

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

1.函数名的内存地址:

    

2.函数名可以赋值给其他变量

  

3.函数名可以当作容器类的元素(作为list元素)

    

4.函数名可以当作函数的

  

5.函数名可以作为函数的返回值

  

二.闭包

什么是闭包:

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

  在内存函数中调用了外层函数的变量,叫闭包。可以让一个局部变量常驻内存

  

使用__closure__来检查函数是否是闭包

          函数名.__closure__返回cell就是闭包,返回None就不是闭包

   

如何在函数外面调用内部函数

  

闭包的好处

    由于我们在外界可以访问内部函数. 那这个时候内部函数访问的时间和时机就不?定了, 因为在外部, 我可以选择在任意的时间去访问内部函数. 这个时候. 想?想. 我们之前说过, 如果?个函数执行完毕. 则这个函数中的变量以及局部命名空间中的内容都将会被销毁. 在闭包中. 如果变量被销毁了. 那内部函数将不能正常执行所以. python规定. 如果你在内部函数中访问了外层函数中的变量. 那么这个变量将不会消亡.将会常驻在内存中. 也就是说. 使用闭包, 可以保证外层函数中的变量在内存中常驻.

多层嵌套,只需一层一层的往外层返回就行了

  

综上所述:

  闭包的作用就是让?个变量能够常驻内存. 供后面的程序使用

三.迭代器

      可迭代对象:ste , list, tuple, dict, set, range

  迭代器:f  (f是文件操作里的内容)

  错误代码:

  

  ‘int‘ object is not iterable . 翻译过来就是整数类型对象是不可迭代的.

  iterable表?可迭代的. 表?可迭代协议.

  可迭代对象:str, list, dict, tuple, set, f

  所有的以上类型中都有一个函数 __iter__(), 所有包含了__iter__()的数据类型都是可迭代的数据类型Iterable

  dir() 来查看一个对象,数据类型中包含了哪些定义好的方法

   

  在打印的结果中,如果存在__iter__则说明这个类的对象是一个可迭代对象。

  str, list , tuple, dic, set, 都有__iter__函数包括 f , range也有。

  如果对象中有__iter__函数,则认为这个对象遵守了可迭代协议,就可以获得相应的迭代器。

  __iter__是帮助我们获取到对象的迭代器. 使用迭代器中的__next__()来获取到一个迭代器中的元素.

  

使用while循环 + 迭代器来模拟for循环(必须掌握)

  

  我们可以把要迭代的内容当成子弹. 然后呢. 获取到迭代器__iter__(), 就把子弹都装在弹夹中.

然后发射就是__next__()把每一个子弹(元素)打出来. 也就是说, for循环的时候. 一开始的时候是__iter__()

来获取迭代器. 后?面每次获取元素都是通过__next__()来完成的. 当程序遇到StopIteration将结束循环.

isinstence() 函数

    另一种判断可迭代对象的方法,isinstence() 函数来查看一个对象是什么类型,其返回的值是,

  如果是可迭代对象返回True,不是则返回Fales

  

     

     

总结:

  Iterable: 可迭代对象. 内部包含__iter__()函数

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

  迭代器的特点:

      1. 节省内存.

      2. 惰性机制

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

  

原文地址:https://www.cnblogs.com/mwhylj/p/9332848.html

时间: 2024-10-09 10:00:43

第十一天 函数名的使用以及第一类对象, 闭包, 迭代器的相关文章

函数名的应用(第一对象) 闭包 装饰器

函数名的应用(第一对象). # 1,直接打印函数名得到的是函数的内存地址 <function func1 at 0x0000000002876B70> # print(func1) #2,函数名可以赋值运算. # def func1(): # print(666) # f1 = func1 # f1() # 3, 函数名可以作为函数的参数. # def func1(): # print(666) # # def func2(x): # x() # print(555) # func2(func

python之函数名,闭包、迭代器

一.函数名的运用(第一类对象) 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 1,函数名的内存地址: def func(): print("呵呵") print(func) # 结果为:<function func at 0x00000000029299D8> 打印出func的内存地址 2,函数名可以赋值给其他变量: def func(): print("呵呵") a = func # 把函数当成一个变量赋值给另一个变量 a()

python之函数闭包、可迭代对象和迭代器

一.函数名的应用 # 1,函数名就是函数的内存地址,而函数名()则是运行这个函数. def func(): return print(func) # 返回一个地址 # 2,函数名可以作为变量. def func1(): print(666) f1 = func1 f2 = f1 f2() # 就等于func1() 此时执行函数 # 3,函数名可以作为函数的参数. def func1(): print(666) def func2(x): x() func2(func1) # 输出666 func

函数是对象,函数名值指针

如题,函数与函数名的关系就和对象与对象指针关系是一样的,如何理解呢? function sum(a,b){ return a+b; } 上述代码定义了一个名为sum的函数,其函数名sum与函数主体的关系如下: 和对象与对象指针的关系一样,一个函数可以有多个名字. function sum(a,b){ return a+b; } alert(sum(10,10));//20 var anotherSum = sum; alert(anotherSum(10,10));//20 上述代码将函数指针s

在C语言中以编程的方式获取函数名

调试常用的 __FILE__, __FUNCTION__, __LINE__ 调试常用的 __FILE__, __FUNCTION__, __LINE__ 没想到 VC6 不支持 __FUNCTION__ 所以我写了如下的奇怪代码 //用来记录当前行和当前函数//也可说是记录 堆栈void log_stack(const char *file, int line, const char * function); //当然还要对 __FUNCTION__ 宏作点修饰,因为这个宏只是在函数里面才起作

DAY11 函数进阶(函数名的本质,闭包,迭代器)

函数名的本质与一级对象: 1.函数名表示函数的内存地址. 2.函数名可以赋值给变量,可以作为容器数据类型的元素. 3.函数名可以作为参数传递给函数. 4.函数名可以作为函数的返回值. #一. 函数名表示函数的内存地址 def func(): print(111) print(func) >>><function func at 0x00000199DFD22F28> #二.函数名可以赋值给变量,可以作为容器数据类型的元素. def func(): print(111) f =

函数定义,返回值,传参,命名空间,闭包

函数的返回值: return是返回给函数的调用者 函数外面的代码想要获取函数的执行结果,就可以在函数里,用return语句把结果返回. 注意:在函数的执行过程中主要遇到return语句,就会停止执行并返回结果, so可以理解为return语句代表着函数的结束 如果未在函数中指定return,那这个函数的返回值为none 函数的返回值,可以返回一个函数名(可以将嵌套函数里的执行结果return给函数体外,进行执行) return永远且只能返回一个值,,如果返回多各值呢? def func1(nam

C++ DLL导出函数的两种方法(导出序号那种方法,别人看不到函数名)

第一种就直接导出函数名如下代码: #ifdef__cplusplus #define TEXPORT extern "c" _declspec(dllexport) #dlse #define TEXPORT _declspec(dllexport) TEXPORT BOOL FUN();//这就是要导出函数 这种方法查看DLL时能看到函数名. 第二种是就导出序号如下代码: bool _stdcall fun(); 在工程右键添加新项目点模块定义文件.DEF, 在在DEF文件里写 LI

SQL SERVER修改函数名引起的问题

1. 问题 今天遇到一个奇怪的问题:使用sp_helptext XXX查询出来的函数定义名竟然跟函数名不同,而sp_helptext实际是查询sys.all_sql_modules这个系统视图的.直接查询这个视图的definition字段,发现跟sp_helptext是一样的.难道是系统视图也存在缓存之类的机制?或者是个BUG?对于第一个问题,当时情况紧急,没有时间去求证是否存在了.第二个问题,我想没什么可能,SQL SERVER发展到今天(SQL 2016正式版准备推出,我使用的环境则是SQL