北京邮电大学“Python编程与实践”课程(2020)
- 课程名称:Python编程与实践
- 教师:陈光 (@爱可可-爱生活)
- 时间:周五上午 8:00-9:35
本课程旨在通过编程学习Python,在解决问题的过程中了解Python编程的基础知识。一起编程,一起爱上Python。
推荐参考书:
《Think Python 2nd Edition》 by Allen B. Downey
中文版: 免费在线浏览
课程视频(Bilibili): 北邮陈光《Python编程与实践》(2020)
日期 | 内容 | 视频 |
---|---|---|
2020.2.28 | 第1讲:轻松起航,一起爱Python 摘要:为什么要学编程?为什么是Python?有啥缺点吗?有什么“用武之地”?为什么是我?参考什么书?该怎么学?实践体验入门 PPT下载 |
L1 |
- | 零基础安装配置Anaconda开发环境 摘要:Anaconda及相关概念介绍;Python 2.x和3.x的故事及如何选择;Anaconda国内镜像的使用;Anaconda基本组件的介绍和实战;Python的交互式、批量式运行方式介绍;Jupyter Notebooks使用初步;conda使用初步 |
L1.1 |
2020.3.6 | 第2讲:初次尝试 摘要:如何做到“聪明地努力学习”?Python最常用的知识是什么?实战入门第一站。 |
L2 |
- | 第2讲答疑(问题列表) 摘要: 缩进相同但不挨着的代码什么关系、代码缩进用空格还是Tab、字符串里的%%什么意思、Python和之前学习的其他语言混淆怎么办、pass是什么、如何命名可改善可读性、Python代码块区分是否只能用缩进、新手应该多学几种语言还是专攻一种、如何判断代码出错位置、Python中的变量内涵是什么、a+a内部是怎么处理的、Python里是不是只能用半角、命令行运行和notebook运行有何区别、怎么写.py文件、Python适用的应用场景、in的使用、去哪里找练习题、print输出格式的控制、一行代码里两个print为什么会自动换行、如何锻炼分析问题的抽象思维、如何整体运行代码、random库的其他用法、Python代码安全性问题、Jupyter Notebook核连不上的问题、Python中[]和()的区别、随机数是否可用时间生成、如何更改cell的执行顺序、显示[*]不运行是咋回事、有什么知名Python项目、学习应以自学为主还是以课程内容为主、Python和C++的最大区别、关键字和关键语句的掌握 |
L2.1 |
- | 聊聊Python的“四大皆空” 摘要:把Python语言里四个“看不见”和“没用”的东西拢成一堆儿聊一聊,希望能帮你解开一些日常的小迷惑 |
L2.2 |
2020.3.13 | 第3讲:挑战猜数字和猜字母小游戏。 摘要:带大家编程实现猜数字和猜字母小游戏,通过实战熟悉Python基本知识,还有两个“蠢”bug |
L3 |
- | 第3讲答疑(问题列表) 摘要: Jupyter Notebook里cell的运行方式、字符串里的转义用法、Tab的用法、除random还有哪些常用的库/包、如何记住Python的语句、in的用法、关于ASCII表、Notebook里IN[*]的含义、 if语句能否写成一行、Python包应该怎么学、用函数控制函数的实现、整段代码缩进的操作、文字的随机选择、如何入门网络编程、import和C语言里include的关系、Python编程的随意性会有什么隐患、hash函数可以用在哪、range函数的三参数用法、ipythhon如何进行断点调试、Python是否有类似指针的用法 |
L3.1 |
- | 手把手:配置Sublime Text3编程环境 摘要:面向新手的零基础Win10轻量IDE编程环境配置指南 |
L3.2 |
- | 聊聊hash函数与id函数 摘要:深入了解hash和id两个“小众”函数,探索Python的内存分配和垃圾回收机制、字典和集合背后的秘密、可变元素与不可变元素的概念,用代码的方式知其所以然 |
L3.3 |
2020.3.20 | 第4讲:玩转简单加密 摘要:一起践行先实现、再完善的开发过程,通过简单文字加密的代码实现,看函数如何应需而生、命名空间的概念、简单的%pdb代码调试技巧、Python代码重构思路、函数说明文档书写规范,体会对“好代码”的感觉。 代码:Jupyter Notebook |
L4.1 |
- | 第4讲答疑(问题列表) 摘要:变量批量改名小技巧、Python负数取余的实现机制、如何实现类似switch的分支条件、global使用释疑、IPython Notebooks撤销操作小技巧、字符串如何修改、用Python Tutor网站可视化运行分析代码的小技巧、函数传参与global的关系、函数参数注解的作用、(True)与True、代码该简化思路、.py文件间是否可引用变量和函数、Python解释器检查函数、变量是否已定义的时机、Sublime Text如何用input、函数形参的作用、函数是否必须返回值、函数是否可以自己调用自己、Python函数能否重载 |
L4.2 |
2020.3.27 | 第5讲:分久必合·合久必分 摘要:现在就开始你的简单项目,在不断探索、思考、出错的过程中学习编程!复盘之前实现的加密/解密代码,反思函数和变量的命名、函数默认参数是使用场景,分析注释(包括文档字符串)面向的读者、写注释的出发点和思考角度。对加密/解密函数进行“极限”压缩,其间介绍自增等操作符、列表、列表推导、字符串的split/join操作、代码续行技巧;通过对比几种实现探讨长代码、短代码的利弊,如何打磨代码、兼顾精炼的同时提高可读性,如何用函数嵌套实现“局部重用”,探索函数结构设计之道。 代码:Jupyter Notebook |
L5.1 |
- | 第5讲答疑(问题列表) 摘要:lambda内联函数的使用、有问题如何搜索、嵌套列表的使用、字符串操作的常用函数、列表和数组的关系、代码重用是否关乎性能、如何区分可变类型和非可变类型、空字符串能否显示、成员函数的调用为什么要加点、《Think Python 2e》和讲授内容如何组合学习、注释的度应该怎么把握、代码精简到什么程度合适、Python里有没有多维列表、续行时断开位置有什么特殊要求、如何测量程序运行时间、为什么全局变量不推荐使用、列表和元组的区别等 |
L5.2 |
2020.4.3 | 第6讲:可交付的随机加密 摘要:梳理 表-表、表+位置偏移、ASCII偏移置换 三种简单加密单字符转换的实现,思考使用随机码本的加密/解密和交付方式。本节我们会一起探索:函数化如何将全局变量局部化、Python中的常量、用random.shuffle()函数打乱排序、通过list.copy()函数实现浅拷贝避免数据被意外篡改、随机乱排的时机选择问题、用pickle实现序列化/反序列化、用open()函数已制定模式打开文件、文件的二进制读写模式('b')、用write()和read()实现文件内容的读写、用with实现区间内对文件的访问和出区间文件自动关闭、notebook里用!运行命令行指令、字典的初步知识。 代码:Jupyter Notebook |
L6.1 |
- | 第6讲答疑(问题列表) 摘要:赋值浅拷贝与沉拷贝、Notebook里的魔术指令、文件系统绝对路径与相对路径、容器的类型和应用场景、Python课如何复习是否应该重看视频、if __name__ == '__main__'的用法和意义、除shuffle以外的列表打乱方法、函数任意参数/不定长参数的设定、常量的使用、pickle的dump/load释疑、Python源码如何保护/防止逆向、列表与C++数组的差别、微博上竞猜题目的解析、字典如何排序、字典如何打乱顺序、with的用法、字典键值如何互换、Python是面向对象还是面向过程、字典如何通过容器实现一对多和多对一映射、Windows下more的使用等 |
L6.2 |
2020.4.10 | 第7讲:类化之路 摘要:字典的特性、字典键/值的取值限制、字典常用函数、字典in的遍历、字典的两种常用遍历方法、类的抽象、类的三方面作用:封装细节、重用函数和变量间的联系、提高可读性,什么时候应该用类、类的初始化、类变量与实例变量、类方法定义里self的用法、为什么不建议用可变类型作类变量、类的实例化、莫尔斯电码问题的提出、用Excel+字符串split()函数实现数据规整。 代码:Jupyter Notebook |
L7.1 |
- | 第7讲答疑(问题列表) 摘要:类变量与实例变量详解、字典到底有序还是无序、数据缺失如何处理、函数内定义的变量能否在全局使用、元组与集合的区别、Python是否有模板类、可变对象为什么不能hash()、Python的多变量赋值用法、Python能否读写Excel、类方法self参数的用法、三引号的用法、C++与Python的搭配使用、is和==的区别等 |
L7.2 |
2020.4.17 | 第8讲:CSV与正则表达式 摘要:Excel与Python代码通过CSV文件进行数据交换、Python读取csv文件、正则表达式基础、利用文本编辑器正则表达式搜索/替换实现数据规整、Python的re正则库、用re.findall()实现代码里的正则匹配、利用工具与纯代码实现的权衡。 代码:Jupyter Notebook |
L8.1 |
- | 第8讲答疑(问题列表) 摘要:CSV和正则还有什么用、正则表达式是否会出现歧义、CSV文件出现乱码怎么办、正则表达式取子串的方法、正则表达式非贪婪符号的使用、如何创建CSV文件、正则表达式是否能匹配中文、re库除了findall还有什么有用的函数、"UTF-8-sig"和"UTF-8"两种编码方式的差别 |
L8.2 |
2020.4.24 | 第9讲:类的继承与递归的实现 摘要:字典get()函数的用法、字符串的upper()/lower()大小写转换函数、用''.join()实现字符串拼接、列表推导的实际应用、长距离一致缩进要多加小心、问题升级——平滑莫尔斯编码的引入、字符串replace()替换函数的使用、类的继承、类成员函数的重载、从手工解码过程中提炼思路、递归的主要思路、可用递归解决问题的特点、max()/min()函数的使用、递归函数重复处理过程和截止条件的确定。 代码:Jupyter Notebook |
L9.1 |
- | PytonTutor的使用及本地化运行指南 摘要:PythonTutor主要功能、PythonTutor使用详解、自己搭建本地PythonTutor服务 |
L9.2 |
- | 明明白白学递归 摘要:什么是递归?什么问题可以用递归?如何设计并实现递归?带你学个通通透透! |
L9.3 |
- | 第9讲答疑(问题列表) 摘要:递归函数入口和被递归调用函数间是否要做区分、递归的适用场景、递归能否用循环代替、递归截止条件有没有其他表示方法、notebooks里某个cell一直运行中如何处理、format字符串格式化的使用、用字典+正则实现批量替换、Python递归与C/C++递归的差别、多继承与多重继承、Python里类有没有私有成员、递归的效率问题、split()函数切割长度的控制、继承的类是否可以改变类变量、是否所有类都能继承、多继承的顺序、继承类的初始化问题、代码里太长的数据定义如何简化、tsv文件和csv文件的区别、如何用Python处理tsv文件等。 |
L9.4 |
2020.5.8 | 第10讲:解码之路 摘要:候选解码结果的筛选思路——加字典/常用词词典/高频词排序词典、用循环遍历/列表推导/filter()函数结合lambda内联函数/集合运算四种方式实现数据过滤、用词典缩减/递归深度缩减实现解码优化、字符级与单词级解码、用空间换时间、递归思维、类比思维等。 代码:Jupyter Notebook |
L10.1 |
- | 第10讲答疑(问题列表) 摘要:递归运行过程分析方法、利用上下文信息进行候选解码结果筛选、如何用while循环代替递归、lambda内联函数还能用于哪些Python内置函数、语法信息是否可用于筛选、filter()函数的用法、用时间换空间vs.用空间换时间、是否可用不同的词频文件、迭代器的使用、iter()函数和__iter__()函数、是否可结合哈夫曼编码、能否用常用句子库解码、自己上手编程困难该怎么办、加快解码速度的思路、生成器的使用、迭代器转换为列表是否会丢失信息、集合的交集并集计算、程序如何实现分级封装、应该如何添加词频文件不包含的词等。 |
L10.2 |
2020.5.15 | 第11讲:反向最大匹配解码与爬虫初步 摘要:基于优先匹配长词的想法,用递归实现反向最大匹配解码;初步了解爬虫的基本概念、基本流程;采、抽、存三步走的简单实现;了解requests使用、回顾正则表达式的配置和re正则库的使用。 代码:Jupyter Notebook |
L11.1 |
- | 网络爬虫第0课:浏览器背后干的那些事儿 摘要:了解、开发爬虫必须了解的HTTP/HTML知识,从输入网址到看见网页,浏览器背地里干的那些事儿。 |
L11.2 |
- | 第11讲答疑(问题列表) 摘要:爬虫有什么“高级”应用、什么样的网站是“软柿子”、正向最大匹配能用吗、pyquery与jQuery、爬虫难吗、图片影片怎么爬、玩转正则需要记住吗、网站反爬有哪些手段、爬网页要遵守的规定、递归过程中最小值的定义、网站是不是都能爬、requests的header部分是做什么的、百度网分享链接和分析密码的爬取策略、正则表达式如何匹配“所有符号”、get和post的区别、爬虫与数据可视化、爬虫翻页链接的处理、学爬虫有什么好课程、对课上的“干货”力不从心怎么办、有没有可能不分析页面源码也能做抽取、反爬常用手段、验证码问题怎么解决等。 |
L11.3 |
2020.5.22 | 第12讲:爬虫框架初步设计与B站豆瓣初步尝试 摘要:构建爬虫基础类(框架),了解框架、脚手架和库的差别,复习类的设计和构建,对B站和豆瓣的排行榜进行采集,构建完整的信息抽取用正则表达式,熟悉RegexBuilder等正则调试工具的使用,用copy as Curl->requests技巧“克隆”浏览器的访问请求。 代码:Jupyter Notebook |
L12.1 |
- | 第12讲答疑(问题列表) 摘要:爬虫能采集视频吗、headers是否必须、正则能否匹配中文、根据不同情况采用不同匹配的爬虫、UTF-8和GBK的区别、课上豆瓣的网址为什么会被加长转义、windows命令行常用命令哪里找、爬虫是什么网站都能抓吗、有密码保护之类手段保护的网址如何怕取、正则里的反斜杠都要转义吗、动态排行榜怎么采集、Python框架除了构建网站还能干啥、有防爬虫无法破解的网站数据怎么获取、页面内容缺少规律性怎么配置、Terminal页面右键没有refresh选项怎么办、Python是爬虫的最佳选择吗、网页拖到下面自动加载或点击更多加载的页面怎么抓取、类似百度翻译的页面怎么找到目标url、爬虫是否有法律风险、什么样的业务适合开发框架等。 |
L12.2 |
2020.5.29 | 第13讲:豆瓣爬虫的进化与爬虫基类的完善 摘要:构建豆瓣图书网页单页的完整爬虫,重点解决信息抽取正则表达式的配置和缺失信息项的处理,完善爬虫基类中headers的设置,通过继承机制构建豆瓣图书页面爬虫类。 代码:Jupyter Notebook |
L13.1 |
- | 第13讲答疑(问题列表) 摘要:编程状态不好时该怎么办、课下自己调试感觉困难怎么办、如何收集股票信息并用图表分析、数据的爬取加可视化、遍历过程中为什么不建议修改遍历序列、爬虫在工作中的实例、爬虫的个性化与爬虫基类的重载、除正则表达式以外还有什么其他方式可以解析网页、有些网页加载过程中有多个doc文件该如何处理、批量爬取爬虫的架构、课上的爬虫离商业爬虫有多远、分割文本的爬取有什么高效办法、如何爬取某具体方向的内容、为什么会有乱码。 |
L13.2 |
2020.6.5 | 第14讲:爬虫进阶之DOM树与XPath 摘要:DOM的基本概念,DOM树的基本概念,XPath的概念和基本语法,Chrome里XPath Helper扩展的使用,特定目标XPath的获取和精简,用lxml库实现网页源码的解析和XPath目标定位,基于XPath的页面信息分层抽取。 代码:Jupyter Notebook |
L14.1 |
- | 第14讲答疑(问题列表) 摘要:如何深入了解xpath、xpath能否完全代替正则表达式、大爬虫也需要对每个网页配置抽取表达式吗、访问图片时拒绝访问如何处理、xpath里的@href什么意思、xpath的绝对路径和相对路径有何区别、DOM树与C++的树一样吗、xpath与正则表达式适用场景如何效率比较及怎样选择、遇到具体变成问题怎么找解决方案、xpath helper安装不了怎么办、lxml解析为什么要解码、表格数据如何采集、DOM和xpath的关系、pycharm怎么安装lxml、爬虫在生活中的应用、豆瓣书名副标题的采集问题、包含子节点的节点如何获取全部文本、xpath能否用于普通字符串、beautifulsoup和lxml在解析方面有什么区别吗、python能提供网页服务吗、模型到底是什么、没有插件如何快速获取xpath等。 |
L14.2 |
2020.6.12 | 第15讲:翻页的爬取和采集目标分析方法 摘要:翻页链接的获取思路、末尾页链接的检测、程序的迭代改进、从解决问题的角度思考编程过程、培养对程序的“审美”、对特殊情况的推演思路、重用与可读性、url encode/quote的使用、对网站数据可用性和扩展渠道的考察。 代码:Jupyter Notebook |
L15.1 |
- | 第15讲答疑(问题列表) 摘要:如何采集音乐网站并播放音乐、豆瓣爬虫能否为书做个类、翻页能否从最后往前翻、urllib库为什么没提供urldecode函数、采集的数据用什么形式存比较好、为什么翻页经常是start=0/20/40而不是page=1、搜索引擎也是爬虫吗、能否用正则实现翻页信息采集、采集信息不全时的解决思路、页面跳转如何采集、怎样将数据方便导入Excel、爬虫 vs. 镜像、做爬虫会违法吗、动态网页或局部刷新网页的爬取、爬虫翻页没有尾页的处理方式、这是最后一节课吗…… |
L15.2 |
2020.6.19 | 第16讲:多级采集与多线程 摘要:标签采集与图书列表也采集结合的嵌套二级采集,多线程编程的相关概念:进程、线程、同步/异步、阻塞式/非阻塞式、线程池等,用concurrent.futures标准库实现多线程并行采集。 代码:Jupyter Notebook |
L16.1 |
第16讲答疑(问题列表) 摘要:GIL是什么、为什么线程池适用于IO密集型场景而进程池适用于计算密集型场景、多进程有什么实际应用、爬着爬着就什么也采集不到了是被发现了吗、为什么多线程能提高运行速度、二级列表很多页的时候怎么设置采集规则、线程池用完变空后还会占内存吗、豆瓣爬虫会限制爬取信息的数量么、多线程方式采集的上限取决于什么、如何确定爬虫程序最优线程个数、多线程采集如何保留项目在原页面的顺序信息等。 |
L16.2 | |
第17讲、深入探索多线程 摘要:多线程的调度顺序,原子操作的概念,f"{}"字符串简化格式化的用法,print默认参数的“秘密”,信号量的概念,用信号量保证“原子操作”,非定向爬虫的概念,搜索引擎的基本原理。 代码:Jupyter Notebook |
L17.1 | |
2020.7.10 | 第18讲、任务队列与多线程 摘要:队列和任务队列的概念和意义,多线程对任务队列的控制,线程池的“静态”线程用法,多线程的细化控制。 代码:Jupyter Notebook |
L18.1 |