装饰器

装饰器:

  从名字上来看,装饰器就是用来装饰内容的一个工具.本质上是一个闭包

  在开发中,装饰器必须要遵守开放封闭原则:对扩展开放,对修改源代码封闭.

  在装饰器中,有一个很重要的工具就是@,称之为语法糖,语法糖的本质就是:被装饰的函数名 = 装饰器的名字(被装饰的函数名)

  在装饰器的应用上,有一个很简单的例子

计算简易的函数运行时间

import time                  # 导入time模块
print(time.time())              # 获取时间戳
start_time = time.time()          # 开始时间
def foo():                   # 定义函数foo
    time.sleep()               # 可以自己定义睡眠时间
    print(100)      
foo()                       # 调用函数foo
end_time = time.time()            # 结束时间
在这时,函数的运行时间为end_time-start_time

接一个比较规范的写法:

import time                     1,导入time模块 
def func(x):                   2,定义func函数,此时必须有形参
    def wapper():                5,定义wapper函数
        start_time = time.time()       9,
        x()                   10,这儿的x是foo的内存地址,加括号是调用foo函数
        end_time = time.time()        12,
        print(start_time - end_time)     13,
    return wapper                6,将wapper函数的内存地址返回给调用者func
def foo():                    3,定义foo函数
    print("今天周二")              11,执行print
foo = func(foo)                 4,等号右边,将foo的内存地址传给了func函数的x
                          7,等号左边,将wapper的内存地址赋给了foo,
foo()                      8,调用wapper函数

 现在用一个装饰器来写:

def func(x):                
    def wapper(*args,**kwargs):
        x(*args,kwargs)
    return wapper
@func                      @加装饰器的名字,就相当于:inner = func(inner)
def inner(*args,**kwargs):
    print(*args)
inner()                    ps:这是最简单的一种装饰器

 

内置函数,

    python中提供的一些工具,我们可以直接拿过来用,我们知道,在python中有68个内置函数.在之前已经接触过input,print,id,globals,locals等几个函数;

  今天来继续学习一些内置函数,在目前所学的知识中,比较重要的函数,主要有enumerate,lambda,sorted,filter,map,zip,reduce

enumerate,枚举

for i in enumerate():    括号中第一个参数必须是可迭代对象,第二个参数是起始值,可以自己定义,默认为0
    print(i)
for i in enumerate("166",1)
  print(i)
          输出结果为(1,'1'),(2,'6'),(3,'6')

lambda,匿名函数

  匿名函数定义时,没有def,没有函数名,它有形参,可以接收多个形参,查名字可以用:函数.__name__

格式为:  lambda 参数:返回值

f = lambda x:x+x
print(f(3))
                    输出内容为:6
可以直接写:print((lambda x:x+x)(3)),调用时要传参

sorted,排序

print(sorted(可迭代对象))          默认是升序
print(sorted(可迭代对象),reverse=True)  降序

例1:

sorted('可迭代对象',key='函数名',reverse=True)      函数名里写排序的规则,可以指定升序或者降序

lst = ['光年之外','bgm','这个世界太疯狂','accord']
print(sorted(lst,key=lambda x:len(x),reverse=True))
    输出结果为:['这个世界太疯狂','accord','光年之外','bgm']

filter 筛选过滤

  filter('写好过滤规则的函数','可迭代对象')

筛选列表:
lst
= [1,2,3,4,5,6] print(list(filter(lambda x:x>3
,lst)))      结果为:[4,5,6]
筛选字典:
dic = [{'name':'依依','age':18},{'name':'小五子','age':20}]
print(list(filter(lambda x:x['age']>18,dic)))        结果为:{'name':'小五子',''age':20}

map,映射函数

1,可以快速实现列表内每个元素的基础运算,加,乘...

2,可以快速的将多个可迭代对象,元素位置相同的进行上下累加

lst = [1,2,3,4,5,6]
lst1 = [2,3,4,5,6,7]
print(list(map(lambda x,y:x+y,lst,lst1)))        结果为[3,5,7,9,11,13]

zip函数

  它的返回值是多个,如果是多个可迭代对象,按照最短的进行输出,可以将它戏称为拉链函数

lst = [1,2,3]
lst1= [2,3,4,5,6]
lst2 = [5,6,7,8]
for i in zip(lst,lst1,lst2):
    print(i)                结果为:(1,2,5),(2,3,6),(3,4,7)

reduce,实现累计算

python3中,导入reduce函数:from functools import reduce

lst = [1,2,3,4,5,6]
print(reduce(lambda x,y:x**2,lst))   结果为:120

其他函数:

检测可迭代对象:

  all( ),都为真时,输出True,有一个假就为False

  any( ),有一个真即为True

进制转换:

  bin( ),把参数转化成二进制

  otc( ),把参数转化成八进制

  hex( ),把参数转化成十六进制

和ascii码相关:

  acsii( ),如果括号中元素在ascii码中,就原生显示;如果不在,就返回\u...

  chr( ),对应ascii码,输入位置字符找出对应字符

  ord( ),找带字符位置的编码

和数字运算相关:

  abs( ),求数字的绝对值

  round( ),四舍五入;第一个参数为浮点数,第二个参数为保留的位数

  pow( ),两个参数是求幂运算,三个参数是求幂后再取余

  max( ),求最大值;如果是字典,比较的是键

  min( ),求最小值

  float( ),浮点;

和字节相关:

  memoryview( ),求字节的内存地址

  bytes( ),查字节;第一个参数是要查询的内容,第二个参数是编码集

  bytearray( ),返回一个新字节数组,每个元素的值的范围是0~256对应的是ascii码表;第一个参数放内容,第二个参数是编码集

 

callable( ),判断是否可调用

repr( ),显示数据的原生形态

以下两个函数禁用:

eval( ),它可以执行字符串中的部分内容,容易出问题

exec( ),不论字符串输入什么,都可以运行,更容易出问题

递归
  要满足的条件是:自己调用自己,是一个无止境的递归,必须得有明确的终止条件

def func():
    print("你好")
    func()
func()        会报错,内存溢出

  官方声明递归的最大深度为1000,修改递归最大深度的方式是:sys.setrecursionlimit('修改的数量')

def func(n):
    print(n)
    n += 1
    func(n) 
func(1)        实际测试在996-998之间

  递归主要应用在os模块中,可以递归创建文件夹,也可以删除,也可以查看文件

 

posted @ 2019-01-15 21:31  DF-包子  阅读(161)  评论(0编辑  收藏  举报