• Python实战小项目分享


            Python实战小项目包括网络爬虫、数据分析和可视化、文本处理、图像处理、聊天机器人、任务管理工具、游戏开发和网络服务器等。这些项目提供了实际应用场景和问题解决思路,可以选择感兴趣的项目进行实践,加深对Python编程的理解和掌握。在实践过程中,可以结合相关文档和教程深入学习相应知识点。

    全部资源链接:链接:https://pan.baidu.com/s/1cjX9XuePqACt53zpesSPiQ?pwd=5m9l 
    提取码:5m9l 

    一、资源分享

    (一)python教材及基础知识讲解

    链接:https://pan.baidu.com/s/1H0UaND9Ai-YRfbbmrvSASw 
    提取码:rms9

    (二)python安装

    链接:https://pan.baidu.com/s/14tPYsFsleDqDMLqbN6azZA 
    提取码:yl93

    (三)100道Python练手题目

    链接:https://pan.baidu.com/s/1AJ0uvFsa0SQ0ZZJ-xryo7Q 
    提取码:k734

    (四)python实战项目

    链接:https://pan.baidu.com/s/1qazUy0zytcpTPKy4o1-1tQ 
    提取码:stjc

    二、代码调试思路

            程序能一次写完并正常运行的概率很小,基本不超过1%,总会有各种各样的bug需要修正。写程序花费的时间往往要小于调试的时间,这个是基本规律。bug很复杂时,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug。下面我们来看下常用的Python调试方法

    (一)总体调试方法概览

    调试Python程序时,以下是一些常用的思路和方法:

    1. 打印输出:在代码中插入print语句,输出变量的值或者特定的消息,以便跟踪程序执行过程中的问题。

    2. 断点调试:使用调试器(如pdb、PyCharm等)在代码中设置断点,以便在特定位置停止程序的执行,并逐行检查代码。

    3. 异常捕获:使用try-except语句捕获异常,将发生异常的代码块包裹起来,并在except块中打印异常信息,帮助定位问题。

    4. 日志记录:使用Python内置的logging模块或第三方库(如loguru、logbook等)进行日志记录,以便在程序运行时获取详细的调试信息。

    5. 单元测试:编写单元测试代码对程序进行逐个模块的测试,确保每个部分都能正常工作。当出现问题时,可以通过单元测试发现具体的错误。

    6. 缩小范围:如果程序很大或者复杂,可以缩小问题范围,逐渐排查可能导致错误的部分,从而快速确定问题所在。

    7. 查阅文档和资料:利用搜索引擎、官方文档、论坛和社区等资源寻找与问题相似的情况和解决方案,避免重复解决已有的问题。

    8. 代码审查:请其他开发者或同事对你的代码进行审查,他们可能能够发现你忽略的问题或提供新的思路。

    9. 运行环境:检查程序运行所需的环境、依赖项和版本是否满足要求,确保程序在正确的环境下运行。

    以上方法并非全部,具体使用哪些方法取决于问题类型和场景。在调试过程中,耐心和细致是非常重要的,逐步排查问题直到找到根本原因。

    (二)断点打印法

            第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看:

    1. def foo(s):
    2. n = int(s)
    3. print '>>> n = %d' % n
    4. return 10 / n
    5. def main():
    6. foo('0')
    7. main()

            执行后在输出中查找打印的变量值:

    1. $ python err.py
    2. >>> n = 0
    3. Traceback (most recent call last):
    4. ...
    5. ZeroDivisionError: integer division or modulo by zero

            用print最大的坏处是将来还得删掉它,想想程序里到处都是print,运行结果也会包含很多垃圾信息。所以,我们又有第二种方法。

    (三)断言

            凡是用print来辅助查看的地方,都可以用断言(assert)来替代:

    1. def foo(s):
    2. n = int(s)
    3. assert n != 0, 'n is zero!'
    4. return 10 / n
    5. def main():
    6. foo('0')

            assert的意思是,表达式n != 0应该是True,否则,后面的代码就会出错。

            如果断言失败,assert语句本身就会抛出AssertionError:

    1. $ python err.py
    2. Traceback (most recent call last):
    3. ...
    4. AssertionError: n is zero!

            程序中如果到处充斥着assert,和print相比也好不到哪去。不过,启动Python解释器时可以用-O参数来关闭assert:

    1. $ python -O err.py
    2. Traceback (most recent call last):
    3. ...
    4. ZeroDivisionError: integer division or modulo by zero

            关闭后,你可以把所有的assert语句当成pass来看。

    (四) logging日志

            把print替换为logging是第3种方式,和assert比,logging不会抛出错误,而且可以输出到文件:

    1. import logging
    2. s = '0'
    3. n = int(s)
    4. logging.info('n = %d' % n)
    5. print 10 / n

            logging.info()就可以输出一段文本。运行,发现除了ZeroDivisionError,没有任何信息。别急,在import logging之后添加一行配置再试试:

    1. import logging
    2. logging.basicConfig(level=logging.INFO)

            这就是logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。

            logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。

    (五)pdb调试

            第4种方式是启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。我们先准备好程序:

    1. s = '0'
    2. n = int(s)
    3. print 10 / n

            运行:

    1. $ python -m pdb err.py
    2. > /Users/PythonTab/Github/sicp/err.py(2)()
    3. -> s = '0'

            以参数-m pdb启动后,pdb定位到下一步要执行的代码-> s = ‘0’。输入命令l来查看代码:

    1. (Pdb) l
    2. 1 # err.py
    3. 2 -> s = '0'
    4. 3 n = int(s)
    5. 4 print 10 / n
    6. [EOF]

            输入命令n可以单步执行代码:

    1. (Pdb) n
    2. /Users/PythonTab/Github/sicp/err.py(3)()
    3. -> n = int(s)
    4. (Pdb) n
    5. /Users/PythonTab/Github/sicp/err.py(4)()
    6. -> print 10 / n

            任何时候都可以输入命令p 变量名来查看变量:

    1. (Pdb) p s
    2. '0'
    3. (Pdb) p n
    4. 0

            输入命令q结束调试,退出程序:

    1. (Pdb) n
    2. ZeroDivisionError: 'integer division or modulo by zero'
    3. > /Users/PythonTab/Github/sicp/err.py(4)()
    4. -> print 10 / n
    5. (Pdb) q

            这种通过pdb在命令行调试的方法理论上是万能的,但实在是太麻烦了,如果有一千行代码,要运行到第999行得敲多少命令啊。还好,我们还有另一种调试方法。

    pdb.set_trace()

            这个方法也是用pdb,但是不需要单步执行,我们只需要import pdb,然后,在可能出错的地方放一个pdb.set_trace(),就可以设置一个断点:

    1. import pdb
    2. s = '0'
    3. n = int(s)
    4. pdb.set_trace() # 运行到这里会自动暂停
    5. print 10 / n

            运行代码,程序会自动在pdb.set_trace()暂停并进入pdb调试环境,可以用命令p查看变量,或者用命令c继续运行:

    1. $ python err.py
    2. > /Users/PythonTab/Github/sicp/err.py(7)()
    3. -> print 10 / n
    4. (Pdb) p n
    5. 0
    6. (Pdb) c
    7. Traceback (most recent call last):
    8. File "err.py", line 7, in
    9. print 10 / n
    10. ZeroDivisionError: integer division or modulo by zero

    这个方式比直接启动pdb单步调试效率要高很多,但也高不到哪去。

    (六) IDE调试

            如果要比较爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好的Python IDE有PyCharm,另外,Eclipse加上pydev插件也可以调试Python程序。

     

    三、参考引用

    [1]Python常用的程序调试方法-CSDN博客

  • 相关阅读:
    《优雅升级HBase》中不太“优雅”的情况
    V神说以太坊的Token系统
    老卫带你学---leetcode刷题(399. 除法求值)
    【疫情动态条形图】用Python开发全球疫情排名动态条形图bar_chart_race
    深度解读篇章:剖析构建互联网大厦的基石——TCP/IP协议全貌
    代码库制作与使用
    linux安装jenkins
    Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切(ROI)功能(C#)
    证券行业超融合架构方案设计
    CMake Cookbook
  • 原文地址:https://blog.csdn.net/weixin_63253486/article/details/133984723