关于装饰器、lambda、鸭子类型、魔法函数的理解仍存有困惑之处,趁周末有时间温故,赶紧去自学了解下相关知识。

1.装饰器是什么:

  很多初学者在接触装饰器的时候只做到了肤浅的了解它的概念、组成形态。实际上装饰器是python学习中很难啃的大骨头,一旦涉及到具体用途以及原理,经常会把人绕晕。

  在这里,我们需要明确的一点是:装饰器并不是加速器。装饰器的作用仅仅是为了封装一个函数,使其增加原有的函数功能,却不改变其调用方式。

  而装饰器往往需要具有三大要素:1把想加入的函数C作为参数传入函数A  2.在函数A里面嵌套一个函数B,并在B函数里面调用函数C  3.在函数A里面把函数B作为返回值返回

  具体结构:      def A(C):

          def B():

            C()

          return  B

           @A

         def foo():

          cdsvhoush

         foo()

  像这样直接调用foo函数,实际上就是把foo作为参数传入了装饰函数A中,实现函数功能更好的复用。而把函数作为参数使用是python特有的一种用法。

2.在类中使用装饰器:

  装饰器不仅可以是函数,还可以是类,相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。

  。。。

3.有关lambda函数的用法

  lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

  lambda表达式是起到一个函数速写的作用。允许在代码内嵌入一个函数的定义。

如下,是lambda函数中的一个常见用法。先忽略下一行不看,光看上一行是不是觉得难以理解?其实,lambda只是一个表达式,函数体比define简单很多。下一行用刚刚命名的f来调用lambda的时候,是不是现在就觉得亲切不少?

lambda x,y:x-y   ————lambda后面的内容是输入值,:后的含义是进行的运算规则及返回值。 lambda是可以赋值给一个变量的

4. 将lambda函数作为参数传递给其他函数。(注:lambda的常见高能用法,以下是本人在CSDN上摘抄大佬所整理的部分)

  部分Python内置函数接收函数作为参数。典型的此类内置函数有这些。

    (1)filter函数。此时lambda函数用于指定过滤列表元素的条件。例如filter(lambda x: x % 3 == 0, [1, 2, 3])指定将列表[1,2,3]中能够被3整除的元素过滤出来,其结果是[3]。

    (2)sorted函数。此时lambda函数用于指定对列表中所有元素进行排序的准则。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))将列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素与5距离从小到大进行排序,其结果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。

##我们做过的学生信息查询系统的排序功能时就用到了sorted方法,里面就调用了lambda函数!!

    (3)map函数。此时lambda函数用于指定对列表中每一个元素的共同操作。例如map(lambda x: x+1, [1, 2,3])将列表[1, 2, 3]中的元素分别加1,其结果[2, 3, 4]。

    (4)reduce函数。此时lambda函数用于指定列表中两两相邻元素的结合条件。例如reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])将列表 [1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素从左往右两两以逗号分隔的字符的形式依次结合起来,其结果是'1, 2, 3, 4, 5, 6, 7, 8, 9'。

5.鸭子类型 :

  首先,让我们先回顾一下多态是什么:

  当同一个变量在调用同一个方法时,完全可能呈现出多种行为(具体呈现出哪种行为由该变量所引用的对象来决定),这就是所谓的多态(Polymorphism)。

  “鸭子类型”的语言是这么推断的:一只鸟走起来像鸭子、游起泳来像鸭子、叫起来也像鸭子,那它就可以被当做鸭子。也就是说,它不关注对象的类型,而是关注对象具有的行为(方法)。

  魔法函数:

  先来介绍几个python常用魔法函数。

  1、__init__():

所有类的超类object,有一个默认包含pass的__init__()实现,这个函数会在对象初始化的时候调用,我们可以选择实现,也可以选择不实现,一般建议是实现的,不实现对象属性就不会被初始化,虽然我们仍然可以对其进行赋值

  2、__str__():

直接打印对象的实现方法,__str__是被print函数调用的,一般都是return一个什么东西,这个东西应该是以字符串的形式表现的。如果不是要用str()函数转换,我们可以直接print的对象都是实现了__str__这个方法的,比如dict

  3、__new__():

在object类中存在一个静态的__new__(cls, *args, **kwargs)方法,该方法需要传递一个参数cls,cls表示需要实例化的类,此参数在实例化时由Python解释器自动提供,__new__方法必须有返回值,且返回的是被实例化的实例,只有在该实例返回后才会调用__init__来进行初始化,初始化所用的实例就是__new__返回的结果,也就可以认为是self。

  4、__hasattr__(对象,“字符串”):

判断对象中是否存在字符串中名字的方法,返回值为False或True。

  5、__getattr__(对象,“字符串”):

得到对象中对应字符串中名字的方法(前提是经上述hasattr判断,要先存在这样的方法,才可得到)

  6、__setattr__(对象,“字符串”,。。):

把对象的属性值赋给a = __setattr__(...,...,...)


  好,现在知识点回顾完毕,现在是第三周的编程刚刚结束,说一下我近期的感受吧。

  刚学完基础语法的时候,发现解决每个问题的难点都在于:把之前固有的解决问题的思路转化为编程语言来描述。也许这是每个初学一门语言的人都要经历的过程,但后来我发现,知识都是死的,但具体怎么解决,是要靠强大的逻辑去支撑的。还有就是,要学会经常复盘。对于做过的每道题题,解决的每个项目,当时觉得做出来很轻松,但当敲过更多的代码,学过更多的知识过后,你需要去思考:我还可以有更好的办法让这个程序代码行数更少。在学完面向对象以后,我个人的强大感受是:整个世界的运转都离不开类和对象。每个实例的不同表现形式是面向对象的多态性、子类就是父类、但是子类可以实现自己定义的多种功能...更神奇的还有,如何把之前做过的每道题用“类和对象”的思路去完成。其实,处理一个问题、或者是大的项目,难点就在于其设计思路的复杂、多样性。解决一个问题之前,应该首先思考的是它的数据存放类型、数据处理模型,一定要首先先思考它的可行性,再去进一步搭框架(不然的话世界上就没那么多程序员想揍产品经理了),之前在做数独这个项目的时候,说句实话我的大脑一片空白。直到老师指导我,细化的告诉我这些数据该怎么存放,具体程序执行的大致流程,我的思路才清晰了一些,才得以独立完成这个项目。

  俗话说,师傅领进门,修行在个人,别人只能帮你解决一个小bug,不可能一直帮你。如何做到活学活用,则要看你敲过的代码行数、你解决过的问题、你自己实现出来的每个项目。当然,积累的越多,收获越大。如何打破自己原有的世界观,进入新的代码天地,需要走上一阵子了。

  实现很容易,设计可一点儿都不简单,因为只有实现过的人才懂得如何去设计,以及这样做可不可以。所以我的建议是,对于初学者,不要每道题解不出就哭爹喊娘不干了,一定要坚持独立思考这个过程,直到实在想不出再去求助别人,不为别的,只有这样做才会有效果。世界上绝大多数难题都是举一反三,老话说,就是“照葫芦画瓢”。同样的南墙,先撞一次,下次再遇到就是老朋友了。我无法描述独立解决一道问题的快感,我只知道,看不见报错提示、也没有逻辑错误的程序跑出来的那一瞬间,我坐在电脑前的5个小时、8个小时、甚至15个小时都值得,仅仅因为:这些知识已经变成我的武器了

  最后一句话送给像娜娜酱1999一样迷茫的人:学而不思则罔,思而不学则殆。最坏的结果不过是大器晚成。❤

  (整理不易,请各位客官点个赞再走呗(#^.^#))

干货来了!python学习之重难点整理合辑1的更多相关文章

  1. Python学习的个人笔记(基础语法)

    Python学习的个人笔记 题外话: 我是一个大二的计算机系的学生,这份python学习个人笔记是趁寒假这一周在慕课网,w3cschool,还有借鉴了一些博客,资料整理出来的,用于自己方便的时候查阅, ...

  2. 灵魂画手的零基础python教程1:关于Python学习的误区、python的优缺点、前景

    滴~ 近段时间,因为工作项目的原因,阿菌要重拾起python这门语言了,所以顺势写一门python教程,精心的编排,配上漫画和视频,希望能帮助更多想接触编程的同学入门,课程将从基础语法开始讲起,和大家 ...

  3. 大学四年的Python学习笔记分享之一,内容整理的比较多与仔细

    翻到以前在大学坚持记录的Python学习笔记,花了一天的时间整理出来,整理时不经回忆起大学的时光,一眨眼几年就过去了,现在还在上学的你们,一定要珍惜现在,有个充实的校园生活.希望这次的分享对于你们有学 ...

  4. Python 学习之路 (一):基础

    数据类型和变量 整数 在Python3中,整数可以处理任意大小的整数,不分长整型和整型, 十六进制用0x开头或者H结尾表示:0x2af ,2afH 用函数 int() 来转换字符串中的数字,里面不能包 ...

  5. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  6. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

  7. coursera python 学习总结

    为啥要写这篇总结?早上突然想到了四个字:知行合一.实践,总结,再实践,再总结经验,积累经验,为己所用.闲话少叙,来干货: 1.目标要单一,如果想要完成课程,还要健身,还要玩玩游戏.看看电影,还学别的课 ...

  8. 《码农周刊》干货精选(Python 篇)

    <码农周刊>已经累计发送了 38 期,我们将干货内容进行了精选.此为 Python 篇. <码农周刊>往期回顾:http://weekly.manong.io/issues/ ...

  9. [Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …

    [Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source - [Pyth ...

随机推荐

  1. 无法启动print spooler服务,错误2,系统找不到指定的文件

    来自百度: 无法启动print spooler服务,错误2,系统找不到指定的文件 我的打印机无法运行:出现"打印后台程序没有执行"提示.查:print spooler没有启动.点击 ...

  2. 面试超火题 This的问题!!!

    this问题 (1)this是js的一个关键字,指定一个对象,然后替代this: 函数中的this指向行为发生的主体,函数外的this都指向window,没有意义 (2)函数内的this跟函数在什么环 ...

  3. Linux 配置 history 命令显示操作时间、用户和登录 IP

    一.在配置文件中(/etc/bashrc 或者 /etc/profile 或者~/.bash_profile 或者 ~/.bashrc)添加如下配置 #vim /etc/bashrc    // 进到 ...

  4. C# Redis分布式锁(基于ServiceStack.Redis)

    相关的文章其实不少,我也从中受益不少,但是还是想自己梳理一下,毕竟自己写的更走心! 首先给出一个拓展类,通过拓展方法实现加锁和解锁. 注:之所以增加拓展方法,是因为合理使用拓展类(方法),可以让程序更 ...

  5. Web自动化测试 一

    Web自动化测试 一.为什么要进行web自动化测试 接口测试只能测试后端返回的数据,定位的是后端开发工程师的问题.如果前段出现了问题,我们要使用web测试去发现错误. 具体定位的问题有: 显示的数据: ...

  6. smobiler介绍(二)

    类似开发WinForm的方式,使用C#开发Android和IOS的移动应用?听起来感觉不可思议,那么Smobiler平台到底是如何实现的呢,这里给大家介绍一下. 客户端 Smobiler分为两种客户端 ...

  7. python logging模块使用总结

    目录 logging模块 日志级别 logging.basicConfig()函数中的具体参数含义 format参数用到的格式化信息 使用logging打印日志到标准输出 使用logging.base ...

  8. 常用的方法论-5why

  9. vue中v-model的数据双向绑定(重要)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. ecshop数据库结构和字段介绍(转载)

    ecs_account_log:账户变动日志(注册用户充值.支付等记录信息)字段 类型 Null 默认 字段说明log_id mediumint(8) 否 无 日志IDuser_id mediumin ...