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

我们在用Python进行机器学习建模项目的时候,每个人都会有自己的一套项目文件管理的习惯,我自己也有一套方法,是自己曾经踩过的坑总结出来的,现在在这里分享一下给大家,希望多少有些地方可以给大家借鉴。

?? 先睹为快

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

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

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

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

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

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

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

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

  1. 做好路径的正确配置

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

这里建议:

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

# 读取数据
data = open(HOME_PATH+'/data/processed/test1.csv')
data = pd.read_csv(data)
data.head()
  1. 代码必要的地方做好备注与说明

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

  1. 加速你的Python循环代码

这里推荐云哥的一篇文章:24式加速你的python:

https://mp.weixin.qq.com/s/8bWm4NjHAam-fIeC4a29cA

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

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

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

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

大家可以看下面的例子:

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

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

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

大家可以看看Example:

import pysnooper

@pysnooper.snoop('./log/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
https://mp.weixin.qq.com/s/zqFPVfmPa-qsPUibzQdcjQ

  1. 要多考虑代码健壮性

何为代码的健壮性,顾名思义,就是可以抵挡得住各种异常场景的测试,异常处理工作由“捕获”和“抛出”两部分组成。“捕获”指的是使用 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'<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 = 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({})

?? Reference

原文地址:https://www.cnblogs.com/samshare/p/11664329.html

时间: 2024-11-07 06:34:22

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

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

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

你了解Python编程中的break吗?

今天马哥教育要跟大家分享的文章是你了解Python编程中的break吗?在上一讲中我们学习了Python编程中的数据处理的相关内容,你学会了吗?这一讲,我们主要学习break的相关内容,Python入门新手和正在Python学习的小伙伴快来看一看吧,希望能够对大家有所帮助 ! 如果现在让你利用Python编程给f文件夹中增加“人生苦短,我用Python”,你可以完美操作吗?不能果断说没问题的同学,需要再回顾哦!今天我们来学习break的相关内容,一起来看吧: 我们已经熟悉了循环的使用,包括whi

分享 《Python编程从入门到实践》+PDF+源码+EricMatthes+袁国忠

下载:https://pan.baidu.com/s/1pUlPpTMnffNgMfovUbZkJg 更多资料分享:http://blog.51cto.com/14087171 Python编程从入门到实践(高清中文版PDF+高清英文版PDF+源代码) 久负盛名的python入门书籍. 高清中文版462页,带目录和书签,文字可以复制粘贴: 高清英文版562页,带目录和书签,文字可以复制粘贴: 中文和英文两版对比学习: 讲解详细并配有源代码. 其中,高清中文版如图: 原文地址:http://blo

每周一书《Python编程快速上手 让繁琐工作自动化》分享!

内容简介如今,人们面临的大多数任务都可以通过编写计算机软件来完成.Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.通过Python编程,我们能够解决现实生活中的很多任务. 本书是一本面向实践的Python编程实用指南.本书的目的,不仅是介绍Python语言的基础知识,而且还通过项目实践教会读者如何应用这些知识和技能.本书的首部分介绍了基本Python编程概念,第二部分介绍了一些不同的任务,通过编写Python程序,可以让计算机自动完成它们.第二部分的每一章都有一些项目程序,供

分享《趣学Python编程》中文PDF+英文PDF+源代码

下载:https://pan.baidu.com/s/1E_5vhsYvZ3eAG5bbdzVbjg 更多经典电子书和源代码:http://blog.51cto.com/3215120 <趣学Python编程>中文PDF+英文PDF+源代码 中文版PDF,带目录和书签:英文版PDF,带目录和书签:中英文两版可以对比学习.配套源代码:经典书籍,讲解详细:<趣学python编程>语言轻松,通俗易懂,讲解由浅入深,力求将读者阅读和学习的难度降到最低.任何对计算机编程有兴趣的人或者首次接触

分享《Python编程快速上手:让繁琐工作自动化》【高清中文版PDF+高清英文版PDF+源代码】

下载:https://pan.baidu.com/s/1qs1ETO6yTG8xpdPPzb5dPw Python编程快速上手:让繁琐工作自动化[高清中文版PDF+高清英文版PDF+源代码] 久负盛名的python书籍. 高清中文版412页,高清英文版505 页,均带目录和书签,文字可复制粘贴: 中文和英文两版对比学习:讲解详细并配有源代码.其中高清中文版如图: 原文地址:http://blog.51cto.com/14050767/2311312

分享《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部分则为一个补充/实验章节,包括文

分享《父与子的编程之旅python》第2版中英文PDF代码+《趣学Python编程》中英文PDF代码

<父与子的编程之旅python>作者是一对父子,他们以Python语言为例,详尽细致地介绍了Python如何安装.字符串和操作符等程序设计的基本概念,介绍了条件语句.函数.模块等进阶内容,最后讲解了用Python实现游戏编程.书中的语言生动活泼,叙述简单明了. 为了让学习者觉得编程有趣,编排了很多卡通人物及场景对话,让学习者在轻松愉快之中跨入计算机编程的大门.第 2 版增加了一些说明,解释 Python 2 和 Python 3 的区别,增加了一节关于 Python 字典的内容. <趣学

一份超级实用的 Python ”技巧“清单

Python是世界上最受欢迎,最流行的编程语言之一.这有很多原因: 它很容易学习 它是超级多用途的 它有大量的模块和库 每天使用Python是我内在工作的一部分.在这个过程中,我学会了一些有用的技巧和心得. 在这里,我尝试以A~Z顺序共享其中一些. 大多数这些"技巧"是我在日常工作中使用或偶然发现的事情.一些是我在浏览Python标准库文档时发现的.另外一些是通过PyPi搜索到的. 但是,应该归功于它 - 我在awesome-python.com上发现了其中的四个或五个.这是数百个有趣