python学习笔记day5(装饰器、迭代器、生成器、内置函数)

一.函数的有用信息

 1.首先我们看这样一个装饰器:

  

  可以看到我们用login.__doc__就把函数的有用信息打印出来了,注意此时并没有用装饰器,接下来我们把装饰器加上实验:

  

  很明显,当加上装饰器的时候,原函数的函数说明就无法调用的到,只能调用到装饰器的函数说明,那如果我们想要调用到,该怎么办呢?,py的一个模块提供了一个方法:

  

  可以看到,这样就调用到了被装饰函数的函数说明啦。

二.装饰器的升级

  1.带参数的装饰器,我们先看如下函数:

  

  如上是三个函数,我们用了一个装饰器进行装饰,假设有这样一个场景,我们有500个函数需要装饰,ok,有的同学可能会说,那就写500遍@wrapper就行了,等你写完我又不想用他装饰了,那是不是还要在删500次呢,这样看来是不是太复杂了呢,接下来我们引入一个带参数的装饰器解决这个问题,一步轻松搞定!

  

  此时我们的flog变量设置的是True,就是启用装饰器,接下来设为False,看下结果:

  

  这是不是就是一步就搞定了呢,不用在来回删除增加啦,这里简单分析下:

  在外层加了一个timmer(flog)的函数,装饰器函数形式为:@timmer(flog),首先将@和timmer(flog)拆分,先计算timmer(flog),执行timmer函数,将flog的值赋值给flog1,然后执行函数返回wrapper,此时在于@结合成@wrapper,这就与之前的装饰器调用形式一样了,接下来继续执行程序,判断flog1的值,为True就进行装饰,为Falase就不装饰。

 2.多个装饰器装饰一个函数,首先看下面的例子:

  

  想一想为什么会打印出这样的结果呢?接下来一步步来分析:

  首先我们知道函数最近的装饰器先执行,这里先执行wrapper1这个装饰器,fun = wrapper1(fun),里面的fun是函数名,外面的fun是inner1.接下来执行wrapper2这个装饰器,fun=wrapper2(fun),执行完毕,里面的fun是inner1,外面的fun是inner2,接下来在执行wrapper3这个装饰器,fun=wrapper3(fun),执行完毕,里面的fun是inner2,外面的fun是inner3.这时,所有的装饰器已经循环完毕,首先会打印inner3的装饰器:打印before wrapper3,然后是inner2(),打印before wrapper2,然后是inner1(),打印before wrapper1,接下来就是执行fun函数打印666666666,打印完毕依次返回打印after wrapper1,after wrapper2,after wrapper3,然后程序结束。

三.迭代器

  1.什么是可迭代对象?类似于for循环遍历这种:

  

  以上是字符串的循环,接下来看下整形数据的:

  

  可以看到int类型是不可迭代的。

  str, list tuple dict set range 文件句柄都是可迭代对象
       该对象中,含有__iter__方法的就是可迭代对象,遵循可迭代协议

  

  判断该对象是不是可迭代对象的两种方法:

  (1):判断是否含有__iter__方法:

  

  (2).利用isinstance方法进行判断:

      

  2.迭代器:

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

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

  

  判断该对象是不是迭代器的两种方法:

  (1).判断是否含有__next__方法:

  

  (2).利用isinstance方法:

  

  迭代器的好处:节省内存、惰性机制、单向执行,不可逆。

  用while取值迭代器案例:

  

四.生成器:

 1.生成器本质就是迭代器,他是自定义的迭代器(自己用python代码写的迭代器),生成器的关键词是yield,下面利用函数的方式构建一个生成器:

  

  凡是函数中有yield关键词就是生成器。

  

  可以看出,每执行一个next就对应一个yield,也就是只执行一个yield.

   小案例:批量产出

   

  send和next都是对生成器取值,

  send会给上一个yield发送一个值

  send不能用在第一次取值

  最后一个yield不能得到值

  

五.生成器表达式,列表推导式

 1.生成器表达式的基本语法:

  [变量(加工后的变量) for 变量 in iterable] 遍历模式

  

  打印30以内能被3整除的数:

  

 2.列表生成式:

  # 列表推导式:简单,一行搞定。
  # 特别复杂的数据列表推导式无法实现,只能用其他方式实现。
  # 列表推导式不能排错。
  # 列表推导式与生成器表达式区别
  # 1 ,列推直观能看出,但是占内存
  # 2,生成器表达式不易看出,但是节省内存。

  案例练习:

  (1).构建列表: 十以内的所有的元素的平方。

  

 (2).30以内所有能被3整除的数的平方

  

 (3).[3,6,9] 组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]

  

 (4):

     

  答案如下:

  

 六.内置函数(用过的不在说明,这里只说下没有用到的)

  1.eval、和exec的用法

  

  2.输入输出相关

  

  

  此时会重新打开一个文件句柄,将文件写入:

  

  3.hash:获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值

  

   4.id:用于获取对象的内存地址:

  

   5.callable:函数用于检查一个对象是否是可调用的。如果返回True,object仍然可能调用失败,但如果返回False,调用对象ojbect绝对不会成功

  

   6.基础类型相关的:

  (1)bool :用于将给定参数转换为布尔类型,如果没有参数,返回 False。

  (2)int:函数用于将一个字符串或数字转换为整型。

  (3)float:函数用于将整数和字符串转换成浮点数。

  (4)complex:函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。 如果第一个参数为字符串,则不需要指定第二个参数。(不常用)

  

  7.进制转换:

  (1)bin:将十进制转换为二进制并返回

  (2)oct:将十进制转化成八进制字符串并返回

  (3)hex:将十进制转化成十六进制字符串并返回

  

  8.数学运算

  (1)abs:函数返回数字的绝对值

  (2)divmod:计算除数与被除数的结果,返回一个包含商和余数的元组(a // b, a % b)

  (3)round:保留浮点数的小数位数,默认保留整数

  (4)pow:求x**y次幂。(三个参数为x**y的结果对z取余)

  (5)sum:对可迭代对象进行求和计算(可设置初始值)

  (6)min:返回可迭代对象的最小值(可加key,key为函数名通过函数的规则,返回最小值)

  (7)max:返回可迭代对象的最大值(可加key,key为函数名,通过函数的规则,返回最大值)

  (8)reversed:将一个序列翻转,并返回此翻转序列的迭代器

  

  9.slice:构造一个切片对象,用于列表的切片

  

  10.format 科学计算(不常用)

  

  11.bytes 将unicode 转化成bytes

  

  12.chr: 输入位置数字找出其对应的字符

  

  13.ascli:是ascii码中的返回该值,不是就返回/u

  

  14.repr:返回一个对象的string形式(原形毕露)

  

  15.sorted:对所有可迭代的对象进行排序操作

  

  16.enumerate:枚举,返回一个枚举对象

  

  17.all 和 any

  (1)all:可迭代对象中,全都是True才是True

  (2)any:可迭代对象中,有一个True 就是True

  

  18.zip:拉链方法

  

  19.map:会根据提供的函数对指定序列做映射。返回的是迭代器

  

七.匿名函数(lambda)

  

  接下来用lambda进行定义:

  

  

  小案例:

  

 

posted @ 2018-06-07 17:37  淋汐去水  阅读(112)  评论(0)    收藏  举报