你做的 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官方指定的编码规范
我们大多数人都犯了这个罪,
我承认我有罪
在我被取消之前,我知道我在这篇文章中的一些代码可能违反了 PEP-8 的规则,但事实是痛苦的,需要被告知,遵循 PEP-8 风格和指南让其他人更容易阅读并理解你的代码。
老外的这篇文章在 medium 的邮件推荐中,可能老外知道自己这篇文章的示例代码也违反了 pep8 规范,怕被取消推荐了,我猜的,不保真。
不推荐
>>> def function():
... x = [1,2,3]
... y= [2,3,5]
... z = [1, 2,3]
...
>>> def value(x = 7):
... ...
...
推荐
>>> def function():
... x = [1, 2, 3]
... y = [2, 3, 5]
... z = [1, 2, 3]
...
>>> def number(x=7):
... ...
...
要阅读更多关于 PEP-8 风格和指南的信息,请查看这篇文章 https://realpython.com/python-pep8/。
感谢阅读,希望这篇文章值得你花时间。
公众号【waynblog】每周更新博主最新技术文章,欢迎大家关注
你做的 9 件事表明你不是专业的 Python 开发人员的更多相关文章
- 安装完Ubuntu 14.04要做的九件事
www.linuxidc.com/Linux/2014-04/100411.htm 1.看看有哪些新特性 安装完之后的第一件事肯定是看看Ubuntu 14.04有哪些新的特性. Ubuntu 14.0 ...
- 安装 Kali Linux 后需要做的 20 件事
安装 Kali Linux 后需要做的 20 件事 本文含有我觉得有用的每一件事情.本文分为三大部分: 专门针对Kali用户 Kali Linux是来自Debian的一个特殊版本,Kali Linux ...
- 安装 CentOS 7 后必做的七件事
原文 安装 CentOS 7 后必做的七件事 CentOS 是最多人用来运行服务器的 Linux 版本,最新版本是 CentOS 7.当你兴趣勃勃地在一台主机或 VPS 上安装 CentOS 7 后, ...
- 亲身体验:digitalocean vps能做的10件事
我写过一篇亲身体验:digitalocean和linode评测哪个好,帮助不少网友选购价格便宜性能优异的免备案vps,相信大家对两家产品有所了解.vps的性能和用途远远超过传统的虚拟主机,你拥有独立I ...
- 刚安装Fedora 23工作站后,你必须要做的24件事
[51CTO.com快译]Fedora 23工作站版本已发布,此后我们就一直在密切关注它.我们已经为新来读者介绍了一篇安装指南:<Fedora 23工作站版本安装指南> 还有一篇介绍如何从 ...
- 新手学习SEO要做的七件事是什么?
学习SEO可能不那么先进的编程,学习SEO不可能掌握网页设计,学习SEO不需要学习SEO DIV + CSS;不是一个困难的任务,但是在学习过程中,如果你想掌握SEO,那么我们要做的几件事. 1.学习 ...
- IntelliJ IDEA安装后需要必须做的一件事
把Alt+斜杆 删除 Ctrl+空格修改成 Alt+斜杆 Ctrl+空格用过输入法的人都应该知道为什么要做上面一件事
- 在 PHP 7 中不要做的 10 件事
在 PHP 7 中不要做的 10 件事 1. 不要使用 mysql_ 函数 这一天终于来了,从此你不仅仅“不应该”使用mysql_函数.PHP 7 已经把它们从核心中全部移除了,也就是说你需要迁移到好 ...
- Ubuntu 16.04 LTS安装好之后需要做的15件事
看到这篇文章说明你已经从老版本升级到 Ubuntu 16.04 或进行了全新安装,在安装好 Ubuntu 16.04 LTS 之后建议大家先做如下 15 件事.无论你是刚加入 Ubuntu 行列的新用 ...
- 安装Ubuntu 13.04后要做的六件事
2013-05-07 09:23 最新版本的Ubuntu已经新鲜出炉:Ubuntu 13.04,代号为Raring Ringtail.作为幕后开发Ubuntu Linux的公司,Canonica ...
随机推荐
- 【.NET】控制台应用程序的各种交互玩法
老周是一个不喜欢做界面的码农,所以很多时候能用控制台交互就用控制台交互,既方便又占资源少.有大伙伴可能会说,控制台全靠打字,不好交互.那不一定的,像一些选项类的交互,可以用键盘按键(如方向键),可比用 ...
- 将Abp默认事件总线改造为分布式事件总线
@ 目录 原理 创建分布式事件总线 实现自动订阅和事件转发 使用 启动Redis服务 配置 传递Abp默认事件 传递自定义事件 项目地址 原理 本地事件总线是通过Ioc容器来实现的. IEventBu ...
- DHorse v1.5.0 发布,基于 k8s 的发布平台
版本说明 新增特性 支持同一机器部署多个DHorse服务: 支持Next..NET应用部署: 优化Node.Nuxt应用构建和部署的性能: 默认使用fabric8客户端与k8s集群交互,可以通过指定参 ...
- 当数字孪生系统接入CesiumJS,将为智慧城市项目带来怎样的改变?
数字孪生系统接入CesiumJS的契机,正是智慧城市项目的需要.因为许多智慧城市项目中包含了大量地形.倾斜摄影.DOM.DEM等GIS数据,那么为了能够在数字孪生系统中导入这些GIS数据,同时让这些数 ...
- Redis配置模式及各自优缺点
大家好,我是闲者,今天简单聊下redis部署模式.Redis支持多种不同的数据结构和模式,以满足不同的使用场景.以下是一些常见的Redis配置和模式示例以及详解.原文地址:Redis配置模式及各自优缺 ...
- reboot详解
linux下reboot命令详解 linux reboot 命令详解 功能说明:重新开机. 语 法:dreboot [-dfinw] 补充说明:执行reboot指令可让系统停止运作,并重新开机. 参 ...
- 快速批量升级 NugetPackage 版本
批量升级项目中的 Nuget 有时候我们需要升级整个解决方案中的某些Nuget版本,如果每个手动使用NuGet Package Manager 会很麻烦.经过一个周末的踩坑,我找到一个解决方案. Na ...
- 如何在IIS上部署docsify以及404问题
操作步骤 创建一个文件夹,在文件夹中新建2个文件 index.html:入口文件,整个网站只需要这个html文件,其他文件都是md文件 README.md:主页内容,如果没有这个文件,访问时提示404 ...
- 如何实现gif格式图片倒放效果?
不知道大家看电影的时候有没有发现出现过这样的一个神奇场景: 一个子弹竟然从远处飞回到手枪中,整个场景呈现一种时空倒流的感觉? 正文 先来几个有趣的倒放动图娱乐一下~ 猫:我谢谢你们全家 萌娃快乐针 尊 ...
- [Python急救站]百钱买百鸡
百钱买百鸡:一人用100元买了100只鸡,其中公鸡5元一只,母鸡3元一只,小鸡1元一只.问:公鸡.母鸡.小鸡各多少只? 程序采用穷举法. for x in range(1, 21): for y in ...