这些包括我在内都有的Python编程陋习,趁早改掉

news2024/11/26 6:21:21

在这里插入图片描述
B站|公众号:啥都会一点的研究生

相关阅读

整理了几个100%会踩的Python细节坑,提前防止脑血栓
整理了十个100%提高效率的Python编程技巧,更上一层楼
Python-列表,从基础到进阶用法大总结,进来查漏补缺
Python-元组,从基础到进阶用法大总结及与列表核心区别,进来查漏补缺
Python-字典,从基础到进阶用法大总结,进来查漏补缺
Python-集合,从基础到进阶大总结,进来查漏补缺
订阅专栏 ===> Python

首先第一个例子,很多同学都有这个习惯,包括我自己很长一段时间都用这种方式,难看且繁琐

def case_1(name, score):
    if score > 60.0:
        print("Congratulations " + name + "! your score is " + str(score))
    else:
        print("Sorry " + name + ", you didn't pass the exam")

但其实,使用f-string能简化编写方式,提升效率

def case_1(name, score):
    if score > 60.0:
        print(f"Congratulations {name}! your score is {score}")
    else:
        print(f"Sorry {name}, you didn't pass the exam")

第二个,有的同学,可能知道Python中None,False,0,空列表,空元组,空集合,空字典,空钱包等都表否定,如这个例子,虽然没错,但在工程上代码长、变量多的时候可读性将变差

def case_2(lst):
    my_list = []
    if lst:
        my_list = lst[:]
    else:
        my_list.append(1)

最好规范编写

def case_2(lst):
    my_list = []
    if len(my_list) > 0:
        my_list = lst[:]
    else:
        my_list.append(1)

说到这个,在Python中使用if结合bool(x)len(x)或其他内置函数,等效于if x,但还是得综合考虑可读性

def case_3(x):
    if x:
        pass
    
    if bool(x):
        pass
    
    if len(x):
        pass

这个例子很简单,但初学者确实容易混淆的用法,想实现x的y次幂,下意识地就会写成这样

def case_4(x, y):
    return x ^ y

但其实这是按位异或,正确的应该这样

def case_4(x, y):
    return x ** y

下一个,当需要对文件进行读写时,很多人习惯写成这样

def case_5(filepath):
    f = open(filepath, "w")
    f.write("Hello world\n") # here
    f.close()

但不知道的是,当写入发生错误时,该文件永远不会被关闭,正确的做法是使用with,即使发生了异常也能正确关闭

def case_5(filepath):
    with open(filepath) as f:
        f.write("Hello world\n")

下一个,当程序中涉及数值很大的变量,通常你可能写成如下形式

def case_6():
    x = 10000000

但其实会影响阅读,而若使用这种方式会变得简洁明了

def case_6():
    x = 10_000_000

下一个,很多人喜欢用print来debug程序

def case_7():
    print("debug info")
    print("normal info")
    print("error info")

其实使用logging打印日志更加清晰,可以很明显的看到程序输出,且还能保存在本地查阅,虽然我自己很多时候也是print,确实方便

import logging


def case_8():
    logging.debug("debug info")
    logging.info("normal info")
    logging.error("error info")
    
def main():
    level = logging.DEBUG
    fmt = "[%(level)s] %(asctime)s - %(message)s"
    logging.basicConfig(level=level, format=fmt)
    case_8()

>>> [DEBUG] 2022-10-23 14:54:55,763 - debug info
[INFO] 2022-10-23 14:54:55,763 - normal info
[ERROR] 2022-10-23 14:54:55,763 - error info

下一个,当定义函数时,若存在可变类型参数,尤其需要小心

def case_9(n, lst=[]):
    lst.append(n)
    return lst

lst1 = case_9(0) # [0]
lst2 = case_9(1) # [0, 1]

因为参数的默认值是在定义函数时定义的,而不是运行时,在该例中,每一次的调用都共享同一个列表,所以除开第一次外,之后每次调用都是从前面的结果开始添加数据,可以稍作改变达到目的

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

lst1 = case_9(0) # [0]
lst2 = case_9(1) # [1]

说到这个可变类型,球球一定注意当你把列表、字典这种传给函数时稍不注意就会改动原始数据

def case_10(lst):
    lst2 = lst
    lst2.append(1)

init_list = [0, 1, 2]

case_10(init_list) # init_list : [0, 1, 2, 1]

此时需要对其进行拷贝,构造新的对象

def case_10(lst):
    lst2 = lst[:] # copy() deepcopy()
    lst2.append(1)

init_list = [0, 1, 2]

case_10(init_list) # init_list : [0, 1, 2]

当遍历字典时,默认是遍历键,这两种方式其实是相同的

def case_11():
    d = {"a": 1, "b": 2, "c": 3}
    for key in d:
        pass
    
    for key in d.keys():
        pass

关于推导式,不仅适用于列表,而元组、字典、集合均可以使用其各自的推导式

def case_12():
    data = [0, 1, 2, 3]
    d = {i: i * i for i in data}
    l = [i * i for i in data]
    s = {i * i for i in data}
    t = (i * i for i in data)

下一个,我们可以借助元组来进行解包,在Python中,其实形如x这种类型的数据都是元组,只是没穿上括号的衣服,类似的还有return返回值

def case_13():
    x = 1, 2 # tuple
    d1 = x[0]
    d2 = x[1]

下一个,很多时候我们会借助time库统计程序运行时间,并习惯使用两个time.time()相减的方式计算

import time

def case_14():
    t1 = time.time()
    time.sleep(1)
    t2 = time.time()
    print(t2 - t1)

time.perf_counter()具有最高测量分辨率的时钟,统计结果更加准确,此外,time.clock已经在3.8中被废除了

import time

def case_14():
    t1 = time.perf_counter()
    time.sleep(1)
    t2 = time.perf_counter()
    print(t2 - t1)

下一个,使用isinstance代替==检查类型,避免如namedtuple这种子类带来的判断错误问题

from collections import namedtuple

def case_15():
    line = namedtuple('line', ['k', 'b'])
    l = line(1, 5)
    
    if type(l) == tuple:
        print("it's a tuple") 
    else:
        print("it's not a tuple") # √
    
    if isinstance(l, tuple):
        print("it's a tuple") # √
    else:
        print("it's not a tuple")

以上就是本期的全部内容,整理不易,如果有帮助到你就点赞关注吧,我是啥都生,我们下期再见~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytest参数化详解

文章目录一.概念二.单个参数三.多个参数案例1案例2:使用py文件存放测试数据案例3:使用yaml文件存放测试数据案例4:使用json文件存放测试数据四.对测试类参数化案例1一.概念 参数化,就是把测试过程中的数据提取出来,通过参数传递不同的数据来驱动用例运行…

健身房信息管理系统(PHP+Html+MySQL)

3.需求分析 3.1 健身房管理系统功能需求 健身房管理信息系统,提供动作教学,健身基本动作可视化,健身知识层次化,一个完整的健身房管理系统,为健身爱好者对健身知识的了解和健身动作的了解提供了便利,系统应…

网络协议:透彻解析HTTPS协议

本篇内容包括:HTTPS 协议概述,SSL 与 TLS(SSL 与 TLS 概述、SSL证书 和 SSL 与 TLS 二者之间关系),以及 HTTPS 下浏览器访问一个网站的全过程的内容! 文章目录一、HTTPS 协议概述二、SSL 与 TLS1、SSL 与 T…

两种让python输出更加美观的方式,三分钟看完就会

嗨害大家好鸭!我是小熊猫❤ 最近要给大家持续带来干货输出啦! 赶紧收藏起来,以后查漏补缺要用到的喔~ 源码、资料电子书点击这里 1.输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数。 (第三种方式是使用文件对象的 write…

Web前端开发技术课程大作业——南京旅游景点介绍网页代码html+css+javascript

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有…

二选一工作器引入的Verilog语法

二选一工作器引入的Verilog语法 ——XILINX 基于BASYS 3板 状态机、线性序列机、学习仿真 DDS:矩阵键盘、DAC,LCD/数码管,这些模块间的接口逻辑 常见的接口设计:SPI、IIC、UART 学习:三八译码器、计数器电灯、学习开发工具的使用…

年轻人不用太过于努力

周末和一个毕业一年多的朋友聊天,我随口问了一句「你有什么想跟我分享的」,然后他就说了上面的那句话。「年轻人不用太过于努力」和读者聊天会做成我的一个公众号专栏,内容有也会越来越丰富,全部的内容都会收录到我的程序人生专栏…

RK3568平台开发系列讲解(音频篇)Audio 音量控制流程

🚀返回专栏总目录 文章目录 一、安卓音量控制流程简介二、什么是AudioService沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要介绍安卓音量控制流程。 一、安卓音量控制流程简介 Android音频系统,分为数据流和策略两部分。 数据流描述了音频数据从数据源…

【C++哈希表】哈希碰撞,线性探测,二次探测 ,荷载因子,闭散列的实现及string需要特化

目录 1.哈希概念 2.哈希碰撞 3.解决哈希冲突 4.哈希表闭散列实现 框架: 4.3插入 1.哈希概念 线性表以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。线性表查找…

首届数据安全大赛初赛web

文章目录easy_nodeeasy_webeasy_phar刮刮乐my_cloudeasy_node 访问src得到源码 第一步需要伪造admin用户 可以看到都是通过jwt进行加密解密 很容易想到jwt的几种攻击方式,可以参考下文章https://blog.csdn.net/miuzzx/article/details/111936737 首先试下改为n…

Linux篇【4】:Git,Gitee,GitHub

在 Linux 系统中,如何将普通源文件和普通头文件上传到 Gitee ? Git 是一个分布式的版本控制器,目前可以理解成百度云盘,其次,在 Linux 系统中,Git 也是一个软件/工具/指令,在 Windows 系统中&a…

212 - 218. MySQL索引的基本用法

1.索引的简介 1.1 索引的概念 是数据库对象,实现数据库快速查询 1.2 为什么使用索引 实现数据库快速查询,提高查询速度 1.3 索引的分类 a.普通索引 最基本的索引,对字段数据的类型和值没有任何限制,数据类型可以任意,…

电脑技巧:Win10自带的6个实用功能,你都会用吗

目录 1、系统自带计算器 2、Win10自带截图功能 3、 Win10自带的手写输入 4、历史剪贴板 5、定时提醒 6、自带录屏功能 1、系统自带计算器 系统里自带了一个计算器大家都知道,打开是这个样子。 但当你点击计算器左上角的三个横杠图标后会发现这个计算器功能非常强大。…

Python画爱心——谁能拒绝用代码敲出来会跳动的爱心呢~

还不快把这份浪漫拿走!!节日就快到来了,给Ta一个惊喜吧~ 今天给大家分享一个浪漫小技巧,利用Python制作一个立体会动的心动小爱心 成千上百个爱心汇成一个大爱心,从里到外形成一个立体状,给人视觉上的冲击…

phy层深入了解编码

1,我们知道mac层通过MDI来访问phy层的,那么phy层到光模块数据是怎么处理的呢。从下面这个图中可以看出基本的关系: serdies接口说明: Medium Independent Interface (MII): 介质无关接口。提供公共接口,屏蔽多个物理…

基于haproxy负载均衡实现lamp与apache的高可用

环境准备 IP主机名服务系统192.168.47.10node1ansiblecentos8192.168.47.20node2lampcentos8192.168.47.30node3apachecentos8192.168.47.40node4haproxycentos8 基于上一篇的文章在node3主机上部署apache 一、部署haproxy 准备主机清单组织 //创建角色 [studentserver rol…

服务器没网 利用本地机器反向隧道 设置conda代理配置环境

适用情况 S是局域网内服务器,无法联网。 C为本地机器,可以通过ssh链接服务器。 本篇文章主要为了可以让S可以借用C的网络进行conda环境配置,所采取的设置。 1.利用Xshell建立反向隧道 在连接设置的ssh中点击隧道,点击设置&#…

SpringBoot--网上商城项目(前端搭建、首页、用户登录、盐加密、登录令牌管理)

文章目录 一、项目技术点 数据表 二、构建SpringBoot项目 1、创建SpringBoot项目并配置pom 配置pom 2、application.yml的配置 3、首页访问 三、首页功能 工具类!!! 首页数据绑定语法 四、用户明文登录 五、前端及数据库密码加密 …

C. String Transformation 1(图的思想)

Problem - 1384C - Codeforces 题意: 考拉有两个长度相同的字符串A和B(|A||B|n),由前20个小写英文字母组成(即从a到t)。 在一步棋中,Koa。 (选择A的某个位置子集p1,p2,...,pk(k≥1;1≤pi≤n;…

Codeforces Round #831 (Div. 1 + Div. 2)

A. Factorise NM 题目链接:Dashboard - Codeforces Round #831 (Div. 1 Div. 2) - Codeforces 样例输入: 3 7 2 75619样例输出: 2 7 47837题意:给定一个质数,让我们输出一个质数使得这两个数相加为一个合数。 分…