摘要:本文收纳了Python学习者常用的库和包,并介绍了Python使用中热门的问题。
0一、Python 简介
什么是 Python
- 一种面向对象的高级动态可解释型脚本语言。
- Python 解释器一次读取一行代码,将其解释为低级机器语言 (如字节代码) 并执行它。
- 所以这种语言常常会引起运行错误。
为何选择 Python (优点)
- Python 是当前最流行的语言,由于它更容易编码且具备很强的可解释性。
- Python 是一种面向对象的编程语言,也可用于编写一些功能代码。
- Python 是可以很好地弥补业务和开发人员之间差距。
- 与其余语言 (如 C#/Java) 相比,Python 程序被推向市场的时间更短。
- Python 自带大量的机器学习和分析包。
- 大量社区和书籍可用于支持 Python 开发人员。
- 从预测分析到UI,几乎全部类型的应用程序均可以用 Python 实现。
- Python 程序无需声明变量类型。 所以,所构建的应用程序能有更快的运行速度。
为何不选择 Python (劣势)
- 与其余语言 (C++,C#,Java) 相比,Python 程序的运行更慢,这是由于Python 中缺乏相似 Just In Time 优化器的支持。
- Python 语法空白约束给新手编码实现带来一些困难。
- Python 不像 R 语言那样提供高级的统计功能。
- Python 不适合进行低级系统和硬件交互。
Python 是如何工做
下图展现了 Python 在机器上的运行机制。这里的关键是解释器,它是负责将高级的 Python 语言编译成低级的机器语言,以便理解。python
0二、变量——目标类型及范围
- 可在程序中使用的变量存储信息,如保存用户输入,程序的本地状态等。
- Python 中的变量以名字命名。
Python 中变量类型包括数字,字符串,集合,列表,元组和字典,这些都是标准的数据类型。程序员
声明并给变量赋值
以下所示:这里首先分别为变量 myFirstVariable 分配整型数值1,字符串“Hello You”。因为 Python 中的数据类型是动态变化的,所以这种重复赋值操做是能够实现的。正则表达式
Python 中变量赋值操做又称为绑定 (blinding)。数据库
数值型
以下所示,Python 支持整型,小数,浮点型数据。express
此外,也能支持长整型,以 L 为后缀表示,如999999999999L。编程
字符串
字符串就是字母的序列表示文本信息。数组
字符串的值用引号括起来,以下所示。安全
字符串是不可改变的,一旦建立,就不能被修改。以下所示:网络
当字符串变量被赋予一个新值时,Python 将建立一个新的目标来存储这个变量值。数据结构
局部变量和全局变量
局部变量
局部变量,如在一个函数内声明一个变量,则该变量只存在于该函数中。
局部变量在外部是不能被访问的,以下所示。
Python 中 if-else 和 for/while 循环模块是不能建立局部变量,以下所示在 for/while 循环中:
输出为:
在 if-else 模块中:
输出为
所有变量
- 全局变量能够经过任意一个全局函数访问,它们存在于 __main__ 框架中。
- 此外,在函数以外你也能够声明一个全局变量。值得注意得是,当须要为一个全局变量分配新值时,必须使用“global”关键字,以下所示:
当移除“Global TestMode”只能在 some_function() 函数中将变量设置为 False。若是你想在多个模块间共享一个全局变量,那么你须要建立一个共享模块文件。如 configuration.py,并在文件中找到你所需的变量。最后导入共享模块。
查看变量类型
- 经过 type() 函数来查看变脸类型,以下所示。
整型变量中的逗号
- 逗号可视为是变量序列,以下所示。
0三、操做
数值操做
Python 支持基础的加减乘除数值计算,也支持地板除法 (floor division),以下所示。
此外,Python 还支持指数运算 (**),以下所示。
同时,Python 还能进行除法取余操做,以下所示。
字符串操做
字符串拼接
字符串复制
字符串切片
字符串反序
负索引
若是你想获得字符串的最后一个字符,那须要使用负索引值,以下所示。
查看索引值
正则表达式
- split():经过正则表达式将一个字符串分割获得一个列表。
- sub():经过正则表达式取代所要匹配的字符。
- subn():经过正则表达式取代所要匹配的字符并返回所替代字符的个数。
Casting
- str(x):将变量 x 转为字符串类型
- int(x):将变量 x 转为整型
- float(x):将变量 x 转为浮点型
集合操做
- 集合是一种无序的数据集合,定义一个集合变量,以下所示。
集合交集
- 获取两个集合的公共部分,以下所示。
集合差别
- 获取两个集合之间的不一样部分,以下所示。
集合并集
- 获取两个集合的并集,以下所示。
三元运算符
- 用于在一行编写条件语句,语法结构为 [If True] if [Expression] Else [If False],以下所示。
0四、注释
单行注释
多行注释
0五、表达式
可用于布尔运算,如:
- Equality:==
- Not Equality:!=
- Greater:>
- Less:<
- Greater or Equal:>=
- Less or Equal:<=
0六、Pickling
将对象转换为字符串并将字符串转储为一个文件的过程称为 pickling,反之则称为 unpickling。
0七、函数
- 函数是一种能够在代码中执行的语句序列。若是在你的代码中出现重复的语句,那么能够建立一个可重用的函数并在程序中使用它。
- 函数也能够引用其余函数。
- 函数消除了代码中的重复,这使得代码调试和问题查找变得更容易。
- 函数使得代码更易于理解且易于管理。
- 函数容许将一个大型的应用程序拆分为一些小的模块。
定义一个新的函数
调用一个函数
查看字符串的长度
能够调用函数 len(x),以下所示。
参数
参数能够被添加到一个函数中,使得函数更通用。
经过参数,能够将一个变量传递给方法,以下所示。
可选参数
为参数提供一个默认值来传递一个可选参数,以下所示。
* 参数
若是想让函数使用任意数量的参数,那么须要在参数名前添加 *,以下所示。
** 参数
** 容许传递可变数量的关键字参数给函数,同时也能够传递一个字典值做为关键字参数。
Return
函数可以返回一个值,以下所示。
若是一个函数须要返回多个值的话,那么最好返回一个元组 (以逗号隔开每一个值),以下所示。
Lambda 函数
- 是一种单行表达式的匿名函数
- 是一种内联函数
- Lambda 函数没有声明,只是经过一个表达式来实现,以下所示。
函数的语法结构为:variable = lambda arguments: expression
Lambda 函数也能够做为参数传递给其余的函数。
dir() 和 help()
- dir() 用于显示定义的符号
- help() 用于显示帮助文档
0八、模块
什么是模块
- Python 语言附带了200多个标准模块。
- 模块是一种将 python 程序中类似功能进行分组的组件。
- 任何 python 代码文件均可以打包为模块,而后再导入。
- 模块容许使用者在本身的代码解决方案中进行组件化设计。
- 模块提供了命名空间的概念,帮助使用者共享数据和服务。
- 模块鼓励代码重用,并减小变量名称冲突。
PYTHONPATH
- 这是 python 的环境变量,表示用于操做模块的 python 解释器所在的位置。PYTHONHOME 是一个用于搜索该路径的模块。
如何导入模块
若是你有一个文件:MyFirstPythonFile 包含不少个函数,变量和对象,而后你能够将这些功能导入到其余类中,以下所示。
Python 内部会将模块文件编译为二进制再运行模块的代码
若是想导入模块中的全部对象,能够这样:
若是模块中包含的函数或对象命名为 my_object,那么你能够将其打印出来,以下所示。
值得注意的是,若是你不想在加载时执行模块的话,那么你须要检查是否有 __name__ == ‘__main__’
From 导入模块
若是你只是想访问模块中的一个对象或某个部分,能够这样:
这种方式导入模块容许使用者在访问模块中的对象,而无需引用模块,以下所示。
能够经过 from * 来导入模块中的全部对象,以下所示。
值得注意的是,模块只能在第一次 import 时导入。若是你想使用 C 模块,那么你可使用 PyImport_ImportModule。此外,若是你想在两个不一样模块中使用定义相同的对象,那么能够将 import 和 from 结合起来导入模块。
0九、包 (Packages)
Python 中包是模块的目录。
若是你的 Python 代码中提供了大量功能,这些功能被分组到模块文件中,那么能够从模块中建立一个包,以便更好地分配和管理这些模块。
包可以更好地管理和组织模块,这有助于使用者更轻松地解决问题和查找模块。
能够将第三方软件包导入到代码中,如 pandas/scikit learn 和 tensorflow等等。
包能够包含大量的模块。
若是代码中的某些部分提供类似的功能,那么能够将模块分组到一个包中,以下所示。
上图中 packageroot 是一个根目录 (root folder),packagefolder 是其根目录下面的一个子目录,而 my_module 是在 packagefolder 目录下的一个 python 模块文件。
此外,文件夹名能够做为命名空间,以下所示。
值得注意的是,须要确保所导入的包中每一个目录都包含一个 __init__.py 文件。
PIP
- PIP 是 python 的包管理器。
- 可使用 PIP 来下载包,以下所示。
十、条件语句
条件语句 if else,以下所示。
请注意冒号和缩进在条件语句中的使用。
检查类型
你也能够在 else 部分继续添加条件逻辑语句,这样构成嵌套条件结构,以下所示。
十一、循环
While
While 语句提供一个条件,运行循环语句直到知足该条件位置,循环终止,以下所示。
For
循环必定的次数,以下所示。
循环遍历整个字符串的全部字符,以下所示。
单行 for 循环
语法结构为 [Variable] AggregateFunction ([Value] for [item] in [collection])
Yielding
- 假定你的列表中包含一万亿条数据,须要从列表中计算偶数的数量。这时候将整个列表加载到内存中并非最佳的作法,你能够经过列表来生成每一个项。
- 使用 xrange 的循环结构
结合条件 if 的 for 循环
经过带 if 的 for 循环来查找两个单词中的字母,以下所示。
Break
若是你想终止循环,能够这样:
使用 Fibonacci 函数的循环结构,以下所示。
十二、递归
函数调用自身的过程称为递归。
下面来演示一个阶乘递归函数:
建立一个阶乘函数,输入为 n
若是输入 n=0,则0! = 1
若是输入 n != 0,则n! = n(n-1)!
此外,Fibonacci 递归函数的流程以下所示:
建立一个 Fibonacci 递归函数,输入为 n
建立前两个变量,并为其分别赋值0和1
若是输入 n = 0,则返回0;若是输入 n =1,则返回1;不然,返回 (n-1)+(n-2)
值得注意的是,递归结构须要有一个退出检查,不然函数将进行无限循环。
1三、框架 Frames 和栈 Stack 调用
Python 代码被加载到堆栈中的框架。
函数及其参数和变量一块儿被加载到框架中。
框架以正确的执行顺序被加载到堆栈中。
堆栈描述了函数的执行。在函数外声明的变量被存储在 __main__ 中。
堆栈首先执行最后一个框架。
若是遇到运行错误,可使用回溯 (traceback) 来查找函数列表。
1四、集合 Collections
列表 Lists
列表是一种可以包含任何数据类型的序列数据结构,这种结构是可变的。
列表能够进行整数索引,可使用中括号来建立一个列表,以下所示。
使用索引值来添加、更新、删除列表中的项,以下所示。
此外,复制和切片一样适用于列表 (可类比字符串中的操做), 列表还支持排序操做,以下所示。
元组 Tuples
在某种程度上元组和列表相似,都是能够存储任意对象序列的数据结构。
元组的运行比列表更快速。
元组能够进行整数索引
元组是不可变的,以下所示。
值得注意的是,若是一个元组中的元素包含一个列表,那么能够对列表进行修改。一样,当为一个对象赋值并将该对象存储到列表中,随后若是对象发生变化的话,相应地,列表中的对象也会进行更新。
字典 Dictionaries
字典是编程语言中最重要的一种数据结构之一,它可以存储键值对 (key/value) 对象。
字典有许多优势,可以轻松地进行数据检索,以下所示。
能够经过以下方式建立一个字典。
打印字典中的内容,以下所示。
字典中的值能够是任意类型的数据,包括字符串,数值,布尔型,列表甚至是字典,以下所示。
值得注意的是,若是你想对一个列表进行向量或矩阵操做,能够调用 Numpy 包来实现。
1五、编译 (Compilation) 与关联 (Linking)
- 这些特征可用于一些以其余语言编写的文件,例如 C 或 C++ 等。
- 一旦将代码写入文件后,能够将文件放在 Modules 目录中。
- 在 Setup.local 文件中添加一行是很是重要的,这能确保新建立的文件可以被加载。
编译 Compilation
容许无任何错误地进行新扩展的编译过程。
关联 Linking
一旦新的扩展编译完成,他们之间就会被关联。
1六、迭代器 Iterators
Iterators
- 容许遍历一个集合
- 全部迭代器都包含 __iter __() 和 __next __() 函数
- 只需在列表,字典,字符串或集合上执行 iter(x) 便可
- 能够执行实例 next(iter),这里 iter = iter(list)
- 若是集合中元素项的数目很是大且没法一次加载内存中的全部文件,此时迭代器颇有用
- 有一些通用的迭代器使开发人员可以实现函数式编程,以下:
Filter
- 根据条件过滤掉相应的值
Map
- 对集合中的每一个值进行计算,即将值进行映射,如将文本转为整型数值。
Reduce
- 减小集合中的值,即获得一个更小的集合。如集合求和,它本质上是可迭代的。
Zip
- 获取多个集合并返回一个新集合
- 新集合的每一个项,包含每一个输入集合中的元素
- Zip 容许同时对多个集合进行横向操做,以下所示。
1七、面向对象设计——类 Classes
- Python 容许建立自定义类型,将这些用户自定义的类型称为类。这些类具备自定义属性和功能。
- 面向对象的设计容许程序员根据自身所需的属性和功能自定义建立对象。
- 属性也能够引用另外一个对象。
- Python 中的类能够引用其余类。
- Python 支持封装 -- 实例函数和变量。
- Python 支持继承,以下所示。
- 类的一个实例称为对象。对象具备可变性,一旦建立对象,相应的属性也将被更新。
__init__
- __init__ 函数在全部类中都存在。当须要进行类实例化时,该函数就将被执行。__init__ 函数能够根据须要设置相应的属性,以下所示。
值得注意的是,self 参数将包含对象的引用,这与 C# 语言中的 this 参数相似。
__str__
当调用 print 时,返回一个对象的字符串结果,以下所示。
所以,当执行 print 语句时,__str__ 将会被执行。
__cmp__
若是想要提供自定义逻辑来比较同一实例的两个对象,可使用__cmp__ 实例函数。
__cmp__ 函数返回1 (更大), - 1 (更低) 和0 (相等),以指示两个对象的大小。
能够将 __cmp__ 想象成其余编程语言中的 Equals() 方法。
Overloading
经过将更多参数做为实例,来重载一个对象。
还能够经过为 __add__ 来实现想要的运算符,如 +。
对象的浅拷贝 (Shallow Copy) 和深拷贝 (Deep Copy)
等效对象 – 包含相同的值
相同对象 – 引用相同的对象 – 内存中指向相同的地址
若是要复制整个对象,可使用复制模块 (copy module),以下所示。
这将致使浅拷贝,由于属性的引用指针将会被复制。
若是对象的一个属性是对象引用,那么它将简单地指向与原始对象相同的引用地址。
更新源对象中的属性将致使目标对象中的属性也会更新。
浅拷贝是复制引用指针。
这种状况下能够利用深拷贝,以下所示。
若是 MyClass 包含引用 MyOtherClass 对象的属性,则属性的内容将经过 deepcopy 复制到新建立的对象中。
深拷贝将对对象进行新的引用。
1八、面向对象设计——继承
Python支持对象的继承,即对象能够继承其父类的功能和属性。
继承的类能够在其函数中包含不一样的逻辑。
若是一个父类 ParentClass 有两个子类 SubClass1 和 SubClass2,那么你可使用Python来建立类,以下所示。
上例中两个子类都将包含 my_function() 函数
类的继承属性鼓励代码的重用性和可维护性。
此外,python 中支持多类继承,这与 C# 语言不一样。
多类继承 multi-Inheritance
若是你想调用父类函数,能够这样:
1九、垃圾收集——内存管理
Python 中的全部对象都存储在一个堆积空间 (heap space),而 Python 解释器能够访问此空间。
Python 有一个内置的垃圾收集机制。
这意味着 Python 能够自动为程序进行分配和取消内存,这与 C++ 或 C# 等其余语言相似。
垃圾收集机制主要是清除程序中未引用/使用的那些对象的内存空间。
因为多个对象能够共享内存引用,所以 python 使用两种机制:
- 引用计数:计算引用对象的数目。若是对象的计数为0,则取消对象的空间分配。
- 循环引用:这种机制关注的是循环引用:当取消分配 (deallocation) 的数目大于阈值时,仅取消对象所在的内存空间分配。
在 Python 中新建立的对象,能够经过以下方式进行检查:
此外,也能够经过及时或者基于事件机制来进行手动的垃圾收集。
20、 I/O
From Keyboard
使用 raw_input() 函数,以下所示。
文件 Files
使用with/as语句来打开并读取文件,这与 C# 中读取文件的操做一致。
此外,with 语句还能够处理关闭链接和其余清理操做。
打开一个文件,以下所示。
须要注意的是,readline() 可用于读取文件中的每一行。
打开两个文件,以下所示。
文件写入,以下所示。
Python 中对文件的操做一般涉及 os 和 shutil 模块。rw 表示读写模式,a表明可添加模式。
SQL
打开一个链接,以下所示。
执行一个 SQL 声明,以下所示。
网络服务 (Web Services)
查询一个闲置服务,以下所示:
序列化和反序列化 JSON 文件
反序列化 JSON,以下所示:
序列化 JSON,以下所示:
2一、异常处理
抛出异常
若是你想抛出异常,那么可使用 raise 关键字,以下所示。
捕获异常
能够经过以下方式捕获异常信息:
若是想捕获特定的异常,能够这样:
若是想使用 try/catch/finally 结构捕获异常信息,能够这样:
值得注意的是,不管 finally 部分的代码是否触发,你均可以使用 finally 来关闭数据库/文件的链接。
Try/Except/Else
若是想为异常信息分配一个变量,能够这样:
若是想定义用于自定义的限制,能够经过 assert 关键字实现,以下所示:
值得注意的是,python 中的异常一样具备继承性。
此外,你也能够建立本身的异常类,以下所示:
2二、多线程和 GIL
- GIL 表示 Global Interpreter Lock。
- GIL 确保线程能够在任什么时候间执行,并容许 CPU 选择要执行的所需线程。
- GIL 可以传递当前正在执行的线程。
- Python 支持多线程。
此外,GIL 会增长代码执行的计算开销。所以,运行多线程时需谨慎。
2三、装饰器 Decorators
- 装饰器能够为代码添加功能,其本质上是一种调用其余对象/函数的函数。 它是可调用函数,所以在调用装饰器函数时将返回随后须要调用的对象。
- 经过封装包/装一个类/函数,而后在调用函数时执行特定的代码。
- 此外,还能够经过实现通用逻辑来记录,进行安全检查等,而后使用 property 标记方法的属性。
2四、Python 中的单元测试
Python 中有许多单元测试和模拟库
下面以 unittest 为例
假定你的函数每次将输入值减小1,以下所示:
能够经过以下方式来进行单元测试:
一样地,也可使用 doctest 来测试 docstrings 中所编写的代码。
2五、一些与 Python 有关的热门话题
为何要使用 Python
- 编码简单,易于学习
- 面向对象编程语言
- 强大的分析功能和机器学习包
- 更快速地开发并将解决方案推向市场
- 提供内置的内存管理功能
- 提供巨大的社区支持和应用程序
- 无需编译,由于它自己是一种可解释的语言
- 动态输入,即无需声明变量
如何让 Python 运行得更快
- Python 是一种高级语言,不适合在系统程序或硬件层面访问。
- Python 不适用于跨平台的应用程序。
- Python 是一种动态类型的解释语言。与低级语言相比,它的优化和运行速度较慢。
- 实现基于 C 语言的扩展。
- 可使用 Spark 或 Hadoop 建立多进程
- 能够利用 Cython,Numba 和 PyPy 来加速 Python 代码或用 C 语言编写它并在 Python 中公开。
Python 爱好者都是用哪些 IDEs?
- 包括 Spyder,Pycharm 等。此外,还会使用各类的 notebooks,如 Jupyter。
Python 中热门的框架和包有哪些
- Python 中必须掌握的包有不少,包括 PyUnit (单元测试), PyDoc (文档), SciPy (代数和数值计算), Pandas (数据管理), Sci-Kit learn (机器学习和数据科学), Tensorflow (人工智能), Numpy (数组和数值计算), BeautifulSoap (网页爬取), Flask (微服务框架), Pyramid (企业应用), Django (UI MVVM), urllib (网页爬取), Tkinter (GUI), mock (模拟库), PyChecker (bug 检测器), Pylint (模块代码分析) 等。
如何托管 Python 包
对于 Unix 系统:制做脚本文件,模式为可执行且文件第一行必须是:
可使用命令行工具并执行它。也能够经过 PyPRI 和 PyPI 服务。
Python 和 R 语言能合并吗
R 语言中有着大量丰富的统计库,可使用 Rpy2 python 包或在 Juputer 中使用 beaker 笔记本或 IR 内核,在 Python 中执行 R 代码。
在运行 Python 前有没有办法可以捕获异常?
在运行代码以前,可使用 PyChecker 和 PyLink 来捕获异常信息。
总结
本文概述了 Python 最重要的25个概念,这些知识对初学者来讲足以编写本身的 Python 包或使用现有的 Python 包,但愿能帮助你们更好地学习 Python。
本文分享自华为云社区《Python从入门到精通25个关键技术点》,原文做者:简单坚持。