Python编程入门:分享8点超级有用的Python编程建议

我们在用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 RequestExceptiondef 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 Falsetitle = 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 Falseelse: 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 selfdef __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编程入门知识点吗?可以留言哦!

原文地址:https://www.cnblogs.com/cherry-tang/p/11121036.html

时间: 2024-08-27 17:40:24

Python编程入门:分享8点超级有用的Python编程建议的相关文章

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

我们在用Python进行机器学习建模项目的时候,每个人都会有自己的一套项目文件管理的习惯,我自己也有一套方法,是自己曾经踩过的坑总结出来的,现在在这里分享一下给大家,希望多少有些地方可以给大家借鉴. ?? 先睹为快 项目文件事先做好归档 永远不要手动修改源数据并且做好备份 做好路径的正确配置 代码必要的地方做好备注与说明 加速你的Python循环代码 可视化你的循环代码进度 使用高效的异常捕获工具 要多考虑代码健壮性 项目文件事先做好归档 每次开始一个新工作的时候,以前的我总是贪图方便,Code

Python趣味入门02: 妥妥地安装配置Python(Windows版)

< 上一篇:Python趣味入门01:你真的了解Python么? 本篇内容手把手教您如何去网上下载安装Python的运行环境,本文写于2020年Python稳定的版本是3.8,Windows流行的版本是Win10,各位看官搜索到本文时可能已经2050年了,但教程任然有用,只要你用的是Windown系统,但是一定要注意如下几点. 本教程会在计算机上安装2套Python环境,1-3节安装原生环境,第4节安装Visual Studio Code的环境.如果你想快速开始,立即过上写代码的瘾,请跳过1-3

Python从入门到精通之30天快速学Python视频教程

课程目录python入门教程-1-Python编程语言历史及特性.mkv python入门教程-2-Python编程语言初接触.mkv python入门教程-3-Python程序文件结构.mkv python入门教程-4-准备Python编程环境.mkv python入门教程-5-Python编程语言基础技术框架.mkv python入门教程-6-Python编程语言基础技术框架.mkv python入门教程-7-Python编程语言基础技术框架之print输出.mkv python入门教程-8

Linux 利器- Python 脚本编程入门(一)

导读 众所周知,系统管理员需要精通一门脚本语言,而且招聘机构列出的职位需求上也会这么写.大多数人会认为 Bash (或者其他的 shell 语言)用起来很方便,但一些强大的语言(比如 Python)会给你带来一些其它的好处. 首先,我们会使用 Python 的命令行工具,还会接触到 Python 的面向对象特性(这篇文章的后半部分会谈到它). 学习 Python 可以助力于你在桌面应用开发及数据科学领域的职业发展. 容易上手,广泛使用,拥有海量“开箱即用”的模块(它是一组包含 Python 语句

编程入门教程

编程入门教程 编程入门教程由QKXue.NET梳理的面向程序开发入门初学者的编程入门教程,是一个涵盖了游戏.PLC.VB.数控.JAVA.APP.Matlab.C语言.Shell.IOS.Android安卓等手机和PC编程的入门教程. 1. 编程入门教程 1.1. 游戏编程入门 游戏编程入门适用于任何对C++语言有基本了解的读者阅读,适宜作为读者进入游戏开发领域的技术入门学习用书. 游戏编程入门介绍如何设计和构建自己的电脑游戏.游戏编程入门不是泛泛地介绍编程理论,而是引导读者开发一个“即插即用”

游戏编程入门——互动出版网

这篇是计算机类的优质预售推荐>>>><游戏编程入门(第4版)> 游戏编程经典入门读物 内容简介 本书是游戏编程经典入门读物的最新版. 全书共分14章,包含两个附录.本书首先介绍Windows和DirectX编程,然后快速介绍游戏编程的工具箱,包括使用C++和DirectX开发游戏所需的所有基础知识.读者将学习到把思想转化为现实所需的技术,比如2D.3D图形的绘制.背景卷动.处理游戏输入.音效.碰撞检测等.在每章结束时,给出了测验题和项目以便帮助读者实践新学到的技能.本书

【机器学习】Python 快速入门笔记

Python 快速入门笔记 Xu An   2018-3-7  1.Python print #在Python3.X中使用print()进行输出,而2.x中使用()会报错 print("hello world")  print('I\'m apple')  #如果全部使用单引号,则需要在前面加上转义字符\+引号 print('apple'+'pear') print('apple'+str(4)) #将数字转换为字符串并打印 print(int("1")+2)#将字

python线程入门

目录 python线程入门 线程与进程 线程 总结 参考 python线程入门 正常情况下,我们在启动一个程序的时候.这个程序会先启动一个进程,启动之后这个进程会启动起来一个线程.这个线程再去处理事务.也就是说真正干活的是线程,进程这玩意只负责向系统要内存,要资源但是进程自己是不干活的.默认情况下只有一个进程只会拉起来一个线程. 多线程顾名思义,就是同样在一个进程的情况同时拉起来多个线程.真正干活的是线程.进程与线程的关系就像是工厂和工人的关系, 要想一个工厂运行起来,至少有一个工,当然如果工人

分享《Python核心编程(第3版)》《Python编程入门(第3版)》高清中英文版PDF+源代码

<Python核心编程(第3版)>经典<Python核心编程(第二版)>的全新升级版本,总共分为3部分.第1部分为讲解了Python的一些通用应用,包括正则表达式.网络编程.Internet客户端编程.多线程编程.GUI编程.数据库编程.Microsoft Office编程.扩展Python等内容.第2部分讲解了与Web开发相关的主题,包括Web客户端和服务器.CGI和WSGI相关的Web编程.Django Web框架.云计算.高级Web服务.第3部分则为一个补充/实验章节,包括文