原标题:分享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:

importpysnooper

@pysnooper.snoop('./file.log')

defnumber_to_bits(number):

ifnumber:

bits = []

whilenumber:

number, remainder = divmod(number, 2)

bits.insert( 0, remainder)

returnbits

else:

return[ 0]

number_to_bits( 6)

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

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

8. 要多考虑代码健壮性 �

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

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

defadd(a, b):

ifisinstance(a, int) andisinstance(b, int):

returna+b

else:

return'参数类型错误'

print(add( 1, 2))

print(add( 1, 'a'))

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

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

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

fromrequests.exceptions importRequestException

defsave_website_title(url, filename):

try:

resp = requests.get(url)

exceptRequestException ase:

print( f'save failed: unable to get page content: {e}')

returnFalse

# 这段正则操作本身就是不应该抛出异常的,所以我们没必要使用 try 语句块

# 假如 group 被误打成了 grop 也没关系,程序马上就会通过 AttributeError 来

# 告诉我们。

obj = re.search( r'

(.*)', resp.text)

ifnotobj:

print( 'save failed: title tag not found in page content')

returnFalse

title = obj.group( 1)

try: withopen(filename, 'w') asfp:

fp.write(title)

exceptIOError ase:

print( f'save failed: unable to write to file {filename}: {e}')

returnFalse

else:

returnTrue

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

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

classraise_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):

# 该方法将在进入上下文时调用

returnself

def__exit__(self, exc_type, exc_val, exc_tb):

# 该方法将在退出上下文时调用

# exc_type, exc_val, exc_tb 分别表示该上下文内抛出的

# 异常类型、异常值、错误栈

ifexc_type isNone:

returnFalse

ifexc_type == self.captures:

raiseself.code fromexc_val

returnFalse

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

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

defupload_avatar(request):

"""用户上传新头像"""

withraise_api_error(KeyError, 'AVATAR_FILE_NOT_PROVIDED'):

avatar_file = request.FILES[ 'avatar']

withraise_api_error(ResizeAvatarError, 'AVATAR_FILE_INVALID'),

raise_api_error(FileTooLargeError, 'AVATAR_FILE_TOO_LARGE'):

resized_avatar_file = resize_avatar(avatar_file)

withraise_api_error(Exception, 'INTERNAL_SERVER_ERROR'):

request.user.avatar = resized_avatar_file

request.user.save

returnHttpResponse({})

� Reference返回搜狐,查看更多

我常用的4个备份工具——良许Linux https://mp.weixin.qq.com/s/dT1iLV_vEdcu-_n1FWLvaQ

好玩的Python库tqdm https://blog.csdn.net/zejianli/article/details/77915751

24式加速你的python https://mp.weixin.qq.com/s/8bWm4NjHAam-fIeC4a29cA

Errors and Exceptions https://docs.python.org/3.6/tutorial/errors.html

掌握Python异常处理,看这篇文章就对了 | 鹅厂实战 https://zhuanlan.zhihu.com/p/67917674?utm_source=wechat_session&utm_medium=social&utm_oi=36037380276224

搞不清楚Python的异常怎么用? https://baijiahao.baidu.com/s?id=1607836559889635254&wfr=spider&for=pc

责任编辑:

python编程有用吗-分享8点超级有用的Python编程建议相关推荐

  1. 想学python编程-【经验分享】新手如何快速学好Python?

    原标题:[经验分享]新手如何快速学好Python? 什么样的人适合学习编程?到底Python作为编程入门语言合适吗?学习Python编程,我们应该如何学?大概的学习内容包括哪些? 今天我们就用一篇文章 ...

  2. Python很难学?大佬推荐超级详细的Python爬虫学习清单,免费教程

    0. Python 基础 先放上Python 3 的官方文档:https://docs.python.org/3/ (看文档是个好习惯) 关于Python 3 基础语法方面的东西,网上有很多,大家可以 ...

  3. 分享8点超级有用的Python编程建议

    1. 项目文件事先做好归档 每次开始一个新工作的时候,以前的我总是贪图方便,Code.Data.文档都集中放在一个文件夹内,看起来很乱,一度让回溯过程十分痛苦,或者是换了部电脑,文件全都运行不行了,需 ...

  4. python 获取文件大小_第41p,超级重要,Python中的os库

    大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第41篇文章,第二阶段的课程:Python基础知识:Python内置库之os库的使用. 学习本课程,建议先看一遍:[计算机基础知识] ...

  5. 语言题库体型判断问题_1000道Python题库系列分享20(43道填空与判断题)

    本期题目: 参考答案: 温馨提示 进入公众号,通过菜单"最新资源"==>"历史文章"可以快速查看分专题的文章列表,通过"最新资源"== ...

  6. Python 数据可视化神器分享:pyecharts

    Python 数据可视化神器分享:pyecharts Python 数据可视化神器分享:pyecharts 我们都知道python上的一款可视化工具matplotlib,而前些阵子做一个Spark项目 ...

  7. 花了3个月整理的超级全面的Python资料和Java面试题,分享给大家!

    为广大Python爱好者精心准备的<Python进阶>,是<Intermediate Python>的中文译本,IntermediatePython这本书具有如下几个优点:简单 ...

  8. 怎么用python编贪吃蛇_少儿编程分享:手把手教你用PYTHON编写贪吃蛇(二)

    原标题:少儿编程分享:手把手教你用PYTHON编写贪吃蛇(二) 检测和判断 无论我们制作的简单或者复杂的游戏 这都是最关键的两个部分 事件处理循环 61. while True: # 游戏主循环 62 ...

  9. 1000道Python题库系列分享26(12道Pandas编程题)

    封面图片:<Python程序设计实验指导书>(ISBN:9787302525790),董付国,清华大学出版社 图书详情(京东): 本书81个实验项目可与董付国老师的<Python程序 ...

最新文章

  1. 绝对实用 NAT + VLAN +ACL管理企业网络
  2. 《Hadoop实战手册》一1.6 配置Sqoop以支持SQL Server
  3. halt库卡_KUKA库卡机器人编程之字符串处理函数
  4. 软件测试第四周作业WordCount优化
  5. 【数据竞赛】5行代码提升GBDT,提升巨大!
  6. LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍历建立二叉树 C++...
  7. iOS 自定义view里实现控制器的跳转
  8. java 接口api设计的注意事项_Java接口设计原则
  9. Java枚举(Enum)类型使用的正确姿势
  10. java 定义全局变量_都说变量有七八种,到底谁是 Java 的亲儿子
  11. 机器学习基础:朴素贝叶斯(Machine Learning Fundamentals: Naive Bayes)
  12. 【生信进阶练习1000days】day22-复习day1~day14的知识点
  13. idea 安装 jclasslib
  14. Linux消息队列扩充上限,linux系统增加消息队列长度
  15. 使用 eBPF 技术跟踪 Netfilter 数据流
  16. matlab 线性拟合polyfit_Matlab实现线性回归(直线拟合)
  17. 国际知名制作公司名录及网址大全,制作人员必备
  18. C++-如何排查内存写坏
  19. python print()什么意思_python print用法是什么
  20. 区块链知识点杂记(并不全面)

热门文章

  1. leetcode -- 3.无重复字符的最长子串
  2. mybatis面试题讲解1
  3. 读Kafka Consumer源码
  4. 组合模式用于分类设计子叶与枝干时候太好用了
  5. 【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...
  6. WebForm实现增删改查
  7. AngularJS 指令中的require
  8. unity 物体倾斜角度代码
  9. [置顶] 将项目从tomcat 迁移到JBoss
  10. Access数据库OleDbHelper