摒弃这18个python坏习惯,让你的代码好用到起飞(代码片段)

Python学习与数据挖掘 Python学习与数据挖掘     2023-03-03     232

关键词:

大家好,今天给大家分享 18 个 Python 初学者常有的坏习惯,这些坏习惯不仅影响 Python 代码的可读性,而且 影响 Python 的运行性能。

摒弃这些坏习惯并以 Pythonic 的方式编写代码,提高的不仅仅是你的代码质量,也给阅读代码的人留下好印象。喜欢记得收藏、点赞、关注。

资料推荐

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

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()

技术交流

欢迎转载、收藏、有所收获点赞支持一下!

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

18个python编程坏习惯,一定要抛弃哦(代码片段)

...xff0c;这些坏习惯会暴露开发者在Python方面经验不足。通过摒弃这些习惯并以Pythonic的方式编写代码,可以提高你的代码质量,给看代码的人留下好印象。喜欢本文记得收藏、关注、点赞。【注】文末加入技术交流群,... 查看详情

中枪了?六种让你的python程序变慢的坏习惯(代码片段)

欢迎关注,专注Python、数据分析、数据挖掘、好玩工具!随着Python越来越流行,Python用户的数量也在增加。Python确实比较容易学。它也非常灵活,因此有更多可能的方法来实现一个功能。然而,只要有多种方... 查看详情

这18张python数据科学速查表,让你的代码能力飞起来!

欢迎关注,专注Python、数据分析、数据挖掘、好玩工具!数据科学是利用科学方法、流程、算法和系统从数据中提取价值的跨学科领域。数据科学家综合利用一系列技能(包括统计学、计算机科学和业务知识)来... 查看详情

高清版!这18张python数据科学速查表,让你的代码变得更强大!

欢迎关注,专注Python、数据分析、数据挖掘、好玩工具!数据科学是利用科学方法、流程、算法和系统从数据中提取价值的跨学科领域。数据科学家综合利用一系列技能(包括统计学、计算机科学和业务知识)来... 查看详情

每天一个好用的python库:pretty-errors让你的bug看起来与众不同(代码片段)

首发于个人公.众.号:Python编程时光,转载请私信当我们写的一个脚本或程序发生各种不可预知的异常时,如果我们没有进行捕获处理的时候,通常都会致使程序崩溃退出,并且会在终端打印出一堆密密麻麻的traceback堆栈信息来... 查看详情

学会这12个python装饰器,让你的代码更上一层楼(代码片段)

学会这12个Python装饰器,让你的代码更上一层楼Python装饰器是个强大的工具,可帮你生成整洁、可重用和可维护的代码。某种意义上说,会不会用装饰器是区分新手和老鸟的重要标志。如果你不熟悉装饰器,你可... 查看详情

因为这几个typescript代码的坏习惯,同事被罚了500块

作者:DanielBartholomae翻译:疯狂的技术宅原文链接:https://startup-cto.net/10-ba...近几年TypeScript和JavaScript一直在稳步发展。我们在过去写代码时养成了一些习惯,而有些习惯却没有什么意义。以下是我们都应该改正的10个坏习惯。1.... 查看详情

学会这10个javascript单行代码,让你的代码更优雅(代码片段)

干货推荐:学会这10个javascript单行代码,让你的代码更优雅数组去重从url获取参数并转为对象检查对象是否为空反转字符串生成随机十六进制检查当前选项卡是否在后台检测元素是否处于焦点检查设备类型文字复制到剪... 查看详情

这13个webpack插件,让你的项目起飞(代码片段)

前言相信大家在使用webpack的时候,总是不知道如何下手,对于不同的场景,总是找不到合适的webpack的插件,本系列按照github的star数量排序,整理了很多插件,建议收藏,以后用得到!本文先介绍部分高... 查看详情

这些设计坏习惯,你中枪了吗

规则就是用来打破的?这完全取决于规则本身。在移动UI设计的世界里,大家对美学、手势和动效的看法略有不同。有时一个简单的功能性应用比华丽的应用带来的效果更好,而有时候却恰恰相反。 不过,有些基本规则是人们不... 查看详情

送你6个python的日期时间库!让你的python更加得心应手!(代码片段)

内建的datetime模块让我们看看其他库是如何处理这种转换的。Dateutil通过Arrowdatetime类的实例,你可以访问Arrow的其他有用方法。例如,它的humanize()方法将日期时间翻译成人类可读的短语,就像这样:由于Maya与datetime库中很多有用... 查看详情

小豆君:你的目标是让其它工具为你服务,你要踩在巨人的肩膀上创造世界(摒弃掉你的好奇心,千万不要去追求第三方类或工具是怎么实现的,这往往会让你收效甚微,其实,你只需要熟练掌握它的接口,知道类的目的即可,

无论你是学Qt,Java,Python或其它,都需要明白一个道理:摒弃掉你的好奇心,千万不要去追求第三方类或工具是怎么实现的,这往往会让你收效甚微,其实,你只需要熟练掌握它的接口,知道类的目的即可,不可犯面向过程的毛... 查看详情

好用的办公邮箱,让你的工作效率翻倍!

...少,为此小编今日推荐给大家,TOM旗下“随心邮”产品可让你的工作效率瞬间翻倍,与客户沟通更自信。一、随心畅游,随时随地移动办公身处异地出差的你,再也不用担心错过客户或领导的重要邮件了了,打开微信关注“随心... 查看详情

几点技巧让你的python代码更加pythonic(代码片段)

文章目录1.多变量赋值2.变量值交换3.多项判断4.多列表同步处理5.去除列表重复元素6.上下文管理7.序列迭代8.获取列表内容9.字符串列表转字符串10.三目运算11.打印输出的格式12.链式比较13.字符串翻转14.双列表转字典格式15.迭代器... 查看详情

python这样注释,让你的代码看起来更加的优雅(代码片段)

〝古人学问遗无力,少壮功夫老始成〞python这样注释,让你的代码看起来更加的优雅,是不是常常感觉自己的python代码写出来,看起来特别的乱,虽然可以正常运行,但是在优雅性上似乎欠缺的很多,... 查看详情

Python重音坟墓的坏习惯?

】Python重音坟墓的坏习惯?【英文标题】:Pythonaccentgravesbadpractice?【发布时间】:2012-10-0114:14:15【问题描述】:我最近了解到,我们可以在Python中使用以下代码作为repr(x)的简写:`x`但是,我在实践中很少看到这种情况。它被认... 查看详情

熟练使用这15点,让你的springboot启动更上一层楼!

使用的是OpenJDK11。java--versionopenjdk11.0.12018-10-16OpenJDKRuntimeEnvironment18.9(build11.0.1+13)OpenJDK64-BitServerVM18.9(build11.0.1+13,mixedmode)可以按照下面这样运行基准测试。运行起来可能需要一些时间,下面会执行所有的测试。./mvnwcleanpack 查看详情

好用不卡,这些插件和配置让你的webstorm更牛逼!(代码片段)

作为前端开发者,最趁手的搬砖工具无外乎Webstorm和VSCode,Webstorm像苹果系统,闭源、收费、官方有良好而强大的开发能力、智能索引和补全功能无出其右者,VSCode就像安卓,开源、持续迭代更新、社区充满活... 查看详情