Python里面这些点,据说80%的新手都会一脸懵逼
Python虽然语法简单,通俗易懂,但是再简单它也是一门语言,就像一棵大树,总有一些树枝是弯弯绕绕的,让新手看完之后一脸懵逼,今天我们就来说说这几个点,反正我学的时候是很困惑的!
01.函数里面的 *args
1).可变参数
这个是什么鬼,尤其是有其他c,c++语言基础的人,看到这个点,一定懵逼了,难道是指针,两个**又是什么鬼?
其实这个Python里面的函数入参的几种形式,假如你来设计一个语言,一个函数fun(),里面要传参数进来,要考虑扩展性:变量会有很多种形态,有可能是变量,也可能是数组,也可能是结构体,或者是哈希数组。
比如你有一个累加功能的函数:
每次调用函数都要传一个列表或者元组进去,非常死板,不灵活,如果我要传多个列表,多个变量,我又不想改接口,但是改成下面这样就灵活很多:
*args:表示可变参数,就是传入的参数个数是可变的,可以是1个、2个到任意个或者0个,其实就是把一堆参数当作一个数组(Python列表或者元组传递进来)。
02.关键字参数 **kwargs
关键字参数可以让你输入0或者多个含参数名的参数,并且自动组装为一个字典
你函数的接口设定为**kwargs,这样的好处,一个是灵活,扩展性好,也就是说我预留的了扩展的接口,你程序调用的时候可以根据自己的需求传1个,多个或者不传都可以。
另外:不用太纠集args和kwargs这些英语单词,只是大家约定这么叫而已
03.脸萌的@property
有其他经验的程序员,看到这个奇奇怪怪的@加一个关键字,一定是一脸懵逼,这其实是Python类里面的一些封装。这些都是类的内置装饰器,有一些特殊的用途!
1).装饰器@property
我们大部分人都比较熟悉比如Java的get/set方法,比如:
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__方法
如果我的分享对你有所帮助,加q u n 227-435-450,更多资源与教程与你共享。
我做开发几年的时间,如果大家对于学习Python的学习方法,学习路线以及:是自学还是培训的疑问,都可以随时来问我。
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这门语言的设计思想,而不是只是看它的招式,当你明白里招式背后的含义,恭喜你,你的功力又大涨了!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
5个优化页面加载速度提高SEO排名的最佳实践
5个优化页面加载速度提高SEO排名的最佳实践 客户和用户总是在他们的手机上寻找信息 – 他们希望快速!对速度的需求推动了他们所有的决定:无论是食物快速,快速前往办公室,一分钟新闻还是快速结账。移动浏览体验的速度可以显着影响用户体验和转化率。以下是快速跟踪移动页面加载时间的五个提示。 为什么设计快速Web体验至关重要? 百度表示,53%的移动网站访问会留下一个加载时间超过3秒的网页。这意味着,每次反弹都意味着转换损失和收入下降。 然而,完全加载移动页面平均需要15秒。百度报告称:“我们的数据显示,虽然超过一半的网络流量来自移动设备,但移动转化率低于桌面设备。简而言之,速度等于收入。” www.paimingdiyi.com研究发现79%的网站性能问题客户不想返回网站,44%的客户会与朋友分享经验。因此,您不仅仅是失去了当前的客户,而且随着口口传播在整个圈子中,损失也会被放大。 除了通过访问者保留来提高收入外,快速加载的网站也会提升您的SEO排名。 有几个因素会影响您的网页效果。在这里,我们列出了五个可以帮助减少页面加载时间的最佳实践。 使用内容交付网络:建立服务器的内容交付网络(CDN)...
- 下一篇
Python正则表达式初识(七)
继续分享Python正则表达式的基础知识,今天给大家分享的特殊字符是“\s”、“\S”,具体的教程如下。 1、“\s”代表的意思是匹配空格,匹配模式“加\s油”代表的是字符“加”和“油”之间有空格的意思,如下图所示。 可以看到原始字符串中“加”和“油”之间有空格,与匹配条件相符合,所以匹配成功。 2、为了加强理解,现在将原始字符串改为“加加油”,字符中间不为空格,保持匹配模式不变,如下图所示。 可以看到无任何输出,说明匹配不成功。 3、如果“加”和“油”之间有多个空格的话,则只需要在匹配模式中将“加\s油”改为“加\s+油”即可,如下图所示。 4、“\S”代表的意思与“\s”代表的意思刚刚相反,也就是说匹配的那个字符只要不是空格,都可以匹配。如下图所示,继续用第二步那个例子,只要将匹配模式中的“\s”改为“\S”,其他的保持不变,如下图所示。 可以看到此时就可以匹配成功。 5、而将原始字符串改为“加 油”,两个字符中间有个空格,匹配模式不变,如下图所示。 可以看到此时无任何输出,说明匹配不成功。 6、同样的,如果要匹配多个非空白字符的话,只需要将“\S”改为“\S+”即可,如下图所示。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS关闭SELinux安全模块
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音