谈谈python

有人的地方就有江湖,有计算机的地方就有编程语言。今天我们来谈谈python

在谈python之前我们先看一组Tiobe历年的统计数据

年份 /年 历年年度语言
2003 C++
2004 PHP
2005 JAVA
2006 RUBY
2007 PYTHON
2008 C
2009 GO
2010 PYTHON
2011 OBJECTIVE-C
2012 OBJECTIVE-C
2013 TRANSACT-SQL
2014 JAVASCRIPT
2015 JAVA
2016 GO
2017 C
2018 PYTHON

在16年中python有3年别评为年度语言,这是任何一门编程语言都达不到的,可见python的过人之处!

python是什么?

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。

python应用领域?

Web 和 Internet开发

Python是Web开发的主流语言,但不能说是最好的语言。同样是解释型语言的JavaScript,在Web开发中应用的已经较为广泛,原因是其有一套成熟的框架。但Python也具有独特的优势。比如Python相比于JS、PHP在语言层面较为完备,而且对于同一个开发需求能够提供多种方案。库的内容丰富,使用方便。Python在Web方面也有自己的框架,如django、flask、Tornado和Web2py等。可以说用Python开发的Web项目小而精,支持最新的XML技术,而且数据处理的功能较为强大。

科学计算和数据分析
  • NumPy

    NumPy最强大的是n维数组,该库还包含基本的线性代数函数、傅立叶变换、随机函数和其他底层语言(如Fortran、C和C++)集成的工具。

  • SciPy

    SciPy建立在NumPy基础上,它是离散傅立叶变换、线性代数、优化和稀疏矩阵等多种高级科学和工程模块最有用的库之一。

  • Matplotlib

    Matplotlib主要用于绘制各种各样的图形,从直方图到线图、热力图,还可以使用Latex命令在图像中添加数学符号。

  • Pandas

    Pandas主要用于结构化数据的运算和操作,广泛用于数据整理和预处理,其有助于提高Python在数据科学社区的使用。

  • Scikit

    Scikit主要用于机器学习,该库建立在NumPy、SciPy和matplotlib基础上,包含许多有效的机器学习和统计建模工具,如分类、回归、聚类和降维。

  • Statsmodels

    Statsmodels用于统计建模。Statsmodels是一个Python中提供用户探索数据、估计统计模型和执行统计测试的模组。可用于不同类型数据的描述性统计,统计测试,绘图功能和结果统计。

  • Seaborn

    Seaborn用于数据可视化。Seaborn是一个用于在Python中制作有吸引力和翔实的统计图形库。它是基于matplotlib。Seaborn旨在使可视化成为探索和理解数据的核心组成。

  • Bokeh

    Bokeh用于在现代网络浏览器上创建交互式图表,仪表盘和数据应用程序。它赋予用户以D3.js的风格生成优雅简洁的图形。此外,它具有超大型或流式数据集的高性能交互能力。

  • Blaze

    Blaze将Numpy和Pandas的能力扩展到分布式和流式传输数据集。它可以用于从众多来源(包括Bcolz,MongoDB,SQLAlchemy,Apache Spark,PyTables等)访问数据。与Bokeh一起,Blaze可以作为在巨型数据块上创建有效可视化和仪表盘的强大的工具。

  • Scrapy

    Scrapy用于网络爬虫。它是获取特定模式数据的非常有用的框架。它从网站首页url开始,然后挖掘网站内的网页内容来收集信息。

  • SymPy

    SymPy用于符号计算。它具有从基本算术符号到微积分,代数,离散数学和量子物理学的广泛能力。另一个有用的功能是将计算结果格式化为LaTeX代码。

  • Requests

    Requests用于web访问。它类似于标准python库urllib2,但是代码更容易。你会发现与urllib2的微妙差异,但是对于初学者来说,Requests可能更方便。

人工智能

在人工智能的应用方面,Python强大而丰富的库以及数据分析能力。比如说在神经网络、深度学习方面,Python都能够找到比较成熟的包来加以调用。而且Python是面向对象的动态语言,且适用于科学计算,这就使得Python在人工智能方面备受青睐。虽然人工智能程序不限于Python,但依旧为Python提供了大量的API,这也正是因为Python当中包含着较多的适用于人工智能的模块,比如sklearn模块等等。调用方便、科学计算功能强大依旧是Python在AI领域最强大的竞争力。

数据库编程

程序员可通过遵循Python DB-API(数据库应用程序编程接口)规范的模块与Microsoft SQL Server,Oracle,Sybase,DB2,MySQL、SQLite等数据库通信。python自带有一个Gadfly模块,提供了一个完整的SQL环境。

网络编程

提供丰富的模块支持sockets编程,能方便快速地开发分布式应用程序。很多大规模软件开发计划例如Zope,Mnet 及BitTorrent. Google都在广泛地使用它。

多媒体应用

Python的PyOpenGL模块封装了“OpenGL应用程序编程接口”,能进行二维和三维图像处理。PyGame模块可用于编写游戏软件。

python的优点和缺点:

优点:
  • 简单、易学:python非常简单,非常适合人类阅读,python的代码就像英语文章一样,这种伪代码是它的最大的优点之一,使你能够专注于解决问题;python及其容易上手,python摒弃了c语言中非常复杂的指针,简化了pyhon语法。
  • 免费、开源:python的所有内容都是免费的、开源的,可以任意发布软件的版本、阅读软件的源代码、对它做改动。
  • 可移植性:由于python是开源的,目前已经被移植到了大多数平台,如果的程序避开了对系统的依懒性,那么你的程序可以在任意平台运行使用,例如:Windows、MacOS、Linux、Andorid、iOS等等。
  • 代码量少,开发迅速:以冒泡排序为例
    python3
def bubble_sort(nums):
    for i in range(len(nums) - 1):  # 这个循环负责设置冒泡排序进行的次数
        for j in range(len(nums) - i - 1):  # j为列表下标
            if nums[j] > nums[j + 1]:
                nums[j], nums[j + 1] = nums[j + 1], nums[j]
    return nums
 
print(bubble_sort([45, 32, 8, 33, 12, 22, 19, 97]))
# 输出:[8, 12, 19, 22, 32, 33, 45, 97]

java

public static void bubbleSort(int []arr) {
 
        for(int i =1;i<arr.length;i++) { 
            for(int j=0;j<arr.length-i;j++) {
                if(arr[j]>arr[j+1]) {
                    int temp = arr[j];
                     
                    arr[j]=arr[j+1];
                     
                    arr[j+1]=temp;
            }
            }    
        }
    }

C语言

#include 
 
#define ARR_LEN 255 /*数组长度上限*/
#define elemType int /*元素类型*/
 
/* 冒泡排序 */
/* 1. 从当前元素起,向后依次比较每一对相邻元素,若逆序则交换 */
/* 2. 对所有元素均重复以上步骤,直至最后一个元素 */
/* elemType arr[]: 排序目标数组; int len: 元素个数 */
void bubbleSort (elemType arr[], int len) {
    elemType temp;
    int i, j;
    for (i=0; i<len-1; i++) /* 外循环为排序趟数,len个数进行len-1趟 */
        for (j=0; j<len-1-i; j++) { /* 内循环为每趟比较的次数,第i趟比较len-i次 */
            if (arr[j] > arr[j+1]) { /* 相邻元素比较,若逆序则交换(升序为左大于右,降序反之) */
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
}
 
int main (void) {
    elemType arr[ARR_LEN] = {3,5,1,-7,4,9,-6,8,10,4};
    int len = 10;
    int i;
     
    bubbleSort (arr, len);
    for (i=0; i<len; i++)
        printf ("%d\t", arr[i]);
    putchar ('\n');
     
    return 0;
}

C++

#include 
using namespace std;
template<typename T>
//整数或浮点数皆可使用
void bubble_sort(T arr[], int len)
{
    int i, j;  T temp;
    for (i = 0; i < len - 1; i++)
        for (j = 0; j < len - 1 - i; j++)
        if (arr[j] > arr[j + 1])
        {
            temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
}
int main()
{
    int arr[] = { 61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62 };
    int len = (int) sizeof(arr) / sizeof(*arr);
    bubble_sort(arr, len);
    for (int i = 0; i < len; i++)
        cout << arr[i] << ' ';
 
    cout << endl;
 
    float arrf[] = { 17.5, 19.1, 0.6, 1.9, 10.5, 12.4, 3.8, 19.7, 1.5, 25.4, 28.6, 4.4, 23.8, 5.4 };
    len = (int) sizeof(arrf) / sizeof(*arrf);
    bubble_sort(arrf, len);
    for (int i = 0; i < len; i++)
        cout << arrf[i] << ' ';
 
    return 0;
}

JavaScript

function bubbleSort(arr) {
    var i = arr.length, j;
    var tempExchangVal;
    while (i > 0) {
        for (j = 0; j < i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                tempExchangVal = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tempExchangVal;
            }
        }
        i--;
    }
    return arr;
}
 
var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];
var arrSorted = bubbleSort(arr);
console.log(arrSorted);
alert(arrSorted);

控制台将输出:[1, 2, 3, 4, 5, 6, 7, 8, 9]
并且弹窗;
GO语言

func BubbleSort(values []int) {
    flag := true
    vLen := len(values)
    for i := 0; i < vLen-1; i++ {
        flag = true
        for j := 0; j < vLen-i-1; j++ {
            if values[j] > values[j+1] {
                values[j], values[j+1] = values[j+1], values[j]
                flag = false
                continue
            }
        }
        if flag {
            break
        }
    }
}
缺点:
  • 运行速度慢:和C程序相比非常慢,因为Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是运行前直接编译成CPU能执行的机器码,所以非常快。

但是大量的应用程序不需要这么快的运行速度,因为用户根本感觉不出来。例如开发一个下载MP3的网络应用程序,C程序的运行时间需要0.001秒,而Python程序的运行时间需要0.1秒,慢了100倍,但由于网络更慢,需要等待1秒,你想,用户能感觉到1.001秒和1.1秒的区别吗?这就好比F1赛车和普通的出租车在北京三环路上行驶的道理一样,虽然F1赛车理论时速高达400公里,但由于三环路堵车的时速只有20公里,因此,作为乘客,你感觉的时速永远是20公里。

  • 代码不能加密:如果要发布你的Python程序,实际上就是发布源代码,这一点跟C语言不同,C语言不用发布源代码,只需要把编译后的机器码(也就是你在Windows上常见的xxx.exe文件)发布出去。要从机器码反推出C代码是不可能的,所以,凡是编译型的语言,都没有这个问题,而解释型的语言,则必须把源码发布出去。

这个缺点仅限于你要编写的软件需要卖给别人挣钱的时候。好消息是目前的互联网时代,靠卖软件授权的商业模式越来越少了,靠网站和移动应用卖服务的模式越来越多了,后一种模式不需要把源码给别人。

再说了,现在如火如荼的开源运动和互联网自由开放的精神是一致的,互联网上有无数非常优秀的像Linux一样的开源代码,我们千万不要高估自己写的代码真的有非常大的“商业价值”。那些大公司的代码不愿意开放的更重要的原因是代码写得太烂了,一旦开源,就没人敢用他们的产品了。

  • 强制缩进:如果你经常使用C语言或者Java语言来编写程序,那么python的强制缩进会让你很不适应,如果习惯看强制缩进,写出的代码排版非常美观。

python程序执行过程

1、PyCodeObject:PyCodeObject则是Python编译器真正编译成的结果。
2、当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。
3、当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
4、每次加载模块时,如果同时存在.py和.pyc,Python会尝试使用.pyc,如果.pyc的编译时间早于.py的修改时间,则重新编译.py并更新.pyc。
5、所以说pyc文件其实是PyCodeObject的一种持久化保存方式。
6、PyCodeObject对象的创建时机是模块加载的时候,即import。
7、Python解释器只把我们可能重用到的模块持久化成pyc文件。

python工具功能?

  • Tkinter

Python默认的图形界面接口。Tkinter是一个和Tk接口的Python模块,Tkinter库提供了对Tk API的接口,它属于Tcl/Tk的GUI工具组。

  • PyGTK

用于python GUI程序开发的GTK+库。GTK就是用来实现GIMP和Gnome的库。

  • PyQt

用于python的Qt开发库。QT就是实现了KDE环境的那个库,由一系列的模块组成,有qt, qtcanvas, qtgl, qtnetwork, qtsql, qttable, qtui and qtxml,包含有300个类和超过5750个的函数和方法。PyQt还支持一个叫qtext的模块,它包含一个QScintilla库。该库是Scintillar编辑器类的Qt接口。

  • wxPython

GUI编程框架,熟悉MFC的人会非常喜欢,简直是同一架构(对于初学者或者对设计要求不高的用户来说,使用Boa Constructor可以方便迅速的进行wxPython的开发)

  • PIL

python提供强大的图形处理的能力,并提供广泛的图形文件格式支持,该库能进行图形格式的转换、打印和显示。还能进行一些图形效果的处理,如图形的放大、缩小和旋转等。是Python用户进行图象处理的强有力工具。

  • Psyco

一个Python代码加速度器,可使Python代码的执行速度提高到与编译语言一样的水平。

  • xmpppy

Jabber服务器采用开发的XMPP协议,Google Talk也是采用XMPP协议的IM系统。在Python中有一个xmpppy模块支持该协议。也就是说,我们可以通过该模块与Jabber服务器通信,是不是很Cool。

  • PyMedia

用于多媒体操作的python模块。它提供了丰富而简单的接口用于多媒体处理(wav, mp3, ogg, avi, divx, dvd, cdda etc)。可在Windows和Linux平台下使用。

  • Pmw

Python megawidgets,Python超级GUI组件集,一个在python中利用Tkinter模块构建的高级GUI组件,每个Pmw都合并了一个或多个Tkinter组件,以实现更有用和更复杂的功能。

  • PyXML

用Python解析和处理XML文档的工具包,包中的4DOM是完全相容于W3C DOM规范的。它包含以下内容:
xmlproc: 一个符合规范的XML解析器。Expat: 一个快速的,非验证的XML解析器。还有其他和他同级别的还有 PyHtml PySGML。

  • PyGame

用于多媒体开发和游戏软件开发的模块。

  • PyOpenGL

模块封装了“OpenGL应用程序编程接口”,通过该模块python程序员可在程序中集成2D和3D的图形。

  • NumPy、NumArray、SAGE

NumArray是Python的一个扩展库,主要用于处理任意维数的固定类型数组,简单说就是一个矩阵库。它的底层代码使用C来编写,所以速度的优势很明显。SAGE是基于NumPy和其他几个工具所整合成的数学软件包,目标是取代Magma, Maple, Mathematica和Matlab 这类工具。

  • MySQLdb

用于连接MySQL数据库。还有用于zope的ZMySQLDA模块,通过它就可在zope中连接mysql数据库。

  • Sqlite3

用于连接sqlite数据库。

  • Python-ldap

提供一组面向对象的API,可方便地在python中访问ldap目录服务,它基于OpenLDAP2.x。

  • smtplib

发送电子邮件。

  • ftplib

定义了FTP类和一些方法,用以进行客户端的ftp编程。如果想了解ftp协议的详细内容,请参考RFC959。

  • PyOpenCL

OpenCL的Python接口,通过该模块可以使用GPU实现并行计算。

python标准库?

Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。Python标准库命名接口清晰、文档良好,很容易学习和使用。

Python社区提供了大量的第三方模块,使用方式与标准库类似。它们的功能无所不包,覆盖科学计算、Web开发、数据库接口、图形系统多个领域,并且大多成熟而稳定。第三方模块可以使用Python或者C语言编写。SWIG,SIP常用于将C语言编写的程序库转化为Python模块。Boost C++ Libraries包含了一组库,Boost.Python,使得以 Python 或 C++ 编写的程序能互相调用。借助于拥有基于标准库的大量工具、能够使用低级语言如C和可以作为其他库接口的C++,Python已成为一种强大的应用于其他语言与工具之间的胶水语言。

Python标准库的主要功能有:

文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能

文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能

操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、写日记(logging)等功能

网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能

网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架

W3C格式支持,包含HTML,SGML,XML的处理

其它功能,包括国际化支持、数学运算、HASH、Tkinter等

python开发环境(工具):

  • IDLE:Python内置IDE (随python安装包提供)

  • PyCharm:详见百度百科PyCharm,由著名的JetBrains公司开发,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工 具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。

  • Komodo和Komodo Edit:后者是前者的免费精简版

  • Spyder:安装Anaconda自带的高级IDE

  • PythonWin:ActivePython或pywin32均提供该IDE,仅适用于Windows

  • SPE(Stani’s Python Editor):功能较多的自由软件,基于wxPython

  • Ulipad:功能较全的自由软件,基于wxPython;作者是中国Python高手limodou

  • WingIDE:可能是功能最全的IDE,但不是自由软件(教育用户和开源用户可以申请免费key)

  • Eric:基于PyQt的自由软件,功能强大。全名是:The Eric Python IDE
    DrPython

  • PyScripter:使用Delphi开发的轻量级的开源Python IDE, 支持Python2.6和3.0。

  • PyPE:一个开源的跨平台的PythonIDE。

  • bpython: 类Unix操作系统下使用curses库开发的轻量级的Python解释器。语法提示功能。

  • eclipse + pydev插件:方便调试程序

  • emacs:自带python支持,自动补全、refactor等功能需要插件支持

  • Vim
    : 最新7.3版编译时可以加入python支持,提供python代码自动提示支持

  • Visual Studio 2003 + VisualPython:仅适用Windows,已停止维护,功能较差

  • SlickEdit

  • Visual Studio 2010 + Python Tools for Visual Studio

  • TextMate

  • Netbeans IDE

  • Sublime ipython

另外,诸如Notepad++、EditPlus、UltraEdit等通用的程序员文本编辑器软件也能对Python代码编辑提供一定的支持,比如代码自动着色、注释快捷键等,但是否够得上集成开发环境的水平,尚有待评估。

python 解释器:

  • Python是一门跨平台的脚本语言,Python规定了一个Python语法规则,实现了Python语法的解释程序就成为了Python的解释器。
  • CPython(ClassicPython,也就是原始的Python实现,需要区别于其他实现的时候才以CPython称呼;或解作C语言实现的Python)。这是最常用的Python版本。
  • Jython(原名JPython;Java语言实现的Python,现已正式发布)。Jython可以直接调用Java的各种函数库。
  • PyPy(使用Python语言写的Python)
  • IronPython(面向.NET和ECMACLI的Python实现)。IronPython能够直接调用.net平台的各种函数库。可以将Python程序编译成.net程序。
  • ZhPy(周蟒)(支持使用繁/简中文语句编写程序的Python语言)

python著名应用:

  • Digwebs-Web应用框架
  • Pylons-Web应用框架
  • Zope- 应用服务器
  • Plone- 内容管理系统
  • Django- 鼓励快速开发的Web应用框架
  • Uliweb- 国人开发的轻量级Web框架
  • TurboGears- 另一个Web应用快速开发框架
  • Twisted–Python的网络应用程序框架
  • Python Wikipedia Robot Framework- MediaWiki的机器人程序
  • MoinMoinWiki- Python写成的Wiki程序
  • flask- Python 微Web框架
  • tornado- 非阻塞式服务器
  • Webpy- Python 微Web框架
  • Bottle- Python 微Web框架
  • EVE- 网络游戏EVE大量使用Python进行开发
  • Reddit - 社交分享网站
  • Dropbox - 文件分享服务
  • TurboGears - 另一个Web应用快速开发框架
  • Fabric - 用于管理成百上千台Linux主机的程序库
  • Trac - 使用Python编写的BUG管理系统
  • Mailman - 使用Python编写的邮件列表软件
  • Mezzanine - 基于Django编写的内容管理系统
  • Blender - 以C与Python开发的开源3D绘图软件

你可能感兴趣的:(python)