共计 9064 个字符,预计需要花费 23 分钟才能阅读完成。
摘要:本文收纳了 Python 学习者常常应用的库和包,并介绍了 Python 应用中热门的问题。
01Python 简介
什么是 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 语言编译成低级的机器语言,以便了解。
02 变量——指标类型及范畴
· 可在程序中应用的变量存储信息,如保留用户输出,程序的本地状态等。
· Python 中的变量以名字命名。
Python 中变量类型包含数字,字符串,汇合,列表,元组和字典,这些都是规范的数据类型。
申明并给变量赋值
如下所示:这里首先别离为变量 myFirstVariable 调配整型数值 1,字符串“Hello You”。因为 Python 中的数据类型是动态变化的,因而这种反复赋值操作是能够实现的。
Python 中变量赋值操作又称为绑定 (blinding)。
数值型
如下所示,Python 反对整型,小数,浮点型数据。
此外,也能反对长整型,以 L 为后缀示意,如 999999999999L。
字符串
字符串就是字母的序列示意文本信息。
字符串的值用引号括起来,如下所示。
字符串是不可扭转的,一旦创立,就不能被批改。如下所示:
当字符串变量被赋予一个新值时,Python 将创立一个新的指标来存储这个变量值。
局部变量和全局变量
局部变量
局部变量,如在一个函数内申明一个变量,则该变量只存在于该函数中。
局部变量在内部是不能被拜访的,如下所示。
Python 中 if-else 和 for/while 循环模块是不能创立局部变量,如下所示在 for/while 循环中:
输入为:
在 if-else 模块中:
输入为
全副变量
· 全局变量能够通过任意一个全局函数拜访,它们存在于 main 框架中。
· 此外,在函数之外你也能够申明一个全局变量。值得注意得是,当须要为一个全局变量调配新值时,必须应用“global”关键字,如下所示:
当移除“Global TestMode”只能在 some_function() 函数中将变量设置为 False。如果你想在多个模块间共享一个全局变量,那么你须要创立一个共享模块文件。如 configuration.py,并在文件中找到你所需的变量。最初导入共享模块。
查看变量类型
· 通过 type() 函数来查看变脸类型,如下所示。
整型变量中的逗号
· 逗号可视为是变量序列,如下所示。
03 操作
数值操作
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],如下所示。
04 正文
单行正文
多行正文
05 表达式
可用于布尔运算,如:
· Equality:==
· Not Equality:!=
· Greater:>
· Less:<
· Greater or Equal:>=
· Less or Equal:<=
06Pickling
将对象转换为字符串并将字符串转储为一个文件的过程称为 pickling,反之则称为 unpickling。
07 函数
· 函数是一种能够在代码中执行的语句序列。如果在你的代码中呈现反复的语句,那么能够创立一个可重用的函数并在程序中应用它。
· 函数也能够援用其余函数。
· 函数打消了代码中的反复,这使得代码调试和问题查找变得更容易。
· 函数使得代码更易于了解且易于治理。
· 函数容许将一个大型的应用程序拆分为一些小的模块。
定义一个新的函数
调用一个函数
查看字符串的长度
能够调用函数 len(x),如下所示。
参数
参数能够被增加到一个函数中,使得函数更通用。
通过参数,能够将一个变量传递给办法,如下所示。
可选参数
为参数提供一个默认值来传递一个可选参数,如下所示。
参数
如果想让函数应用任意数量的参数,那么须要在参数名前增加 *,如下所示。
参数
容许传递可变数量的关键字参数给函数,同时也能够传递一个字典值作为关键字参数。
Return
函数可能返回一个值,如下所示。
如果一个函数须要返回多个值的话,那么最好返回一个元组 (以逗号隔开每个值),如下所示。
Lambda 函数
· 是一种单行表达式的匿名函数
· 是一种内联函数
· Lambda 函数没有申明,只是通过一个表达式来实现,如下所示。
函数的语法结构为:variable = lambda arguments: expression
Lambda 函数也能够作为参数传递给其余的函数。
dir() 和 help()
· dir() 用于显示定义的符号
· help() 用于显示帮忙文档
08 模块
什么是模块
· Python 语言附带了 200 多个规范模块。
· 模块是一种将 python 程序中类似性能进行分组的组件。
· 任何 python 代码文件都能够打包为模块,而后再导入。
· 模块容许使用者在本人的代码解决方案中进行组件化设计。
· 模块提供了命名空间的概念,帮忙使用者共享数据和服务。
· 模块激励代码重用,并缩小变量名称抵触。
PYTHONPATH
· 这是 python 的环境变量,示意用于操作模块的 python 解释器所在的地位。PYTHONHOME 是一个用于搜寻该门路的模块。
如何导入模块
如果你有一个文件:MyFirstPythonFile 蕴含很多个函数,变量和对象,而后你能够将这些性能导入到其余类中,如下所示。
Python 外部会将模块文件编译为二进制再运行模块的代码
如果想导入模块中的所有对象,能够这样:
如果模块中蕴含的函数或对象命名为 my_object,那么你能够将其打印进去,如下所示。
值得注意的是,如果你不想在加载时执行模块的话,那么你须要查看是否有 name ==‘__main__’
From 导入模块
如果你只是想拜访模块中的一个对象或某个局部,能够这样:
这种形式导入模块容许使用者在拜访模块中的对象,而无需援用模块,如下所示。
能够通过 from * 来导入模块中的所有对象,如下所示。
值得注意的是,模块只能在第一次 import 时导入。如果你想应用 C 模块,那么你能够应用 PyImport_ImportModule。此外,如果你想在两个不同模块中应用定义雷同的对象,那么能够将 import 和 from 联合起来导入模块。
09 包 (Packages)
Python 中包是模块的目录。
如果你的 Python 代码中提供了大量性能,这些性能被分组到模块文件中,那么能够从模块中创立一个包,以便更好地调配和治理这些模块。
包可能更好地治理和组织模块,这有助于使用者更轻松地解决问题和查找模块。
能够将第三方软件包导入到代码中,如 pandas/scikit learn 和 tensorflow 等等。
包能够蕴含大量的模块。
如果代码中的某些局部提供类似的性能,那么能够将模块分组到一个包中,如下所示。
上图中 packageroot 是一个根目录 (root folder),packagefolder 是其根目录上面的一个子目录,而 my_module 是在 packagefolder 目录下的一个 python 模块文件。
此外,文件夹名能够作为命名空间,如下所示。
值得注意的是,须要确保所导入的包中每个目录都蕴含一个 __init__.py 文件。
PIP
· PIP 是 python 的包管理器。
· 能够应用 PIP 来下载包,如下所示。
10 条件语句
条件语句 if else,如下所示。
请留神冒号和缩进在条件语句中的应用。
查看类型
你也能够在 else 局部持续增加条件逻辑语句,这样形成嵌套条件构造,如下所示。
11 循环
While
While 语句提供一个条件,运行循环语句直到满足该条件地位,循环终止,如下所示。
For
循环肯定的次数,如下所示。
循环遍历整个字符串的所有字符,如下所示。
单行 for 循环
语法结构为 [Variable] AggregateFunction ([Value] for [item] in [collection])
Yielding
· 假设你的列表中蕴含一万亿条数据,须要从列表中计算偶数的数量。这时候将整个列表加载到内存中并不是最佳的做法,你能够通过列表来生成每个项。
· 应用 xrange 的循环构造
联合条件 if 的 for 循环
通过带 if 的 for 循环来查找两个单词中的字母,如下所示。
Break
如果你想终止循环,能够这样:
应用 Fibonacci 函数的循环构造,如下所示。
12 递归
函数调用本身的过程称为递归。
上面来演示一个阶乘递归函数:
创立一个阶乘函数,输出为 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)
值得注意的是,递归结构须要有一个退出查看,否则函数将进行有限循环。
13 框架 Frames 和栈 Stack 调用
Python 代码被加载到堆栈中的框架。
函数及其参数和变量一起被加载到框架中。
框架以正确的执行程序被加载到堆栈中。
堆栈形容了函数的执行。在函数外申明的变量被存储在 main 中。
堆栈首先执行最初一个框架。
如果遇到运行谬误,能够应用回溯 (traceback) 来查找函数列表。
14 汇合 Collections
列表 Lists
列表是一种可能蕴含任何数据类型的序列数据结构,这种构造是可变的。
列表能够进行整数索引,能够应用中括号来创立一个列表,如下所示。
应用索引值来增加、更新、删除列表中的项,如下所示。
此外,复制和切片同样实用于列表 (可类比字符串中的操作), 列表还反对排序操作,如下所示。
元组 Tuples
在某种程度上元组和列表相似,都是能够存储任意对象序列的数据结构。
元组的运行比列表更疾速。
元组能够进行整数索引
元组是不可变的,如下所示。
值得注意的是,如果一个元组中的元素蕴含一个列表,那么能够对列表进行批改。同样,当为一个对象赋值并将该对象存储到列表中,随后如果对象发生变化的话,相应地,列表中的对象也会进行更新。
字典 Dictionaries
字典是编程语言中最重要的一种数据结构之一,它可能存储键值对 (key/value) 对象。
字典有许多长处,可能轻松地进行数据检索,如下所示。
能够通过如下形式创立一个字典。
打印字典中的内容,如下所示。
字典中的值能够是任意类型的数据,包含字符串,数值,布尔型,列表甚至是字典,如下所示。
值得注意的是,如果你想对一个列表进行向量或矩阵操作,能够调用 Numpy 包来实现。
15 编译 (Compilation) 与关联 (Linking)
· 这些特色可用于一些以其余语言编写的文件,例如 C 或 C++ 等。
· 一旦将代码写入文件后,能够将文件放在 Modules 目录中。
· 在 Setup.local 文件中增加一行是十分重要的,这能确保新创建的文件可能被加载。
编译 Compilation
容许无任何谬误地进行新扩大的编译过程。
关联 Linking
一旦新的扩大编译实现,他们之间就会被关联。
16 迭代器 Iterators
Iterators
· 容许遍历一个汇合
· 所有迭代器都蕴含 __iter __() 和 __next __() 函数
· 只需在列表,字典,字符串或汇合上执行 iter(x) 即可
· 能够执行实例 next(iter),这里 iter = iter(list)
· 如果汇合中元素项的数目十分大且无奈一次加载内存中的所有文件,此时迭代器很有用
· 有一些通用的迭代器使开发人员可能实现函数式编程,如下:
Filter
· 依据条件过滤掉相应的值
Map
· 对汇合中的每个值进行计算,行将值进行映射,如将文本转为整型数值。
Reduce
· 缩小汇合中的值,即失去一个更小的汇合。如汇合求和,它实质上是可迭代的。
Zip
· 获取多个汇合并返回一个新汇合
· 新汇合的每个项,蕴含每个输出汇合中的元素
· Zip 容许同时对多个汇合进行横向操作,如下所示。
17 面向对象设计——类 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 复制到新创建的对象中。
深拷贝将对对象进行新的援用。
18 面向对象设计——继承
Python 反对对象的继承,即对象能够继承其父类的性能和属性。
继承的类能够在其函数中蕴含不同的逻辑。
如果一个父类 ParentClass 有两个子类 SubClass1 和 SubClass2,那么你能够应用 Python 来创立类,如下所示。
上例中两个子类都将蕴含 my_function() 函数
类的继承属性激励代码的重用性和可维护性。
此外,python 中反对多类继承,这与 C# 语言不同。
多类继承 multi-Inheritance
如果你想调用父类函数,能够这样:
19 垃圾收集——内存治理
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,如下所示:
21 异样解决
抛出异样
如果你想抛出异样,那么能够应用 raise 关键字,如下所示。
捕捉异样
能够通过如下形式捕捉异样信息:
如果想捕捉特定的异样,能够这样:
如果想应用 try/catch/finally 构造捕捉异样信息,能够这样:
值得注意的是,无论 finally 局部的代码是否触发,你都能够应用 finally 来敞开数据库 / 文件的连贯。
Try/Except/Else
如果想为异样信息调配一个变量,能够这样:
如果想定义用于自定义的限度,能够通过 assert 关键字实现,如下所示:
值得注意的是,python 中的异样同样具备继承性。
此外,你也能够创立本人的异样类,如下所示:
22 多线程和 GIL
· GIL 示意 Global Interpreter Lock。
· GIL 确保线程能够在任何工夫执行,并容许 CPU 抉择要执行的所需线程。
· GIL 可能传递以后正在执行的线程。
· Python 反对多线程。
此外,GIL 会减少代码执行的计算开销。因而,运行多线程时需谨慎。
23 装璜器 Decorators
· 装璜器能够为代码增加性能,其本质上是一种调用其余对象 / 函数的函数。它是可调用函数,因而在调用装璜器函数时将返回随后须要调用的对象。
· 通过封装包 / 装一个类 / 函数,而后在调用函数时执行特定的代码。
· 此外,还能够通过实现通用逻辑来记录,进行安全检查等,而后应用 property 标记办法的属性。
24Python 中的单元测试
Python 中有许多单元测试和模仿库
上面以 unittest 为例
假设你的函数每次将输出值缩小 1,如下所示:
能够通过如下形式来进行单元测试:
同样地,也能够应用 doctest 来测试 docstrings 中所编写的代码。
25 一些与 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 个关键技术点》,原文作者:简略保持。
点击关注,第一工夫理解华为云陈腐技术~