前言

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

文章目录

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

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学习扣qun:913066266 ,看看前辈们是如何学习的!从基础的python脚本到web开发、爬虫、django、数据挖掘等【PDF,实战源码】,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!每天都有大牛定时讲解Python技术,分享一些学习的方法和需要注意的小细节,点击加入我们的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 bitselse:return [0]
number_to_bits(6)

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

8. 要多考虑代码健壮性

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

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

def add(a, b):if isinstance(a, int) and isinstance(b, int):return a+belse: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'<title>(.*)</title>', 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 = capturesself.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 Falseif exc_type == self.captures:raise self.code from exc_valreturn 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_filerequest.user.save()
return HttpResponse({})

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

python核心编程:入门Python编程的8个实践性建议相关推荐

  1. python游戏编程入门 免费-python游戏编程入门 python游戏编程入门课

    python游戏编程入门 python游戏编程入门课 什么是python游戏编程入门?首先我们需要认识什么是Python Python既是一个软件工具包,也是一种语言.Python软件包包含了一个名为 ...

  2. python编程入门指南-编程入门指南

    编程入门指南 ----------------------------------------------- 编程入门指南 v1.5 --- https://zhuanlan.zhihu.com/p/ ...

  3. python四则运算器编写_0007 编程入门python语言之四则运算器

    原标题:0007 编程入门python语言之四则运算器 这节课我们来做一个四则运算器,输入2个数字和1个运算符,让程序计算出结果. 上节课我们做了加法计算器和减法计算器,课后练习做了乘法计算器和除法计 ...

  4. python游戏编程入门免费_python游戏编程入门 python游戏编程入门课

    python游戏编程入门 python游戏编程入门课 什么是python游戏编程入门?首先我们需要认识什么是Python Python既是一个软件工具包,也是一种语言.Python软件包包含了一个名为 ...

  5. 学计算机编程难吗,计算机编程入门 计算机编程难学吗

    计算机编程入门 计算机编程难学吗?有很多人在一开始学习计算机编程时都会有疑问,编程难学吗?零基础可以学编程吗?如何入门?一般要学习多久?其实,我认为编程最重要的是入门,如果你入门的时候有一个好的学习方 ...

  6. 从入门到精通:掌握Python核心知识,解锁编程新世界!

    学习Python编程的完整指南 1.引言 Python是一门流行的.易学易用的编程语言.它可以用于编写Web应用程序.数据分析.机器学习.人工智能.游戏开发和其他一些用途.本篇文章将介绍Python编 ...

  7. 编程入门python语言是多大孩子学的-包头孩子学编程python好吗

    包头孩子学编程python好吗,学习少儿编程就选童程童美,童程童美专注3-18岁少儿编程教育.历时多年,形成了以创意启蒙课程.人工智能编程.智能机器人编程.信息学奥赛编程等课程为核心的一站式编程教育平 ...

  8. 编程入门python语言是多大孩子学的-入门编程语言,让你想学Python的几个优点!...

    关注我让代码变得有趣 对于新手小白想入门编程语言来说python是一款非常合适的语言.python是一个高层次的脚本语言,它具有很强的可读性.同时它还是解释型,交互式.面相对象的语言.非常适合初学者入 ...

  9. 编程入门python语言是多大孩子学的-我的孩子需要学习Python吗?几岁开始学?有什么书籍推荐?...

    原标题:我的孩子需要学习Python吗?几岁开始学?有什么书籍推荐? 最近有一些家长问我,需不需要让孩子学习Python,孩子学习Python有什么作用? 最近确实有看到不少的机构在宣传Python, ...

  10. 编程入门python语言是多大孩子学的-不学点编程,将来怎么给孩子辅导作业―Python新手入门教程...

    为了填满AI时代的人才缺口,编程语言教育都从娃娃抓起了!如果你还不懂Python是什么将来怎么给孩子辅导作业呢? Python新手入门教程 近期,浙江省信息技术课程改革方案出台,Python言语现已断 ...

最新文章

  1. 尹伊:我眼中的Datawhale
  2. 情感分析的描述、基于词袋模型和word2vec模型的情感分析实现
  3. java arrays.sort() c_正面刚算法-Java中Arrays.sort()(一)
  4. Apache2.2.16+PHP5.3.3+MySQL5.1.49的配置方法
  5. 利用JBPM4.4的AssignmentHandler实现用户角色整合另一种构思
  6. rabbitmq java集群_RabbitMQ集群整合SpringBoot2.x
  7. python函数定义与使用
  8. vs2010下使用dmp文件和pdb文件调试时dump、exe和pdb三个文件要保持版本一致的原因
  9. 我猜,每个程序员对着电梯都想过调度算法吧
  10. 【HDU - 1301】Jungle Roads(并查集+最小生成树)(内附最小生成树两种算法 克鲁斯特尔算法amp;amp;普里姆算法)
  11. LinQ To Object 基本用法
  12. 答网友问:一个abs函数引发的问题
  13. cocos2d pod_cocos2d 和 cocos3d的版本问题
  14. Linux学习笔记018---Centos7 下安装JDK1.8
  15. 目前服务器操作系统版本,Windows操作系统的版本选择
  16. GlobalMapper20坐标转换
  17. 十八、疑案系列之——永远的无头公案
  18. 使用各种姿势舒服的部署微前端项目(上:打包与上传)
  19. 一文教你用squid将闲置的服务器搭建成爬虫使用的高匿代理服务器
  20. 比尔盖茨的十大人生定律中英对照

热门文章

  1. Angr安装与使用之使用篇(十五)
  2. Atlantis poj1151 线段树扫描线
  3. poj2054 Color a Tree
  4. Redis 数据结构之dict(2)
  5. Effective C++ -----条款50:了解new 和delete 的合理替换时机
  6. 大话设计模式之----状态模式
  7. [笔记]C++代码演示SingletonMap 单类Map实例
  8. [原创]经典软件测试技术分类
  9. php formdata 解析,系统学习前端之FormData详解
  10. android解析html新闻的方法,Android使用Jsoup解析Html表格的方法