Python全栈开发记录_第五篇(装饰器)

  单独记录装饰器这个知识点是因为这个知识点是非常重要的,必须掌握的。

了解装饰器之前要知道三个知识点

  1. 作用域,上一篇讲到过顺序是L->E->G->B
  2. 高阶函数:
  • 满足下列其中一种即可称之为高阶函数:

    a、把一个函数名当做实参传递给另一个函数

    b、返回值中包含函数名

  3.闭包

闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境),通俗讲法是:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。,具体看下面代码:

n = 10  # 定义全局作用域变量

def fn():  # 形成闭包
    n = 100  # 定义局部变量n

    def inner():
        nonlocal n
        n += 1  # 这里定义操作相同变量n无法调用上层作用中的变量,如果只读不写则可以正常访问
                # python3 中新增nonlocal 关键字可以调用上层作用域中的变量
        print(n)

    return inner  # 返回内嵌函数的地址,从而形成闭包
    # 形成闭包的条件
    # 1、必须要有一个内嵌函数
    # 2、内嵌函数中要对自由变量的引用
    # 3、外部函数必须返回内嵌函数

t = fn()
t()       ->101
print(n) ->10

这里要插播一下,刚刚看到群里面有一道题目,需求如下:

需要将str1 = ((‘a‘),(‘b‘)),((‘c‘),(‘d‘))  变成  [{‘a‘: ‘c‘}, {‘b‘: ‘d‘}]

可以先尝试下:

给个提示,用到zip和map,上一篇已经说过map了,这次来补充一下zip是个啥,举个例子给你看下:

#zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
s1 = ((‘a‘),(‘b‘))
s2 = ((‘c‘),(‘d‘))
s3 = zip(s1, s2)
print(list(s3))   ->结果是:[(‘a‘, ‘c‘), (‘b‘, ‘d‘)]

所以应该知道怎么玩了吧,接下来就是答案了:

str1 = ((‘a‘),(‘b‘)),((‘c‘),(‘d‘))
z = zip(str1[0], str1[1])  #返回的是一个迭代器
b = list(map(lambda x: {x[0]: x[1]} , z))  #map这里做的就是将zip类的两个元祖拿出来然后进行元祖变成字典的转换(这个转换不错值得学习),返回的也是一个迭代器,所以用list返回成列表
print(b)

原文地址:https://www.cnblogs.com/leixiaobai/p/9888306.html

时间: 2024-10-10 22:06:52

Python全栈开发记录_第五篇(装饰器)的相关文章

Python全栈开发记录_第八篇(模块收尾工作 json & pickle & shelve & xml)

由于上一篇篇幅较大,留下的这一点内容就想在这里说一下,顺便有个小练习给大家一起玩玩,首先来学习json 和 pickle. 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了,所以eval的重点还是通常用来执行一个字符串表达式,并返回表达式的值. 什么是序列化? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pic

Python全栈开发记录_第一篇

Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(代码行数:70行) 知识点1:优先级:not>and 短路原则:and:如果第一个条件的结论为假,那么 and 前后两个条件组成的表达式计算结果一定为假,后面的条件计算机不会进行计算 or:如果第一个条件的结论为真,那么or 前后两个条件组成的表达式计算结果一定为真,后面的条件计算机不会进行计算 知识点2:python区分大小写,常量需全部字母大写(默认这样写) python换行

python全栈开发【第十五篇】面向对象三大特性——封装

1.封装: 什么是封装呢?(封装不是单纯意义的隐藏,其实它还是可以查看的) 就是把一些不想让别人看的给隐藏起来了 封装数据:目的是保护隐私 功能封装:目的是隔离复杂度 如果用了私有的,在类的外部,无法直接使用变形的属性,但是在类的内部可以直接使用 # 对象名.属性名取值的三种方法 1.用我们常用的__init__方法里的self取值 class Course:#恰好给我们提供了实现这种思路的方法 # #一种思路,python def __init__(self,price,period,name

Python全栈开发记录_第九篇(类的基础_封装_继承_多态)

有点时间没更新博客了,今天就开始学习类了,今天主要是类的基础篇,我们知道面向对象的三大特性,那就是封装,继承和多态.内容参考该博客https://www.cnblogs.com/wupeiqi/p/4493506.html 之前我们写的都是函数,可以说是面向过程的编程,需要啥功能就直接写啥,但是我们在编写程序的过程中会发现如果多个函数有共同的参数或数据时,我们也必须多次重复去写,此时如果用面向对象的编程方式就会好很多,这也是面向对象的适用场景. 面向对象三大特性: 一.封装(顾名思义就是将内容封

python全栈开发从入门到放弃之装饰器函数

1.函数名可以当作函数的参数 1 import time 2 def timmer(func): 3 #函数名可以当做函数的参数 4 def inner(): 5 start = time.time() 6 func() 7 end = time.time() 8 print(end - start) 9 return inner 10 11 def hahaha(): 12 time.sleep(0.1) 13 print('aaaa') 14 15 hahaha() 16 17 输出结果 1

python全栈开发【第十六篇】面向对象三大特性——多台和继承补充

一.回顾 面向对象 1.类:具有相同属性和方法 的一类事物 类名可以实例化一个对象 类名可以调用类属性,(静态属性 和(方法)动态属性) 2.对象:也就是实例    对象名:调用对象属性 调用方法 3.什么叫抽象? 从小到大的过程 4.组合-----什么有什么的关系(将一个类的对象当做另一个类的属性) 5.继承-----什么是什么的关系 从大范围到小范围的过程 继承的作用:减少代码的重用性 子类有的方法,就用子类的.不会调用父类的方法. 如果要在子类中调用父类的方法:super().类名() 6

python全栈开发【第十二篇】Python的模块和包

一.模块 1.import.... 一个py文件就可以作为一个模块 模块的导入:直接导入文件的名字,不需要带着后缀 模块中的函数调用:模块名.函数名() 导入模块的时候做了三件事:1.首先开辟了一个新的命名空间my_moudle 2.执行了my_moudle内的代码 3.将my_moudle里面的名字和命名空间绑定在一起了 注意:模块在一个程序中只会被导入一次,不会重复导入(为了节约资源)那么,如何实现模块在程序中只会被导入一次呢?(通过该特性可以实现单例模式) 当导入一个文件之后,会将模块存储

python全栈开发基础【第二十篇】利用multiprocessing模块开进程

一.multiprocessing模块介绍 python中的多线程无法利用CPU资源(主要指计算密集型任务),在python中大部分情况使用多进程.python中提供了非常好的多进程包multiprocessing. multiprocessing模块用来开启子进程,并在子进程中执行功能(函数),该模块与多线程模块threading的编程接口类似. multiprocessing的功能众多:支持子进程.通信和共享数据.执行不同形式的同步,提供了Process.Queue.Pipe.Lock等组件

python全栈开发【第十四篇】面向对象三大特性——继承

一.组合 组合:组合指的是,在一个类中以另外一个类的对象(也就是实例)作为数据属性,称为类的组合 也就是说:一个类的属性是另一个类的对象,就是组合 例子: 圆环是由两个圆组成的,圆环的面积就是外圆的面积减去内圆的面积.圆环的周长就是内圆的周长加上外圆的周长,这个时候,我们首先设计一个圆形类,计算一个圆的面积和圆的周长.然后在'圆环类'组合圆形的实例作为自己的属性来用(这样的目的就是为了不用在写面积和周长的方法了,直接组合圆类的面积和方法去求解.减少了代码的重用) #求圆环的面积和周长 from