你做的 9 件事表明你不是专业的 Python 开发人员

Posted waynaqua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你做的 9 件事表明你不是专业的 Python 开发人员相关的知识,希望对你有一定的参考价值。

本文转载自国外论坛 medium,原文地址:
https://medium.com/navan-tech/7-java-features-you-might-not-have-heard-of-adee8166d942,由博主简译后给大家带来!

Show me your code and I will tell you who you are.

This article will fix the bad habits you have stuck to over the years or brought from other programming languages.

是的,老外就这么吊,文章开头就是"给我看看你的代码,我来告诉你,你有几斤几两!"
紧接着,老外告诉你这篇文章为什么这么吊,意思是这篇文章可以纠正你多年以来从其他语言坚持而来的坏习惯。。。虽然博主确实编了几年程序。

一、手动格拼接字符串

大多数时候,Python 初学者在组合两个字符串时会使用 + 号。

>>> name = "Ridwan"
>>> age = "22"
>>> print("My Name is " + name + " and I am " + age + " years old")
My Name is Ridwan and I am 22 years old

不要使用 + 号,而应使用 f 字符串,这样可以使您的代码可读、简洁且不易出错。python3.6+开始支持 f 格式字符串

>>> print(f"My Name is name and I am age years old")
My Name is Ridwan and I am 22 years old

二、使用默认可变参数

在 Python 中,只要您将可变值作为参数传递给函数,默认参数就会在函数被调用时发生变化。这些可变参数通常是列表或字典。

如下:

>>> def append(n, l=[]):
...     l.append(n)
...     return l
...

可以看到 append 函数的第二个参数 l 是一个可变参数,只要您使用值为 n 调用该函数,它就会更改默认值 l。

// 第一次调用
>>> l1 = append(0)
>>> l1
[0]

当您下次在调用 append 函数时,您将看到您使用的先前值附加到空列表参数。

// 第二次调用
>>> l2 = append(1)
>>> l2
[0, 1]

简而言之也就是说由于 l 在 append 函数中被默认初始化为一个 list,第二次调用时,l 并没有重置,导致返回时还带有第一次调用的结果。

这个问题可以通过重写代码来解决,

>>> def append(n, l = None):
...     if l is None:
...         l = []
...     l.append(n)
...     return l
...
>>> l1 = append = [0]
>>> l2 = append = [1]
>>> l1,l2
([0], [1])

现在参数 l 被设置为 None,任何时候函数被调用,即使 l 发生了变化,它也会被重新分配为 None,然后给出一个空列表的值。

三、不使用推导式

Python 推导式 为您提供了一种构建序列的简洁方式,上次我检查过,Python 支持 4 种类型的推导式;

  • 列表推导式
  • 集体推导式
  • 字典推导式
  • 生成器推导式

你可以在这里阅读更多关于他们的信息。

下面的代码将字典中的值除以 2,

>>> numbers = 
>>> for i in range(10):
...     numbers[i] = i/2
...
>>> numbers
0: 0.0, 1: 0.5, 2: 1.0, 3: 1.5, 4: 2.0, 5: 2.5, 6: 3.0, 7: 
3.5, 8: 4.0, 9: 4.5

上面的代码可以写成一行,

>>> i: i/2 for i in range(10)
0: 0.0, 1: 0.5, 2: 1.0, 3: 1.5, 4: 2.0, 5: 2.5, 6: 3.0, 7: 
3.5, 8: 4.0, 9: 4.5

所以不要让自己过得不好,开始使用推导式。

推导式确实算是 python 开发一大利器,用好推导式,早下班!

四、检查 Equality 而不是 Identity

如下,

a = [1, 2, 3]
b = [1, 2, 3]

如果我让你检查这两个变量是否相同,你首先想到的是,

>>> a == b
True

问题是你需要知道 Identity 和 Equality 之间的区别。

如果检查a和b的内存地址,

>>> id(a), id(b)
(1838093945856, 1838093487488)

您可以看到尽管它们具有相同的对象,但它们都有不同的内存地址。

这就是为什么当你运行代码时,

>>> a == b
True
You get True, but when you run

>>> a is b
False

当你调用 a is b 返回 False时,a 和 b 就不是相等的了。

在运行如下代码,

>>> c = [1,2,3]
>>> d = c
>>> id(c), id(d)
(1838089019712, 1838089019712)

可以看到,c和d是相等且相同的,c中的对象也被赋值给了d。

>>> c == d
True
>>> c is d
True

这意味着 c 和 d 具有相同的值和内存地址。

因此你可以说 c 是相同的并且等于 d。

写这篇文章就是为了让你知道 is 和 == 的区别,前者是用来检查 identity ,后者是用来检查 equality 的。

所有相同的变量都相等,但并非所有相等的变量都相同。

这一段看着有点绕,说人话就是 == 比较的是连个变量的值是否相等,is 比较的是两个比变量的内存地址相等!,我相信大伙都明白哈,不然白看了这么多年八股文。

五、不使用元组解包

任何时候你在 Python 中创建一个元组 a_tuple = 1,2,3 ,它会默认进行元组打包,

>>> a_tuple = 1,2,3
>>> a_tuple
(1, 2, 3)

然后可以通过索引访问元组内元素

>>> x = a_tuple[0]
>>> y = a_tuple[1]
>>> z = a_tuple[2]
>>> print(x, y, z)
1, 2, 3

其实无需使用多行代码访问元组中的元素,您可以通过元组解包自动在一行代码中完成。

>>> x,y,z = a_tuple
>>> print(x, y, z)
1, 2, 3

元组解包也是 python 中常用的开发技巧,提升开发效率。

六、创建您自己的索引计数器变量

这个在其他编程语言中很常见,你被要求创建一个索引计数器变量,然后你输入类似的东西;

>>> a_list = [1,2,3,4,5,6,7,8,9,10]
>>> index = 0
>>> for elem in a_list:
...     print(index, elem)
...     index += 1
...
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10

相反,使用 enumerate 函数使您的代码看起来像 Pythonic(这里指写出python风格的代码);

>>> for index, elem in enumerate(a_list):
...     print(index, elem)
...
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10

这里批评下 Java,这么多年了,foreach 循环也拿不到索引。

七、使用 Print 语句代替日志记录模块

这在小型项目中可能无关紧要,但肯定会对大型项目有所帮助。

不要用打印语句乱扔代码,而是使用日志记录。

>>> print(\'This is a warning message\')
This is a warning message
>>> print(\'This is an error message\')
This is an error message
>>> print(\'This is a critical message\')
This is a critical message

日志记录有助于向您的用户显示有用的消息,以增加对代码库中发生的事情的更多上下文和理解。

>>> import logging
>>> logging.warning(\'This is a warning message\')
WARNING:root:This is a warning message
>>> logging.error(\'This is an error message\')
ERROR:root:This is an error message
>>> logging.critical(\'This is a critical message\')
CRITICAL:root:This is a critical message

这年头还有人在线上不用文件记录日志吗?有的话告诉我一声,
我肯定拿刀找他!

八、使用 import * 在命名模块中导入函数和类

这种坏习惯有时在新手中很常见。

使用 import * 导入会破坏您的命名空间,方法是将该命名模块中的所有函数和类导入您的代码,这可能会与您定义的函数或导入的其他库的函数发生冲突。

反正博主从来不用 import *,至于你用不用我不知道,但是我建议你不要用。

九、不关注 pep8

pep8就是Python官方指定的编码规范

我们大多数人都犯了这个罪,

我承认我有罪

在我被取消之前

《百万IT毕业生的心声:IT专业大学生毕业前必做的十件事》

0001、搞定linux操作系统

Linux是一个开源的操作系统,但总是拿开源说事的话,对于没有深入了解的同学来说可能不是能很清楚的认识这个概念。这里我换个角度用大白话聊一聊linux,linux其实是属于喜欢“折腾”的人的,而恰恰我们计算机相关专业的同学是最需要契合这个属性的,通过不断地折腾,在折腾中成长的速度是飞快的。而且现在国内绝大多数公司产品部署都是使用的某个linux发行版本,而且随着linux内核支持namespace内核以及docker的诞生,云原生技术近些年来的迅猛发展,linux毫无疑问是我们绕不开的一个门槛。

对于学习linux,我们可以尝试着自己安装一次linux系统,具体的发行版本我推荐的是ubuntu任意LTS版本即可,这个发行版本对于新手来说还是很友好的,如果同学们有自己熟悉的版本也是没问题的,具体的安装教程网络上有很多,这里就不列举了。

在安装完成之后我们可以学习学习使用一些基本的命令,比如切换目录、查看文件、创建/删除文件、编辑文件,试试vim、更改密码等等,当你熟悉命令行操作之后,你会发现用起来是真的爽,节省下来鼠标点来点去那个时间的快乐是真的快乐。

(有mac的同学使用自己的mac就可以了,mac是UNIX内核,在mac上学习也可以达到一样的效果,至于我为什么在这里推荐的是linux,答:mac太贵了)

请学习 CS入门技能树  – 这是现代 IT 人生的入门技能,赶紧!

0010、注册一个自己的域名

我们都知道ip地址相当于网络的门牌号,但是点分十进制的IPV4地址真的很难记,更不用说是IPV6地址了,那么我们就需要有一个助记符——域名,来帮助记忆ip地址。

而且我们在毕业前想要包装自己的话,我们可能需要给自己打造一个品牌,比如一个有很多优质内容分享的博客网站,就像阮一峰、廖雪峰这些大佬一样,那么一个域名是必须要有的。

我们在注册域名的时候可以注意一下域名的后缀,不同的后缀表示的含义都不一样的,比如.com就表示是一个商业组织或者公司,还有国家或者地区后缀,比如.cn是中国,.hk是香港特别行政区,又或者.gov .edu 政府部门、教育机构,所以在注册域名时最好搞清楚注册域名要做什么,注册的域名后缀是什么含义,这是一件非常有意义的事情。

0011、拥有一台云主机

由于IPV4地址的全球数量紧缺,我们家用宽带现在几乎都是在局域网内的,如果没有一个公网IP的话,我们想做的很多事情都会受到限制,比如过搭建一个个人网站,开发一些应用程序等,都需要用到公网IP,而且我们的服务器是需要24小时开机的,使用家用电脑的话首先是对我们设备使用寿命会有很大的损伤,其次产生的电费也是一笔不小的开支,这时候我们就可以选择更方便实惠的云服务器来搭建我们的应用程序,同时我们购买服务器的时候一般使用的都是linux系统,在使用服务器的同时也能够锻炼我们对linux系统的掌握程度。

在CSDN 就可以很快获得一台云主机 (链接: 开发云 - 一站式云服务平台

0100、搭建一个个人博客网站

在自我成长的过程中能够做出产出的程序员是很受大厂欢迎的,而且将自己学到的东西清晰地描述出来是检验学习成果的一个很有效的方法,所以我们有必要搭建一个自己的个人博客,在产出的同时将其积累起来,未来也是我们简历上的一个很大的加分项。

但是搭建一个个人博客对于学生阶段的大家来说可能还是会有一些难度的,就比如在服务器上面搭建一个wordpress博客,我们要安装nginx,mysql,php环境,也就是我们常说的LNMP环境,而且还要写很多配置,无疑是增加了很多门槛。

但是现在很多云服务厂商都提供了个人博客wordpress的直接解决方案,我们可以通过一些无代码工具进行搭建:

请拥有一个自己的博客账号: CSDN如何修改用户名(CSDN ID)、用户昵称以及自定义博客域名等_CSDN客服的博客-CSDN博客_csdn账号 

(开发云如果有镜像仓库,能够一键拉起容器跑起来才是真的无代码,0配置的无门槛建站)

0101、发布优质内容交流促进成长

在我们搭建完成自己的个人博客之后,我们就可以开始写一些博客来记录自己的学习经历了,或者分享一些我们的开发经验、踩过的坑,分享一些自己写的工具类等等。同时也可以结交一些志同道合的朋友多多的进行交流探讨,这对我们技术提升的帮助无疑是巨大的。所以在我们在发布博客的时候可以将自己的博客也在国内流量比较大的平台比如CSDN,也发布一份,,在获得流量的同时也可以助力结交志同道合的朋友。

经常看优秀博主是怎么写优秀博客的,写优秀博客可以获得奖励:https://bbs.csdn.net/topics/605693411 

0110、关注/收藏开源项目,熟练使用git

git是我们开发人员必须!必须!必须!掌握的一个技能,它是一个简单快速,允许成千上万分支并行开发的完全分布式的版本控制工具,是目前最主流的代码管理工具,当然我们也可以使用git去控制我们的一些文档之类的,也不仅仅局限于代码管理。

学习git:Git - Book

再说一遍:请学习 CS入门技能树  – 这是现代 IT 人生的入门技能,赶紧!

Github是全球最大的开源社区,是基于git的代码托管服务,但是他是在墙外面的,我们如果需要使用一些代码托管服务的话,可以选择我们国内的gitcode,在拥有很多优秀项目的同时,也为我们开发者提供了免费的个人仓库(github只有共有仓库是免费的),同时也可以创建组织(同样对于私密组织是免费的),进行多人协作开发,还不带上小伙伴们搞起来?

0111、参加IT类大赛,取得名次更佳

我们在求职的时候,简历上面的一些含金量比较高的奖项或者荣誉也是比较大的加分项,而且参加比赛的同时也能了解到一些前沿的技术,这里呢给大家推荐一个竞赛平台:CSDN 竞赛平台,这里会不定期地举办一些国内知名企业组织的比赛,目前主要有四个赛道,人工智能算法、程序设计开发、公益学习、创新创意,同时还有各种丰厚的奖项,这里我觉得一些公益学习的比赛可以重点关注一下,多了解掌握一些比较新的技术还是很有必要的。

请看我们的每日一练: https://edu.csdn.net/dailycode 

1000、考一个含金量高的证书

我们在校期间除了全国英语等级考试(四六级)证书之外,还可以考一些本专业相关的认证,有意向进事业单位单位的话就可以考一下软考/国家等级考试,玩linux的话可以试试red hat认证,还有甲骨文认证等等。

这里呢我本人考过一个C认证,在报名认证之后有免费配套的考生服务,有工程师专业指导,系统性的训练工程化能力以及交付能力,对我的提升是除了实习工作之外最大的一部分。而且目前C认证的定位和目的都是比较别出心裁的,对标大厂职级,解决企业招聘最后一公里的问题,目前市场认可度很高,合作企业也有很多知名大厂。大家可以放心试一试。

传送门:https://ac.csdn.net/

1001、基于交付标准,开发一个可商业化的项目

我们简历上面的项目经历一栏是非常重要的,这能反映出我们在相关领域完整实战的经历和掌握技术的应用能力,如果想要把简历写满的话,项目经历这里无非就是在校期间自己的一些实训课内容,这一点是很单薄的,再好一点的话可能就是自己写过的小demo、小玩具,但是这些都不够加分,我们最好的选择是能够有一个达到可交付标准的,可以商业化的项目,这是一件非常棒的事情,简历上的项目经历这一栏就可以去自信满满的介绍自己的项目了,从而让面试官对你刮目相看。如果达不到这个水平的话,去考一次C认证,能够学到的东西足够了。

1010、四次暑假至少有一次名企访学/实习经历

学十年不如工作一年,我对这句话理解最深刻的时候是我第一次实习的时候。自信满满的我面对工作抓耳挠腮天天加班,写的东西在代码review的时候永远都有很大的提升空间。但是这也是提升最大的时候。

大厂需要的人才,哪怕是对校招生来说,也是希望能够进去就能上手干活,给公司产生效益,或者说是具有一定的岗位技能,减少培养成本。那么实习经历就是就能代表我们通过了其他企业的筛选,是我们拥有这方能力的有效证明。所以我们在校期间,在整个大学期间一共4次暑假,3次寒假,我们应该至少有过一次实习经历,有两到三次最佳。

如何进大厂实习:https://ablity.csdn.net/landing/?utm_source=yl

以上是关于你做的 9 件事表明你不是专业的 Python 开发人员的主要内容,如果未能解决你的问题,请参考以下文章

忘记你做的事,重新开始

云服务器买来之后必做的几件事——你做了吗!❤️建议收藏❤️

云服务器买来之后必做的几件事——你做了吗!❤️建议收藏❤️

下班后这9件事,决定不同的人生

三句代码解析xml

《百万IT毕业生的心声:IT专业大学生毕业前必做的十件事》