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把可能有问题的变量打印出来看看:

def foo(s):
    n = int(s)
    print '>>> n = %d' % n
    return 10 / n
def main():
    foo('0')
main()

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

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

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

(三)断言

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

def foo(s):
    n = int(s)
    assert n != 0, 'n is zero!'
    return 10 / n
def main():
    foo('0')

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

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

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

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

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

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

(四) logging日志

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

import logging
s = '0'
n = int(s)
logging.info('n = %d' % n)
print 10 / n

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

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

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

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

(五)pdb调试

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

s = '0'
n = int(s)
print 10 / n

        运行:

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

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

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

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

(Pdb) n
/Users/PythonTab/Github/sicp/err.py(3)<module>()
-> n = int(s)
(Pdb) n
/Users/PythonTab/Github/sicp/err.py(4)<module>()
-> print 10 / n

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

(Pdb) p s
'0'
(Pdb) p n
0

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

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

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

pdb.set_trace()

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

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

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

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

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

(六) IDE调试

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

 

三、参考引用

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

封印师请假去地球钓鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值