梳理总结Python开发中需要摒弃的18个坏习惯


Posted in Python onJanuary 22, 2022

废话不多说,我们开始学习吧!

1、拼接字符串用 + 号

坏的做法:

def manual_str_formatting(name, subscribers):
    if subscribers > 100000:
        print("Wow " + name + "! you have " + str(subscribers) + " subscribers!")
    else:
        print("Lol " + name + " that's not many subs")

好的做法是使用 f-string,而且效率会更高:

def manual_str_formatting(name, subscribers):
    # better
    if subscribers > 100000:
        print(f"Wow {name}! you have {subscribers} subscribers!")
    else:
        print(f"Lol {name} that's not many subs")

2、使用 finaly 而不是上下文管理器

坏的做法:

def finally_instead_of_context_manager(host, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect((host, port))
        s.sendall(b'Hello, world')
    finally:
        s.close()

好的做法是使用上下文管理器,即使发生异常,也会关闭 socket::

def finally_instead_of_context_manager(host, port):
    # close even if exception
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((host, port))
        s.sendall(b'Hello, world')

3、尝试手动关闭文件

坏的做法:

def manually_calling_close_on_a_file(filename):
    f = open(filename, "w")
    f.write("hello!\n")
    f.close()

好的做法是使用上下文管理器,即使发生异常,也会自动关闭文件,凡是有上下文管理器的,都应该首先采用:

def manually_calling_close_on_a_file(filename):
    with open(filename) as f:
        f.write("hello!\n")
    # close automatic, even if exception

4、except 后面什么也不写

坏的做法:

def bare_except():
    while True:
        try:
            s = input("Input a number: ")
            x = int(s)
            break
        except:  # oops! can't CTRL-C to exit
            print("Not a number, try again")

这样会捕捉所有异常,导致按下 CTRL-C 程序都不会终止,好的做法是

def bare_except():
    while True:
        try:
            s = input("Input a number: ")
            x = int(s)
            break
        except Exception:  # 比这更好的是用 ValueError
            print("Not a number, try again")

5、函数参数使用可变对象

如果函数参数使用可变对象,那么下次调用时可能会产生非预期结果,坏的做法

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

    l1 = append(0)  # [0]
    l2 = append(1)  # [0, 1]

好的做法:

def mutable_default_arguments():

    def append(n, l=None):
        if l is None:
            l = []
        l.append(n)
        return l

    l1 = append(0)  # [0]
    l2 = append(1)  # [1]

6、从不用推导式

坏的做法

squares = {}
for i in range(10):
    squares[i] = i * i

好的做法

odd_squares = {i: i * i for i in range(10)}

7、推导式用的上瘾

推导式虽然好用,但是不可以牺牲可读性,坏的做法

c = [
    sum(a[n * i + k] * b[n * k + j] for k in range(n))
    for i in range(n)
    for j in range(n)
]

好的做法:

c = []
for i in range(n):
    for j in range(n):
        ij_entry = sum(a[n * i + k] * b[n * k + j] for k in range(n))
        c.append(ij_entry)

8、检查类型是否一致用 ==

坏的做法

def checking_type_equality():
    Point = namedtuple('Point', ['x', 'y'])
    p = Point(1, 2)

    if type(p) == tuple:
        print("it's a tuple")
    else:
        print("it's not a tuple")

好的做法

def checking_type_equality():
    Point = namedtuple('Point', ['x', 'y'])
    p = Point(1, 2)

    # probably meant to check if is instance of tuple
    if isinstance(p, tuple):
        print("it's a tuple")
    else:
        print("it's not a tuple")

9、用 == 判断是否单例

坏的做法

def equality_for_singletons(x):
    if x == None:
        pass

    if x == True:
        pass

    if x == False:
        pass

好的做法

def equality_for_singletons(x):
    # better
    if x is None:
        pass

    if x is True:
        pass

    if x is False:
        pass

10、判断一个变量用 bool(x)

坏的做法

def checking_bool_or_len(x):
    if bool(x):
        pass

    if len(x) != 0:
        pass

好的做法

def checking_bool_or_len(x):
    # usually equivalent to
    if x:
        pass

11、使用类 C 风格的 for 循环

坏的做法

def range_len_pattern():
    a = [1, 2, 3]
    for i in range(len(a)):
        v = a[i]
        ...
    b = [4, 5, 6]
    for i in range(len(b)):
        av = a[i]
        bv = b[i]
        ...

好的做法

def range_len_pattern():
    a = [1, 2, 3]
    # instead
    for v in a:
        ...

    # or if you wanted the index
    for i, v in enumerate(a):
        ...

    # instead use zip
    for av, bv in zip(a, b):
        ...

12、不实用 dict.items

坏的做法

def not_using_dict_items():
    d = {"a": 1, "b": 2, "c": 3}
    for key in d:
        val = d[key]
        ...

好的做法

def not_using_dict_items():
    d = {"a": 1, "b": 2, "c": 3}
    for key, val in d.items():
        ...

13、解包元组使用索引

坏的做法

mytuple = 1, 2
x = mytuple[0]
y = mytuple[1]

好的做法

mytuple = 1, 2
x, y = mytuple

14、使用 time.time() 统计耗时

坏的做法

def timing_with_time():
    start = time.time()
    time.sleep(1)
    end = time.time()
    print(end - start)

好的做法是使用 time.perf_counter(),更精确:

def timing_with_time():
   # more accurate
    start = time.perf_counter()
    time.sleep(1)
    end = time.perf_counter()
    print(end - start)

15、记录日志使用 print 而不是 logging

坏的做法

def print_vs_logging():
    print("debug info")
    print("just some info")
    print("bad error")

好的做法

def print_vs_logging():
    # versus
    # in main
    level = logging.DEBUG
    fmt = '[%(levelname)s] %(asctime)s - %(message)s'
    logging.basicConfig(level=level, format=fmt)

    # wherever
    logging.debug("debug info")
    logging.info("just some info")
    logging.error("uh oh :(")

16、调用外部命令时使用 shell=True

坏的做法

subprocess.run(["ls -l"], capture_output=True, shell=True)

如果 shell=True,则将 ls -l 传递给/bin/sh(shell) 而不是 Unix 上的 ls 程序,会导致 subprocess 产生一个中间 shell 进程, 换句话说,使用中间 shell 意味着在命令运行之前,命令字符串中的变量、glob 模式和其他特殊的 shell 功能都会被预处理。比如,$HOME 会在在执行 echo 命令之前被处理处理。

好的做法是拒绝从 shell 执行:

subprocess.run(["ls", "-l"], capture_output=True)

17、从不尝试使用 numpy

坏的做法

def not_using_numpy_pandas():
    x = list(range(100))
    y = list(range(100))
    s = [a + b for a, b in zip(x, y)]

好的做法:

import numpy as np
def not_using_numpy_pandas():
    # 性能更快
    x = np.arange(100)
    y = np.arange(100)
    s = x + y

18、喜欢 import *

坏的做法

from itertools import *

count()

这样的话,没有人直到这个脚本到底有多数变量, 好的做法:

from mypackage.nearby_module import awesome_function

def main():
    awesome_function()

if __name__ == '__main__':
    main()

到此这篇关于梳理总结Python开发中需要摒弃的18个坏习惯的文章就介绍到这了,更多相关Python 坏习惯内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现bucket排序算法实例分析
May 04 Python
Python使用redis pool的一种单例实现方式
Apr 16 Python
Sublime开发python程序的示例代码
Jan 24 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
详解Python 协程的详细用法使用和例子
Jun 15 Python
浅析python中while循环和for循环
Nov 19 Python
使用Python测试Ping主机IP和某端口是否开放的实例
Dec 17 Python
使用TensorFlow对图像进行随机旋转的实现示例
Jan 20 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 22 Python
如何在python中实现ECDSA你知道吗
Nov 23 Python
python 详解turtle画爱心代码
Feb 15 Python
基于Python编写简易版的天天跑酷游戏的示例代码
Mar 23 Python
Pandas搭配lambda组合使用详解
Jan 22 #Python
Python中的tkinter库简单案例详解
Jan 22 #Python
解析python中的jsonpath 提取器
Jan 18 #Python
Python中如何处理常见报错
Jan 18 #Python
Python机器学习应用之工业蒸汽数据分析篇详解
用Python可视化新冠疫情数据
Python机器学习应用之基于线性判别模型的分类篇详解
You might like
php实现html标签闭合检测与修复方法
2015/07/09 PHP
php表单处理操作
2017/11/16 PHP
PHP+ajax实现获取新闻数据简单示例
2018/05/08 PHP
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
javascript 中that的含义示例介绍
2014/05/14 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
2015/08/13 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
vue省市区三联动下拉选择组件的实现
2017/04/28 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
2017/12/26 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
2019/10/26 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python中循环后使用list.append()数据被覆盖问题的解决
2018/07/01 Python
python得到一个excel的全部sheet标签值方法
2018/12/10 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
Clarisonic美国官网:科莱丽声波洁面仪
2017/10/12 全球购物
新西兰廉价汽车租赁:Snap Rentals
2018/09/14 全球购物
.NET概念性的面试题
2012/02/29 面试题
优秀员工自荐书范文
2013/12/08 职场文书
煤矿班组长的职责
2013/12/25 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
西岭雪山导游词
2015/02/06 职场文书
接待员岗位职责范本
2015/04/15 职场文书
安全伴我行主题班会
2015/08/13 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript