• Python核心编程:8个实践性建议


    前言
    我们在用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循环代码
    Ps:很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此我整理啦从基础的python脚本到web开发、爬虫、django、数据挖掘等【PDF等】需要的可以进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 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'<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
    return HttpResponse({})
    总结:很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此我整理啦从基础的python脚本到web开发、爬虫、django、数据挖掘等【PDF等】需要的可以进Python全栈开发交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,不懂的问题有老司机解决哦,一起相互监督共同进步
    本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

     

     
  • 相关阅读:
    BGP
    物联网时代的智能家居
    Linux下找不到动态链接库
    Java清洁:终结处理和垃圾回收
    单例模式的改进
    shell脚本中的括号和实例
    shell如何生成rpm包仓库列表文件的对比结果
    shell脚本实现覆盖写文件和追加写文件
    怎么用命令查看某个目录下子目录占用空间的大小
    利用shell脚本函数实现网络连通性的检测
  • 原文地址:https://www.cnblogs.com/chengxuyuanaa/p/12307026.html
Copyright © 2020-2023  润新知