python 初学者
Talent、茂ღ茂 人气:1明确学习目标,不急于求成
当下是一个喧嚣、浮躁的时代。我们总是被生活中大量涌现的热点所吸引,几乎没有深度阅读和思考的时间和机会。我始终认为,学习是需要沉下心来慢慢钻研的,是长
期的;同时,学习不应该被赋予太多的功利色彩。一个Python 程序员的成长路线图应该是这样子的:基础语法–>语感训练–>课题练习–>分方向继续学习–>中级程序员–>
拓展深度和广度–>高级程序员。
然而,很多新手的学习路线图却是这样子的:学完基础语法之后,不了解 http 协议和 Ajax 异步请求,就兴冲冲研究爬虫去了;或者,学完基础语法,就去搞视觉识别
连 OpenCV 的数据结构都看不懂;甚至,学完基础语法就直接研究神经网络,结果是重演了一遍从入门到放弃。
我体会和建议就是,不急于求成,不好高骛远,一步一步,稳扎稳打,功到自然成。不急于求成,可以避免走弯路,非但不会延缓你成长的速度,反倒会节省你的时间。
不好高骛远,达成一个目标,再制定下一个目标,在连续的成功和进步中,建立起自信心,激发出更强的学习兴趣。
在开始学习 Python 之前,你需要做一些准备
Now is better than never, Although never is often better than *right* now. 翻译过来的意思是,做也许好过不做,但不假思索就动手还不如不做。的确,在开始学习 Python 之前,你需要了解的一些背景,做出一些选择,并在你的计算机上做好准备工作。
Python 的各种发行版
Python 是龟叔的独生子,但他有很多堂兄弟,比较有名的也有好几位。如果你不确定哪个对你更友好,我建议你选择嫡传的 Python——即便你将来需要和他的其他堂兄
弟打交道,那也是熟门熟路。不建议初学者选择AnacondaPython 和 ActivePython,在我看来他们提供的便利不如给用户学习带来的麻烦多。
Cpython
CPython 属于 Python 参考实现方案,可算是所有其他 Python 衍生发行版的一套标准化版本。CPython 利用 C 语言编写而成,而其编写者包含多位 Python 语言顶级决策
层中的核心人员。CPython 在优化方面表现得最为保守。当然,这并不是缺点,而是设计取向。Python 的维护者们希望将 CPython 打造为 Python 最具广泛兼容性与标准化的
实现方案。CPython 最适合对 Python 标准的兼容性与一致性要求较高的用户。此外,CPython 同样适用于希望以最基本方式使用 Python并愿意为此放弃某些便捷性的专业人士。
Anaconda Python
Anaconda 源自 Anaconda 公司之手(原名为 Continuum Analytics),其设计目标在于服务那些需要由商业供应商提供支持且具备企业支持服务的 Python 开发者。
Anaconda Python 的主要用例包括数学、统计学、工程、数据分析、机器学习以及其他相关应用。Anaconda 捆绑有 Python 商业与科学使用场景当中的各类常用库——包括
SciPy、NumPy 以及 Numba 等等,同时通过一套定制化软件包管理系统提供更多库访问能力。
ActivePython
与Anaconda类似,ActivePython同样由营利性企业创建及维护——ActiveState公司。该公司还在销售多种语言运行时以及多语言Komodo IDE。ActivePython主要面向企业
用户与数据科学家——即希望使用Python语言,但又不愿把大量精力浪费在Python的组装与管理方面。ActivePython使用Python中的常规pip软件包管理器,但同时亦以认证压
缩包的形式提供数百套通用库,外加英特尔数学核心库等其他一些具有第三方依赖关系的公共库。
PyPy
PyPy 属于CPython解释器的替代品,其利用即时(JIT)编译以加速Python程序的执行。根据实际执行的任务情况,其性能提升可能非常显著。人们对于Python——特别是CPython
的抱怨之声,主要围绕其速度表现展开。在默认情况下,Python的运行速度远不及C语言——差距甚至可能达到数百倍。PyPy JIT将Python代码编译为机器语言,从而带来平均7.7倍
于CPython的运行速度。在某些特定任务中,其提速效果能够达到50倍。
Jython
JVM(Java虚拟机)能够作为除Java之外的多种语言的运行时选项。这份长的名单包括Groovy、Scala、Clojure、Kotlin、Python以及——没错,当然还有Jython 。Jython最大
的弊端在于其仅支持Python的2.x版本。目前对Python 3.x版本的支持能力尚在开发当中,但仍需要相当一段时间。当下,还没有任何相关版本放出。
IronPython
类似于Jython的JVM上Python实现方案定位,IronPython属于一套立足.Net运行时——或者CLR(公共语言运行时)——的Python实现方案。IronPython利用CLR的DLR(动态语言运行时)
以允许Python程序以等同于CPython的动态水平实现运行。与Jython类似,IronPython目前只支持Python 2.x版本。不过IronPython 3.x实现方案已经处于紧锣密鼓的开发当中。
安装Python
从 Python 官网下载时,请注意选择正确的版本。如果是用于学习,下载最新版没有问题,如果是用于生产,则要考虑你开发需要的第三方模块是否支持最新版的 Python。
安装时不要忘记勾选最下面的两个复选框,否则会给后续的模块安装带来一些麻烦。推荐使用默认方式安装
选择一款趁手的开发工具
学习一种编程语言,首先要找一款合用的集成开发工具,似乎是自然而然的想法。为什么不呢?IDE可以自动补齐,可以一键运行,还可以断点调试。使用IDE开发项目
就像驾驶一辆内饰豪华的汽车,尽情享受驾驶的乐趣就好了,谁还去关心引擎盖里面发动机是如何工作的呢?我的年轻同事们也都是IDE的拥趸,最初使用pycharm后来
是时下大热的vscode。可是,我始终认为,编程就像是驾驶,程序员就是司机,而且是职业司机,不是把驾驶当成通勤技能的各色白领金领。既然是职业司机,就不能
满足于打着领结、戴着白手套驾驶内饰豪华、配置高端的汽车,而是必须具备打开引擎盖子维修和保养的能力。
基于这个观点,我不建议初学者一开始就使用集成开发工具——至少,在开始第一个星期不要使用IDE。对于python这样一种解释型的脚本语言,一款趁手的编辑器就足
够了。linux平台上,vim或者emacs都足够好(如果你通晓二者或者其中之一的话,请接受我的敬意);windows平台上,我推荐使用notepad++。python初学者使用编
辑器而非IDE的好处是:
1、专注于python本身,而不是被工具使用问题所困扰。君不见,知乎上关于pycharm和vscode的使用说明、常见问题的解决方案,多得几乎超过了讨论python本身
2、手工运行代码,可以更直观、更深刻地了解脚本的解释执行过程
3、手工调试代码,有助于代码优化,提高代码把控能力
4、可以更好地使用pip安装和管理第三方模块
习惯使用IDLE,这是学习python最好的方式
解释型语言的优势,就是可以写一句执行一句,想到哪儿写到哪儿,不必像编译型语言那样得把程序全部写完,编译成功后才能运行。我特别喜欢使用python的IDLE
甚至拿它当计算器用。很多时候,我用IDLE验证代码的写法是否正确,查看模块是否安装成功以及版本号。IDLE支持tab键自动补齐,我经常用这个功能查看某个对象
的方法和属性。
>>> import numpy as np >>> np.__version__ '1.17.0' >>> np.hypot(3,4) 5.0 >>> def factorial(n): # 计算n的阶乘 if n == 0: # 递归出口 return 1 return n*factorial(n-1) # 向递归出口方向靠近的自身调用 >>> factorial(5) 120 >>> _*2-100 140
小技巧
- tab键自动补齐
- 光标移动到执行过的语句上敲击回车,可以重复这个命令
- 下划线(_)可以获取最后一次执行结果
实际上,IDLE就是一个IDE,你可以用它来创建或打开.py脚本文件,可以编辑、运行和调试。
严格遵从编码规范
Linux 平台上,一个 python 源码文件应该以下部分组成。Windows 平台上,可以省略第一项。
- 解释器声明
- 编码格式声明
- 模块注释或文档字符串
- 模块导入
- 常量和全局变量声明
- 顶级定义(函数或类定义)
- 执行代码
好在龟叔说过,A Foolish Consistency is the Hobgoblin of Little Minds(尽信书,不如无书),只要保持一致性、可读性,就是一个好的规范。基于PEP8规范的原则
结合开发团队在工作中的养成的习惯,我整理了一份实用的编码规范,推荐给初学者。
Python 文件组成
#!/usr/bin/env python # -*- coding: utf-8 -*- """通常这里是关于本文档的说明(docstring),须以半角的句号、 问号或惊叹号结尾! 本行之前应当空一行,继续完成关于本文档的说明 如果文档说明可以在一行内结束,结尾的三个双引号不需要换行;否则,就要像下面这样 """ import os, time import datetime import math import numpy as np import xlrd, xlwt, xlutils import youth_mongodb import youth_curl BASE_PATH = r"d:\YouthGit" LOG_FILE = u"运行日志.txt" class GameRoom(object): """对局室""" def __init__(self, name, limit=100, **kwds): """构造函数! name 对局室名字 limit 人数上限 kwds 参数字典 """ pass def craete_and_start(): """创建并启动对局室""" pass if __name__ == '__main__': # 开启游戏服务 start()
编码格式声明
通常,编码格式声明是必需的。如果 python 源码文件没有声明编码格式,python 解释器会默认使用 ASCII 编码,一旦源码文件包含非ASCII编码的字符,python 解释器
就会报错。以 UTF-8 为例,以下两种编码格式声明都是合乎规则的。
# -*- coding: utf-8 -*- # coding = utf-8
我一直 UTF-8 编码格式,喜欢使用第一种声明方式。
Windows 平台上,编码格式声明必须位于 python 文件的第一行。Linux 平台上,编码格式声明通常位于 python 文件的第二行,第一行是 python 解释器的路径声明。
#!/usr/bin/env python # -*- coding: utf-8 -*-
缩进
统一使用 4 个空格进行缩进。绝对不要用tab, 也不要tab和空格混用。对于行连接的情况,我一般使用4空格的悬挂式缩进。例如:
var_dict = { 'name': 'xufive', 'mail': 'talent_yms@sina.com' }
引号
引号使用的一般性原则:
- 自然语言使用双引号
- 机器标识使用单引号
- 正则表达式使用双引号
- 文档字符串 (docstring) 使用三个双引号
注释
#号后空一格,段落件用空行分开(同样需要#号):
# 块注释 # 块注释 # # 块注释 # 块注释
行内注释,至少使用两个空格和语句分开:
age += 1 # 年龄增加一岁
比较重要的注释段, 使用多个等号隔开, 可以更加醒目, 突出重要性:
server= gogame(room, options) # ===================================== # 请勿在此处倾倒垃圾!!! # ===================================== if __name__ == '__main__': server.run()
空行
空行使用的一般性原则:
- 编码格式声明、模块导入、常量和全局变量声明、顶级定义和执行代码之间空两行
- 顶级定义之间空两行,方法定义之间空一行
- 在函数或方法内部,可以在必要的地方空一行以增强节奏感,但应避免连续空行
空格
空格使用的一般性原则:
- 在二元运算符两边各空一格,算术操作符两边的空格可灵活使用,但两侧务必要保持一致
- 不要在逗号、分号、冒号前面加空格,但应该在它们后面加(除非在行尾)
- 函数的参数列表中,逗号之后要有空格
- 函数的参数列表中,默认值等号两边不要添加空格
- 左括号之后,右括号之前不要加添加空格
- 参数列表, 索引或切片的左括号前不应加空格
文档字符串
文档字符串是包、模块、类或函数里的第一个语句。这些字符串可以通过对象的__doc__成员被自动提取,并且被pydoc所用。文档字符串的使用三重双引号(""")。
如果文档字符串内容不能在一行内写完,首行须以句号、 问号或惊叹号结尾,接一空行,结束的三重双引号必须独占一行。
导入模块
导入总应该放在文件顶部,位于模块注释和文档字符串之后,模块全局变量和常量之前。导入应该按照从最通用到最不通用的顺序分组,分组之间空一行:
- 标准库导入
- 第三方库导入
- 应用程序指定导入
应当避免使用以下的导入方法:
from math import *
命名规范
命名建议遵循的一般性原则:
- 模块尽量使用小写命名,首字母保持小写,尽量不要用下划线
- 类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头
- 函数名一律小写,如有多个单词,用下划线隔开
- 私有函数可用一个下划线开头
- 变量名尽量小写, 如有多个单词,用下划线隔开
- 常量采用全大写,如有多个单词,使用下划线隔开
代码的运行、调试
如果你使用的集成开发工具,那么代码的运行和调试,就完全依赖于工具了。如果你使用编辑器开写代码,那就需要手工运行和调试代码。运行代码分成两步:
第1步:打开一个命令行窗口,路径切换到脚本所在的文件夹。我习惯在脚本所在窗口的空白位置(确保没有选中任何对象),按下shift键点击鼠标右键,在弹
出的菜单中选择打开Powershell窗口。如下图所示。
第2步:输入python+空格+脚本文件名,回车即可运行。输入脚本文件名时,按tab可以自动补齐。脚本的运行信息、错误信息、运行结果等,都可以显示在这个窗口中
这是最原始的信息。你在其他开发工具中看到信息,都是对这些信息的再加工。
当然,很多编辑器也支持自定义运行命令,可以实现一键运行python脚本。以Notdpan++为例,点击“运行”->“运行”菜单,在弹出的窗口中输入:
cmd /k cd https://img.qb5200.com/download-x/d “$(CURRENT_DIRECTORY)” & python “$(FULL_CURRENT_PATH)” & echo. & pause & exit
因为转义缘故,复制该命令的话,请检查$符号前面是否有\符号,如有,请删除。接下来,点击“保存”按钮,在弹出的窗口中输入新增命令的名称,比如PyRun,定义快捷
键,最后点击“确定”按钮。
完成以上设置后,就可以在Notepad++中使用菜单命令或者快捷键运行Python代码了。手工调试代码的手段不多,除了 print 信息,几乎只有把调试信息写成调试文件了
听起来,好像问题很严重,其实只是理念和取向不同而已。反过来想,手段单一不恰好意味着简单、简明吗?我一直使用 print 调试,坚信没有比它更好的了
模块管理
在python语言的发展过程中,安装和管理第三方模块的方法也历经变化。现在,我们终于等来了pip这个近乎完美的工具。pip除了安装(install)和删除(uninstall)这
两大功能,还可以指定模块的安装版本(无需预先删除当前已安装版本),可以显示所有已安装的模块,还可以通过 upgrade 自主升级。很多学者在使用pip时会遇到
各种各样稀奇古怪的问题,我在这里解释一下:
同时安装了py2/py3
同时安装了py2/py3,将会存在多个版本的pip.exe,你如果直接运行:
pip install <模块名>
则有可能因为pip.exe版本不对而出错。正确的做法是指定python版本,-m是python解释器的参数,意思是把pip模块做为脚本运行,完整命令如下:
py -3 -m pip install <模块名>
使用Anaconda,或者通过IDE来安装模块
如果你使用的是Anaconda Python,或者你是通过IDE来安装模块,则需要检查它们的配置和设置,情况各有不同,没有统一的解决方案。
仅安装了py2 或 py3
如果你的计算机只安装了py2 或者 py3,那么上面两种安装方法应该都没有问题。如果你的电脑找不到pip.exe文件,则可以使用这个命令生成:
python -m ensurepip
pip应用演示
下面,就以同时安装了py2/py3的计算机为例(如果只安装了py2或py3,需要将下面演示中的py -3替换成python),演示pip模块的用法。不管任何情况,我都建议使用
-m参数调用pip模块,而不是直接使用 pip.exe 安装模块。
# 虽然可以这样使用pip安装模块(以numpy为例) D:\XufiveGit\wxgl> pip install numpy # 但我建议这样使用pip D:\XufiveGit\wxgl> py -3 -m pip install numpy # 删除模块 D:\XufiveGit\wxgl> py -3 -m pip uninstall numpy # 安装模块,指定版本
D:\XufiveGit\wxgl> py -3 -m pip install numpy=1.15.0 # 自主升级 D:\XufiveGit\wxgl> py -3 -m pip install --upgrade pip # 显示已安装的模块 D:\XufiveGit\wxgl> py -3 -m pip list Package Version ----------------- ----------- -pencv-python 4.1.1 argh 0.26.2 attrs 19.1.0 Automat 0.7.0 basemap 1.2.0 beautifulsoup4 4.6.3 bleach 3.1.0 cefpython3 66.0 ... ...
pip也用来安装本地whl文件:
D:\PyPackage\py3> py -3 -m pip install .\basemap-1.2.0-cp37-cp37m-win_amd64.whl
模块仓库
如果你需要下载python模块,这里是我见过的最全、最稳定的python模块仓库,由加州大学欧文分校荧光动力学实验室创建并维护。
Python模块仓库:https://www.lfd.uci.edu/~gohlke/pythonlibs/
模块安装包
如果你的很多个项目中,都会用到你自己的某些模块,那么,把这些模块做成安装包,安装到你的开发环境里,可能是最佳选择。
发布自己的python模块安装包,首先得把自己的模块做成 .whl 格式的文件,然后再找个地儿存放它,接下来就是在 pip 命令中使用 -i 参数指定这个地儿(下载源)。
Just so sooooooooo
准备工作
注册 pypi.org 用户
我原本就是 pypi 的注册用户,但当我上传 .whl 格式的文件时,却被提示无权限。仔细阅读相关文档才发现,还需要在https://test.pypi.org/account/register/ 注册。
我不确定是不是仅在这里注册就可用了。
使用 pip 安装或升级几个必备工具
生成和上传 .whl 格式的文件需要几个特殊工具,好在这几个工具使用 pip 就可以轻松搞定。
py -3 -m pip install --user --upgrade setuptools wheel py -3 -m pip install --user --upgrade twine
规划文件目录
假定要发布的模块名称为 wxgl,包含 scene.py, region.py, colorbar.py 等三个文件。文件目录结构如下:
/wxgl_pkg wxgl __init__.py colorbar.py region.py scene.py README.md setup.py
init.py
该文件其内容可以为空。我的 init.py文件如下:
-*- coding: utf-8 -*- name = 'wxgl' version = "0.3.0" version_info = (0, 3, 0, 0)
README.md
关于安装和使用的说明,文本文件,不能使用中文。
setup.py
# -*- coding: utf-8 -*- import setuptools with open("README.md", "r") as fh: long_description = fh.read() setuptools.setup( name="wxgl", version="0.3.0", author="xufive", author_email="xufive@gmail.com", description="A 3d library based pyOpenGL.", long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/xufie/wxgl", packages=setuptools.find_packages(), classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], )
提醒一点:License 很重要,pipy 检查很严格,不可乱写。最初是我使用 GPL,检查失败,后改用 MIT 才通过。
生成安装包文件
运行 setup.py 脚本,生成安装包文件
py -3 setup.py sdist bdist_wheel
顺利的话,你可以看到 dist 文件夹:
/wxgl_pkg dist wxgl-0.3.0-py3-none-any.whl wxgl-0.0.1.tar.gz wxgl __init__.py colorbar.py region.py scene.py README.md setup.py
如果只需要 .whl 文件,就运行:
py -3 setup.py bdist_wheel
上传安装包文件
切换到 dist 路径下,运行:
py -3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
根据提示输入用户名、密码,稍等片刻,即可完成。
安装
使用 -i 参数,指定安装源为https://test.pypi.org/simple/,其他参数不变:
py -3 -m pip install -i https://test.pypi.org/simple/ wxgl
加载全部内容