• Python里面这些点,据说80%的新手都会一脸懵逼


    01.函数里面的 *args

    1).可变参数

    这个是什么鬼,尤其是有其他c,c++语言基础的人,看到这个点,一定懵逼了,难道是指针,两个**又是什么鬼?

    其实这个Python里面的函数入参的几种形式,假如你来设计一个语言,一个函数fun(),里面要传参数进来,要考虑扩展性:变量会有很多种形态,有可能是变量,也可能是数组,也可能是结构体,或者是哈希数组。

    比如你有一个累加功能的函数:

    每次调用函数都要传一个列表或者元组进去,非常死板,不灵活,如果我要传多个列表,多个变量,我又不想改接口,但是改成下面这样就灵活很多: 在这里顺便说下不管你是为了Python就业还是兴趣爱好,记住:项目经验永远是核心,如果你缺新项目练习,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,里面很多新教程项目,还可以跟老司机交流讨教!

    *args:表示可变参数,就是传入的参数个数是可变的,可以是1个、2个到任意个或者0个,其实就是把一堆参数当作一个数组(Python列表或者元组传递进来)。

    02.关键字参数 **kwargs

    关键字参数可以让你输入0或者多个含参数名的参数,并且自动组装为一个字典

    你函数的接口设定为**kwargs,这样的好处,一个是灵活,扩展性好,也就是说我预留的了扩展的接口,你程序调用的时候可以根据自己的需求传1个,多个或者不传都可以。

    另外:不用太纠集args和kwargs这些英语单词,只是大家约定这么叫而已

    03.脸萌的@property

    有其他经验的程序员,看到这个奇奇怪怪的@加一个关键字,一定是一脸懵逼,这其实是Python类里面的一些封装。这些都是类的内置装饰器,有一些特殊的用途!

    1).装饰器@property

    我们大部分人都比较熟悉比如Java的get/set方法,比如:

    小编推荐一个学Python的学习裙【 二二七,四三五,四五零 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!希望新手少走弯路

    2).但是这样写比较麻烦,需要通过函数get/set 来访问属性

    有木有直接对属性进行操作的同时就可以对属性进行处理,比如我们调用student.score=88,这一个时候会自动调用set_score函数,这样就非常灵活和简便!

    Python里面为了简洁和优雅,设计了@property

    对于外边访问的属性score,我们通过Python类中的property装饰器对它进行升级,改造,让它能变的更加灵活和强大!

    其实它就是绑定了一些方法(fget,fset和fdel).尤其是你对属性进行升级功能而不改变外边代码的时候,这一招就非常有用!

    04.傻傻分不清@classmethod和@staticmethod

    看完了上面的property,刚刚回过神,现在又来了两个更大的家伙是啥,其实这个两个类装饰器都是类里面的概念!

    只要是写代码最后一定会走到类,而类的封装和扩展是必须要掌握的,如何能有更好的封装性呢,classmethod和staticmethod就派上用场了!

    1).假如有一个场景,计算日期的类

    2).更改需求,如果我们传入的类初始化是字符串型日期

    我们目前的类的init函数是一个三个参数的,如果我们希望我们传入一个字符串性的日期"2018-10-8",然后返回像上面的日期2018/10/8,怎么办呢?

    传统的做法:

    这样的做法会导致每次初始化的时候,都要先分割成3个参数再导入类,非常麻烦!

    @staticmethod(类的静态方法就派上场)

    通过静态函数,直接内置了分割的功能,会简洁很多,而且封装性也好很多!

    3).但是静态方法也有弊端

    因为静态方法是硬编码,如果我们修改了Date这个类的名字,比如叫MyDate这样的话,会导致我们写的format_date里面的代码也要改,因为我们直接是return Date()... ,好这个时候类方法classmethod上场了!

    我们申明了一个类方法format_date2,里面有一个非常关键的变量cls,其实它就是类本身,这样无论我们把类的名字改成什么,都没有关系,因为我们返回的就是cls(...),这样代码的柔性就强了很多!

    有同学看到这里会问,那静态函数还有什么用处,类方法都能代替了!在做一些类的预处理,或者条件判断的时候,静态函数还是很有用的!

    05.super是啥

    都说Python语言跟英语很类似,语法简单,通俗易懂,但是看到super这样关键字的时候,会有点懵懂!

    其实只要是面向对象的语言,都有类的继承啊,组合等等。Python当然也有这样的设计,其实如果学过Java会非常好理解!比如子类要调用父类的方法,或者覆盖父类的方法都会用到super().

    1).调用父类的方法

    有的同学说我是不是可以直接调用A.say_hello(self),最好不要,涉及多重继承的时候就会有问题

    2).初始化父类的__init__方法

    06.ABC模块

    新手有的时候看到下面的代码会很懵,有点丈二和尚摸不着头脑的赶脚:

    C++里面有抽象基类的概念,Python里面的类在设计的时候,也考虑到了这一点,但是由于Python本身的特性是一切皆对象,大部分的时候都依赖鸭子类型。

    为了完成抽象基类的功能,借助了第三方模块abc(abc是抽象类的缩写,不是英语abc的意思)

    b=Bird()TypeError: Can't instantiate abstract class Bird with abstract methods fly

    Bird继承ABC,也就是说Bird是一个抽象类,不能被初始化,比如你初始化一下,会报错的。

    这个类的目的就是让继承它的子类一定要实例化fly函数,否则子类也永远无法实例化

    其实当你完全熟悉这些用法之后,你要开始思考Python为啥要这么设计,慢慢的你就会领悟Python这门语言的设计思想,而不是只是看它的招式,当你明白里招式背后的含义,恭喜你,你的功力又大涨了,另外不管你是为了Python就业还是兴趣爱好,项目经验永远是核心,如果你缺新项目练习,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,里面很多新教程项目,还可以跟老司机交流讨教!

     本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。



  • 相关阅读:
    LeetCode 1110. Delete Nodes And Return Forest
    LeetCode 473. Matchsticks to Square
    LeetCode 886. Possible Bipartition
    LeetCode 737. Sentence Similarity II
    LeetCode 734. Sentence Similarity
    LeetCode 491. Increasing Subsequences
    LeetCode 1020. Number of Enclaves
    LeetCode 531. Lonely Pixel I
    LeetCode 1091. Shortest Path in Binary Matrix
    LeetCode 590. N-ary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/chengxuyuanaa/p/12572811.html
Copyright © 2020-2023  润新知