热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

新手入门Python编程的8个实用建议

这篇文章主要介绍了Python编程的8个实用建议,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

前言

我们在用Python进行机器学习建模项目的时候,每个人都会有自己的一套项目文件管理的习惯,我自己也有一套方法,是自己曾经踩过的坑踩过的雷总结出来的,现在在这里分享一下给大家,因为很多伙伴是接触Python编程入门不久,也希望大家少走弯路,多少有些地方可以给大家借鉴。

目录先放出来

  • 项目文件事先做好归档
  • 永远不要手动修改源数据并且做好备份
  • 做好路径的正确配置
  • 代码必要的地方做好备注与说明
  • 加速你的Python循环代码
  • 可视化你的循环代码进度
  • 使用高效的异常捕获工具
  • 要多考虑代码健壮性

1. 项目文件事先做好归档

每次开始一个新工作的时候,以前的我总是贪图方便,Code、Data、文档都集中放在一个文件夹内,看起来很乱,一度让回溯过程十分痛苦,或者是换了部电脑,文件全都运行不行了,需要自行修改路径,十分痛苦。

经过自己一番探索,大家可以大致将项目分成几个子文件夹,code放在主文件夹里:


2. 永远不要手动修改源数据并且做好备份

我们需要对源数据进行好备份,方便我们下一次进行回溯,可以进行下一步的操作或者是对中间步骤的修改,而且,对代码等其他文件也是需要做好备份的,以免出现意外丢失。

这里来自良许Linux 的一篇文章,推荐了4个工具:

  • Git版本控制系统
  • Rsync文件备份
  • Dropbox云存储
  • Time Machine时光机器

更多的工具介绍和使用我这边就不展开,大家可以去自行了解呗。

3. 做好路径的正确配置

很多同学在写路径的时候都很喜欢直接用绝对路径,虽然一般情况下不会有什么问题,但如果代码共享给其他人学习或者运行的时候,问题就来了,很多情况下都不能直接跑通,

这里建议:

  • 使用相对路径:脚本位于主目录下,其他资源(如数据、第三方包等)在其同级或低级目录下,如 ./data/processed/test1.csv
  • 全局路径配置变量:
# 设置主目录
HOME_PATH = r'E:ML90615- PROJECT1'
# 读取数据
data = open(HOME_PATH+'/data/processed/test1.csv')
data = pd.read_csv(data)
data.head()

4. 代码必要的地方做好备注与说明

这个我相信大多数人都感同身受了,不信?拿回一个月前自己写的代码看看吧,看一下能看懂多少(如果没有做好备注说明的话)

5. 加速你的Python循环代码

这里推荐 云哥(Python与算法之美)的一篇文章:24式加速你的python

收藏起来,多看多几次,养成好习惯呗,这样子你写代码才会越来越快~

6. 可视化你的循环代码进度

这里介绍一个Python库,tqdm,先安装一下:pip install tqdm

这个是一个可以显示循环进度的库,有了它就可以更加运筹帷幄了。

大家可以看下面的例子:


7. 使用高效的异常捕获工具

异常bug定位,以前的我经常也是一条print()函数走到底,虽然说也没什么问题,但效率上还是会比较慢,后来发现了一个叫PySnooper的装饰器,仿佛发现了新大陆。

我们一般debug,都是在我们可能觉得会有问题的地方,去打印输出,看下实际输出了什么,然后思考问题所在,这需要我们去改code,非常细致地改,相比较直接加个装饰器,是十分麻烦的。

大家可以看看Example:

import pysnooper
@pysnooper.snoop('./file.log')
def number_to_bits(number):
 if number:
 bits = []
 while number:
 number, remainder = divmod(number, 2)
 bits.insert(0, remainder)
 return bits
 else:
 return [0]
number_to_bits(6)

我们把函数每一步的输出都保存为file.log,我们可以直接去看到底哪里出了问题。


项目地址:https://github.com/cool-RR/pysnooper

8. 要多考虑代码健壮性

何为代码的健壮性,顾名思义,就是可以抵挡得住各种异常场景的测试,异常处理工作由“捕获”和“抛出”两部分组成。“捕获”指的是使用 try ... except 包裹特定语句,妥当的完成错误流程处理。而恰当的使用 raise 主动“抛出”异常,更是优雅代码里必不可少的组成部分,下面总结几点供大家参考:

1)知道要传入的参数是什么,类型,个数 (异常处理,逻辑判断)

def add(a, b):
 if isinstance(a, int) and isinstance(b, int):
 return a+b
 else:
 return '参数类型错误'
print(add(1, 2))
print(add(1, 'a'))

2)只做最精准的异常捕获

我们有的时候想着让脚本work才是王道,所以不管三七二十一就搞一个大大的try...except把整块代码包裹起来,但这样很容易把原本该被抛出的 AttibuteError 吞噬了。从而给我们的 debug 过程增加了不必要的麻烦。

所以,我们永远只捕获那些可能会抛出异常的语句块,而且尽量只捕获精确的异常类型,而不是模糊的 Exception。

from requests.exceptions import RequestException
def save_website_title(url, filename):
 try:
 resp = requests.get(url)
 except RequestException as e:
 print(f'save failed: unable to get page content: {e}')
 return False
# 这段正则操作本身就是不应该抛出异常的,所以我们没必要使用 try 语句块
# 假如 group 被误打成了 grop 也没关系,程序马上就会通过 AttributeError 来
# 告诉我们。
obj = re.search(r'', resp.text)
if not obj:
 print('save failed: title tag not found in page content')
 return False
title = obj.group(1)
try: with open(filename, 'w') as fp:
 fp.write(title)
except IOError as e:
 print(f'save failed: unable to write to file {filename}: {e}')
 return False
else:
 return True

3)异常处理不应该喧宾夺主

像上一条说到的异常捕获要精准,但如果每一个都很精准的话,其实我们的代码里就会有很多try...except语句块,以至于扰乱核心代码,代码整体阅读性。

这里,我们可以利用上下文管理器来改善我们的异常处理流程,简化重复的异常处理逻辑。

class raise_api_error:
"""captures specified exception and raise ApiErrorCode instead
:raises: AttributeError if code_name is not valid
"""
def __init__(self, captures, code_name):
 self.captures = captures
 self.code = getattr(error_codes, code_name)
def __enter__(self):
 # 该方法将在进入上下文时调用
 return self
def __exit__(self, exc_type, exc_val, exc_tb):
 # 该方法将在退出上下文时调用
 # exc_type, exc_val, exc_tb 分别表示该上下文内抛出的
 # 异常类型、异常值、错误栈
 if exc_type is None:
 return False
 if exc_type == self.captures:
 raise self.code from exc_val
 return False

在上面的代码里,我们定义了一个名为 raise_api_error 的上下文管理器,它在进入上下文时什么也不做。但是在退出上下文时,会判断当前上下文中是否抛出了类型为 self.captures 的异常,如果有,就用 APIErrorCode 异常类替代它。

使用上下文管理器后,简洁的代码如下:

def upload_avatar(request):
 """用户上传新头像"""
with raise_api_error(KeyError, 'AVATAR_FILE_NOT_PROVIDED'):
 avatar_file = request.FILES['avatar']
with raise_api_error(ResizeAvatarError, 'AVATAR_FILE_INVALID'),
 raise_api_error(FileTooLargeError, 'AVATAR_FILE_TOO_LARGE'):
 resized_avatar_file = resize_avatar(avatar_file)
with raise_api_error(Exception, 'INTERNAL_SERVER_ERROR'):
 request.user.avatar = resized_avatar_file
 request.user.save()
return HttpResponse({})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库
    【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库 ... [详细]
  • AI炼金术:KNN分类器的构建与应用
    本文介绍了如何使用Python及其相关库(如NumPy、scikit-learn和matplotlib)构建KNN分类器模型。通过详细的数据准备、模型训练及新样本预测的过程,展示KNN算法的实际操作步骤。 ... [详细]
  • 在OpenCV 3.1.0中实现SIFT与SURF特征检测
    本文介绍如何在OpenCV 3.1.0版本中通过Python 2.7环境使用SIFT和SURF算法进行图像特征点检测。由于这些高级功能在OpenCV 3.0.0及更高版本中被移至额外的contrib模块,因此需要特别处理才能正常使用。 ... [详细]
  • 精选10款Python框架助力并行与分布式机器学习
    随着神经网络模型的不断深化和复杂化,训练这些模型变得愈发具有挑战性,不仅需要处理大量的权重,还必须克服内存限制等问题。本文将介绍10款优秀的Python框架,帮助开发者高效地实现分布式和并行化的深度学习模型训练。 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • 分享两个GitHub链接,今天看到的,超赞超赞不能更赞了,答应我一定要去看好吗~~~~不论是笔记还是github中分享的其它资源ÿ ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 龙蜥社区开发者访谈:技术生涯的三次蜕变 | 第3期
    龙蜥社区的开发者们通过自己的实践和经验,推动着开源技术的发展。本期「龙蜥开发者说」聚焦于一位资深开发者的三次技术转型,分享他在龙蜥社区的成长故事。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • 本文介绍了一种方法,通过使用Python的ctypes库来调用C++代码。具体实例为实现一个简单的加法器,并详细说明了从编写C++代码到编译及最终在Python中调用的全过程。 ... [详细]
  • 深入解析层次聚类算法
    本文详细介绍了层次聚类算法的基本原理,包括其通过构建层次结构来分类样本的特点,以及自底向上(凝聚)和自顶向下(分裂)两种主要的聚类策略。文章还探讨了不同距离度量方法对聚类效果的影响,并提供了具体的参数设置指导。 ... [详细]
  • 【转】强大的矩阵奇异值分解(SVD)及其应用
    在工程实践中,经常要对大矩阵进行计算,除了使用分布式处理方法以外,就是通过理论方法,对矩阵降维。一下文章,我在 ... [详细]
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
author-avatar
别拿明天会好做借口
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有