0 序
先讲一个故事。西汉初期,丞相萧何死后,由曹参接任,曹丞相一天到晚都请人喝酒聊天,好像根本就不用心在治理国家似的。惠帝感到很纳闷,又想不出个所以然来,只以为是曹相国嫌他太年轻了,看不起他,所以就不愿意尽心尽力来辅佐他。终于有一天汉惠帝责问曹参,曹参反问“请陛下好好地想想,您跟先帝(刘邦)相比,谁更贤明英武呢?”惠帝立即说:“我怎么敢和先帝相提并论呢?”曹参又问:“陛下看我的德才跟萧何相国相比,谁强呢?”汉惠帝笑着说:“我看你好像是不如萧相国。”,曹参接过惠帝的话说:“陛下说得非常正确。既然您的贤能不如先帝,我的德才又比不上萧相国,那么先帝与萧相国在统一天下以后,陆续制定了许多明确而又完备的法令,在执行中又都是卓有成效的,难道我们还能制定出超过他们的法令规章来吗?”
这就是著名的“萧规曹随”的故事。
我讲这个故事,是想表达互联网上优质的Python博客、视频已经非常多,肯定比我这个毫无教学经验的人讲的好。所以我不会重复写这些内容,但会给出链接,抛砖引玉,故这个系列不是正经的“Python教程”,想要学会Python还是多读我推荐的一些资料吧。我更多的篇幅是介绍自己的经验心得,和一般人不会重点讲但实战中又很实用的技巧。
作者:陈坤泽
邮箱:877362867@qq.com
1 为什么要学Python
廖雪峰Python教程有关于开发效率、运行效率、未来趋势、找工作等方面完善的介绍:
完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行。所以Python是一种相当高级的语言。
代码少的代价是运行速度慢,但是大量的应用程序不需要这么快的运行速度,因为用户根本感觉不出来。例如开发一个下载MP3的网络应用程序,C程序的运行时间需要0.001秒,而Python程序的运行时间需要0.1秒,慢了100倍,但由于网络更慢,需要等待1秒,你想,用户能感觉到1.001秒和1.1秒的区别吗?
- 上手容易,万能语言。
- 小学生都能学会的语言,你认为上手有多难?Python将被纳入高考,小学生都在学Python,你慌了吗?,“网红” Python,疯狂打 call。
- python有非常庞大的第三方功能扩展库,包罗万象,几乎无所不能。可以做测试、运维、数据分析、数据挖掘、机器学习和爬虫等。
- Python降低了进入IT行业的门槛,我身边有很多数学专业的朋友,成功转型做Python大数据分析的例子。数学专业不好找工作,迷茫的时候,学一个Python没有什么坏处,但却大大扩宽了未来的发展出路。不仅是小众的LaTeX,随着人工智能的发展,越来越多工作会被自动化技术取缔,所以我要求编校组的每个人都要学习Python,否则等我们35岁的时候,试想我们跟刚毕业的大学生相比有什么优势呢?是什么价值让我们是不可替代的?程序员:不要自称为码农。
- 小学生都能学会的语言,你认为上手有多难?Python将被纳入高考,小学生都在学Python,你慌了吗?,“网红” Python,疯狂打 call。
- 开发简洁、快速。
- Python创始人龟叔印在T恤前的理念就是“人生苦短,我用Python”。
- 用Python能快速实现我们需要的一些小功能,做成自动化脚本工具。
- python项目的文件也很简洁,一个py文件既是代码,也是可执行文件。而C++,一个cpp文件可能对应有h头文件要管理,就c++的项目头文件管理学问,都可以开上好几节课来探讨了。简洁清晰的文件系统,让我们写代码的时候会更专注于业务功能的开发,而不是总去思考计算机底层相关的问题。
- 可以为自己的学习工作开发好用的小程序。
- 将我们开发的Python小程序放到环境变量,windows操作系统可以用“Win键 + r”来快速打开程序。
- 例如:"rename.py"的文件批量重命名工具、“查看目录下png图片信息.py”。
- 也可以使用PyQt开发剪切板的监控工具,在复制时,自动对内容进行处理,粘贴的时候直接就是处理好的结果内容。
- 还可以对一些第三方程序进行扩展,例如Beyond Compare差异对比软件,有时候需要对两段文本比较差异,就要新建两个文件,将内容粘贴进去后,再打开比较,手动操作就会非常繁琐。将其写成bc.py工具,直接用Beyond Compare软件打开两个新建空文件,将文本复制进去,就能快速实现差异比较了。
2 Python学习资料推荐
我只推荐我看过的资料,但优质的资源肯定不止这些,大家可以自己去发掘,不错的资料可以分享出来让更多人知道。
- Python教程:
- 入门推荐:
- 21分钟Python从入门到放弃(不讲废话,极速了解python的基本语法)
- 菜鸟教程(通俗易懂,适合想快速了解python基本用法的伙伴)
- 廖雪峰Python教程(常用功能介绍全面,适合有一定基础需要熟练掌握python的伙伴)
- 微信公众号「 Python之禅」,里面的文章质量都很高。
- java2s(英文教程,介绍比较全面,示例代码多,适合想适度扩展但又不想读官方文档的伙伴)
- Python编程风格指南,PEP8 编码规范中文版
- Python3.5.2中文文档,Python官方最新英文文档
- 第三方库清单 awesome-python-cn
- Python书单,有些能在网上找到电子版,例如:python3-cookbook
- DataCamp,每个模块功能用一张表格高度概括主要用法。
- 入门推荐:
- 常见问题:
3 编程技巧
3.1 软件安装
- 本文提及部分文件可在此处下载 。
- 下载Python(建议装windows64位版)
- 要勾选下方的“Add Python 3.x to PATH”,把python加入环境变量。
- pip加速
- 使用“pip install”安装Package的时候,默认的国外镜像速度特别慢,可以通过修改为国内镜像加速。参考资料。
- 下载附件里的“pip”文件夹,放到个人目录里,例如我的用户名是kzche,则放到:C:\Users\kzche\pip\pip.ini。
- IDE推荐PyCharm,pycharm视频教程
- 这是edu免费版PyCharm:https://www.jetbrains.com/education/download/#section=pycharm-edu(edu没有我很需要用的Structure功能,所以我安装的是我网盘里存的pycharm-community-2019.3.2.exe)
- 我喜欢深色的配色方案: File/Settings/Appearance & Behavior/Appearance/Theme/Darcula
- 修改创建python脚本文件时的模板:我的python模板,参考资料
- 设置Python解释器,以及可以管理Package:
- 打开一个项目后,可以关闭不需要的目录的索引index,加快项目加载速度:
File/Settings/Project: YourProjectName/Project Structure/Right click on folder and press “Excluded” - (edu版本好像没这功能)View / Tool Windows / Structure,可以打开代码结构查看工具。
- Python中一些比较难安装的Package。
- 推荐windows下一个更好用的cmder终端,以及pycharm里的terminal可以改设为cmder。
3.2 代码风格规范
在PyCharm,可以用Ctrl + Shift + Alt + L,对代码格式化,剩下还有下图这种下划线提示的,鼠标移过去,会提示你的代码有什么瑕疵,一般是一些PEP8规范。
关于PEP8,至少要了解命名规范:变量函数名lower_with_under,类名CapWords,常量CAPS_WITH_UNDER。
很多下划线问题,都可以把鼠标光标停留在上面,按Alt + Enter,不少问题IDE会帮忙自动修正,或者弹出多种参考修正方案的菜单。
3.3 注释等代码块
作为规范的工程开发,一个python代码文件的开头不应该直接就写import,而是要写两个东西:编码与作者信息,文档注释。
灰色部分,第1~5行:
- 第1行:是让linux系统知道这是一个python3文件
- 第2行:告知解析程序本文件文本采用的编码格式
- 第3~5行:代码作者和联系邮箱,作者可以有多人,以及文件的创建或更新时间。
有需要的话还可以增加"# @Version : v.0.0"记录版本信息。
这块代码除了用PyCharm设置py文件模板的方法,在新建.py文件时自动生成。也可以用搜狗输入法设置"自定义短语",用输入法设置宏的好处是不用局限于IDE,在任何地方都能用。还可以用这个方法设置很多常用代码块。
绿色部分,第7~18行:
Python有一种独一无二的的注释方式:使用文档字符串(Docstring),文档字符串是包、模块、类或函数里的第一个语句,这些字符串可以通过对象的__doc__成员被自动提取,并且被pydoc所用。
每个文件的开头,最好有一段其文档介绍。定义函数等时也是同理:
def strwidth(s):
"""string width
中英字符串实际宽度
>>> strwidth('ab')
2
>>> strwidth('a⑪中⑩')
7
⑩等字符的宽度还是跟字体有关的,不过在大部分地方好像都是域宽2,目前算法问题不大
"""
try:
res = len(s.encode('gbk'))
except UnicodeEncodeError:
count = len(s)
for x in s:
if ord(x) > 127:
count += 1
res = count
return res
3.4 文档测试
上述strwidth用到了“>>>”,它既是一份简洁清晰易懂的示例文档,也是一份“单元测试”,这是Python特有的“文档测试”功能。(廖雪峰文档测试基础)
在PyCharm可以非常方便地运行一个文件中的所有文档测试:
其中第③步具体设置方法:
Tips:
- 在文档测试中的代码,IDE也是能识别,进行智能编辑、代码补全提示的。
- 有时候不用显式的配置doctest,PyCharm会智能识别文件执行文档测试,甚至光标停留在函数、类里面,可以单独测试一个对象的测试样例。
- 有些代码可能只适合演示怎么调用,但并不适合进行文档测试,因为运行需要占用太多时间,或者并没有返回值,或者每次的运行结果可能是会不断变化的,此时可以用双大于符
>>
来表示,例如:def chrome(file, filename=None, ndim=None, **kwargs): r"""使用谷歌浏览器查看内容,详细用法见底层函数viewfiles >> chrome(r'C:\Users\kzche\Desktop\b.xml') # 使用chrome查看文件内容 >> chrome('aabb') # 使用chrome查看一个字符串值 >> chrome([123, 456]) # 使用chrome查看一个变量值 这个函数可以浏览文本、list、dict、DataFrame表格数据、图片、html等各种文件的超级工具 """
3.5 代码的查找与重命名
Ctrl+鼠标左键(点击对象),可以跳转到对象的定义处;
在对象右键,也有"Refactor"可以对对象进行批量重命名。
但有时候IDE的功能无法满足我们的需求,又或Refactor有时候会无效。
关于查找,我们可以借助全文搜索软件:FileLocator全文检索软件。
在项目重构中,时常需要大量的文本替换工作。可以自己写一个脚本工具,遍历文件进行批量替换,但直接替换存在很大的风险隐患,此时可以结合Beyond Compare等软件进行替换效果预览,具体操作方法后续会补充介绍文章。
3.6 小段代码测试与分享
- 在项目中需要测试一小段语法或代码功能时,可以直接在PyCharm左下角打开一个Python控制台:
- 需要将自己的代码展示给他人看时(向他人请教自己的代码问题时),避免冗长,换行,无缩进,无高亮等问题给他人阅读代码时带来的不便。
可以用:https://paste.ubuntu.com/ 。 不过这是公开网站,不要放涉及技术泄密的代码。 - 还可以使用在线编程网站,进行代码测试,开发小程序、代码分享。
4 笔记整理
- 问问题的时候,要整理MWE(作者Liam Huang):
- MWE是Minimal Working Example 的缩写,意思是「最⼩⼯作⽰例」。顾名思义,最⼩⼯作⽰例的特点有三:
简短不包含与问题⽆关的代码⽚段;
工作能够独⽴运⾏于他⼈的计算机上,⽽不需要再添加额外的代码;
示例在他⼈计算机上的运⾏结果,能完整地再现你所遇到的问题。 - 不仅是问问题,我们在整理笔记,知识点的时候,道理是相通的,
例如下列两段代码,即简介地演示了遇到的问题,在注释里写出程序运行会得到的结果,也演示了解决方案的代码:
- MWE是Minimal Working Example 的缩写,意思是「最⼩⼯作⽰例」。顾名思义,最⼩⼯作⽰例的特点有三:
- 可以参考Python 标准库官方文档
的目录结构进行分类整理,例如下图是我依据官方文档,对文字处理等方面的笔记结构,新增一些相关的第三方库chardet、ahocorasick、Levenshtein。
- 尽可能用表格、图片、思维导图的形式代替纯文本描述。使用纯文本时,也可以配合列表、缩进、颜色等格式丰富表达内容。
- 例如使用正则库re匹配的Match对象,所有的类成员变量有:
m = re.search(r'(\d{6})-(\d{6})', '2018暑假高数高二选修2-1(教师版) 180526-091500.pdf')
- 云游道士,Python之日期与时间处理模块(date和datetime),2017.2
- 例如使用正则库re匹配的Match对象,所有的类成员变量有:
- 参考文献:所有不是自己写的内容,借鉴参考了的资料,都要附上介绍或链接,这不仅是尊重别人的劳动成果,也方便日后遇到细节问题,查阅原文复核。
- 在线Jupyter,便于创建和共享文学化程序文档,支持实时代码,数学方程,可视化和 markdown。对我们工程开发来说可能实用价值不大,不过这也是很流行的一个工具,可以了解下。例如在数据分析工作中,可以边写代码,边写解释,边作图,项目完成后既是一份代码,也是一份文档笔记。