前言

我们在用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,我们可以直接去看到底哪里出了问题。

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

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

编程python用什么软件比较好-新手入门Python编程的8个实用建议相关推荐

  1. 新手入门python的注意事项_【新手入门Python语言的方法】

    2018年编程语言榜,Python位居榜首,很多学员对这门表示有着强烈的兴趣. 中公优教育小编这次就来谈谈Python入门方法. 下面直接进入今天的主题: 学编程,python算是一个不错的选择.因为 ...

  2. 30岁学python有前途吗-30岁新手入门python!尝试人生另一种可能

    上篇笔记之后,很多人私信我有关学习提高的一些方法和资料.今天先来认真讲一下python入门[询问度最高] • �心态调整,我最想说的话: 1. 不要神化编程,觉得它是一个遥不可及的事情.其实编程.英语 ...

  3. python公开课免费-公开课 | Python大牛免费带你4天入门Python

    原标题:公开课 | Python大牛免费带你4天入门Python 作为刚入门的同学,无非视频.书籍.网站帖子之类的学习方式,视频虽然讲得详细,但是所需要花费的时间也是巨大的,据我了解很少有人能持之以恒 ...

  4. 新手入门指导:Vue 2.0 的建议学习顺序

    起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要用任何构建工具,就只用最简单的 <script> ...

  5. 初学者编写python用什么软件好_初学者编写python用什么软件

    初学者编写python用什么软件 以下是常用的几款Python代码编辑器和Python集成开发工具. 一.Python代码编辑器 1. Sublime Text Sublime Text是一款非常流行 ...

  6. python新手入门-python新手入门方法

    随着人工智能 大数据的火热 Python成为了广大科学家和普通大众的学习语言.在学习Python的过程中 有很多人感到迷茫 不知道自己该从什么地方入手,今天我们就来说一些新手该如何学习Python编程 ...

  7. python基本输入输出函数有_新手学Python,输入输出函数、赋值语句常见5个错误,弄懂即过关...

    从4月21日起,大陈开始教初一的学生学Python,目前已经上了2节课.学生基本掌握了表达式的构建以及赋值语句.变量的使用,以及input(输入函数).print(输出函数)的使用方法. 以下是大陈在 ...

  8. python游戏制作软件_10 个最值得 Python 新人练手的有趣项目

    原标题:10 个最值得 Python 新人练手的有趣项目 作者 | Claire D. Costa 编译 | Wendy 有很多 Python 新手留言问:"Python 入门很久了,但项目 ...

  9. GitHub Top 45:新手入门 Python,值得推荐的优质资源!

    公众号关注 "GitHubDaily" 设为 "星标",每天带你逛 GitHub! 图片来源:edureka.co 翻译 | 林椿眄 编辑 | Donna [导 ...

最新文章

  1. asp之GetArray提取链接地址,以$Array$分隔的代码
  2. 78. Spring Boot完美使用FastJson解析JSON数据【从零开始学Spring Boot】
  3. 死锁:多线程同时删除唯一索引上的同一行
  4. Qt如何将数据保存成CSV文件
  5. 【剑指offer】面试题40:数组中只出现一次的数字
  6. ubuntu 12.04 php5.3 降级为 5.2
  7. LeetCode OJ Symmetric Tree 判断是否为对称树(AC代码)
  8. 知乎问答 | 如何在同一坐标系下绘制多幅图形
  9. bcb quickrep保存为 图片_不容错过的SCI图片处理和组图方法
  10. sem推广如何优化关键词排名?
  11. sqlserver数据库18456错误怎么解决?
  12. Burpsuite介绍及2022.8.2版本超详细安装教程(图文版)
  13. Kubernetes 管理员认证(CKA)考试笔记(四)
  14. 如何用随机森林算法,在深海养肥一群鱼
  15. vue 避免全局样式污染的正确做法
  16. P4:正则表达式(Regular Expression)学习笔记
  17. 报错:attributes are not compatible with the provided attributes
  18. Xposed 企业微信 逆向学习 微信机器人
  19. 使用ffmpeg批量转码的命令行(以mkv转mp4为例)
  20. 彻底凉了!腾讯知名软件全线下架,网友一片唏嘘。。。

热门文章

  1. spark 决策树分类算法demo
  2. web3.js(一)根据地址查询以太数量
  3. Node初学(一)require方法
  4. Mybatis 配置文件
  5. 2018-2019 ACM-ICPC, Asia Xuzhou Regional Contest
  6. 性能:15个JavaScript本地存储技术的函数库和工具
  7. (转载)你好,C++(17)0.1*10不等于1.0——4.1.4 关系操作符4.1.5 逻辑操作符
  8. c# 返回一个对象实例的浅副本
  9. Cisco 设备设置监控口
  10. javaScript基本功001