Python由来

1989年的圣诞节期间,吉多·范罗苏姆(Guido van Rossum)为了在阿姆斯特丹寻找一门“课余”编程项目打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。之所以选中Python作为程序的名字,是因为他是BBC电视剧——蒙提·派森的飞行马戏团(Monty Python‘s Flying Circus)的爱好者。

python的创始人:Guido van Rossum

为什么要用python

废话不说,直接上图


由上图可见,Python整体呈上升趋势,反映出Python应用越来越广泛并且也逐渐得到业内的认可!!!

Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等。互联网公司广泛使用Python来做的事一般有:自动化运维、自动化测试、大数据分析、爬虫、Web 等。

为什么是Python而不是其他语言?

C 和 Python、Java、C#等
C语言: 代码编译得到 机器码 ,机器码在处理器上直接执行,每一条指令控制CPU工作
其他语言: 代码编译得到 字节码 ,虚拟机执行字节码并转换成机器码再后在处理器上执行
Python 和 C Python这门语言是由C开发而来
对于使用:Python的类库齐全并且使用简洁,如果要实现同样的功能,Python 10行代码可以解决,C可能就需要100行甚至更多.
对于速度:Python的运行速度相较与C,绝逼是慢了
Python 和 Java、C#等
对于使用:Linux原装Python,其他语言没有;以上几门语言都有非常丰富的类库支持
对于速度:Python在速度上可能稍显逊色

所以,Python和其他语言没有什么本质区别,其他区别在于:擅长某领域、人才丰富、先入为主。

Python能做什么

Web程序:
Python经常被用于Web开发。比如,通过mod_wsgi模块,Apache可以运行用Python编写的Web程序。使用Python语言编写的Gunicorn作为Web服务器,也能够运行Python语言编写的Web程序。Python定义了WSGI(Web Server Gateway Interface)标准应用接口来协调Http服务器与基于Python的Web程序之间的沟通。一些Web框架,如Django、Pyramid、TurboGears、Tornado、web2py、Zope、Flask等,可以让程序员轻松地开发和管理复杂的Web程序。
GUI开发:
Python本身包含的Tkinter库能够支持简单的GUI(Graphical User Interface)开发。但是越来越多的Python程序员选择wxPython或者PyQt等GUI包来开发跨平台的桌面软件。使用它们开发的桌面软件运行速度快,与用户的桌面环境相契合。通过PyInstaller还能将程序发布为独立的安装程序包。
操作系统:
在很多操作系统里,Python是标准的系统组件。大多数Linux发布版以及NetBSD、OpenBSD和Mac OS X都集成了Python,可以在终端机下直接运行Python。有一些Linux发布版的安装器使用Python语言编写,比如Ubuntu的Ubiquity安装器、Red Hat Linux和Fedora的Anaconda安装器。Gentoo Linux使用Python来编写它的Portage包管理系统。Python标准库包含了多个调用作业系统功能的库。通过pywin32这个第三方软件包,Python能够访问Windows的COM服务及其它Windows API。使用IronPython,Python程序能够直接调用.Net Framework。
其他:
NumPy、SciPy、Matplotlib可以让Python程序员编写科学计算程序。有些公司会使用Scons代替make构建C++程序。
很多游戏使用C++编写图形显示等高性能模块,而使用Python或者Lua编写游戏的逻辑、服务器。相较于Python,Lua的功能更简单、体积更小;而Python则支持更多的特性和数据类型。很多游戏,如EVE Online使用Python来处理游戏中繁多的逻辑。
python版本的选择:从开源项目看,支持py3的比例已经大大提高,知名的项目一般都支持py2.7和py3+。所以,如果没有历史遗留问题或者是新项目,建议直接使用py3.
py3比py2更规范统一。
py3中字符串默认编码使用Unicode。
py3 解决了py2中字符串和二进制数据的烂摊子。py2中字符串既可以表示文本数据可以表示二进制数据
py2.7是2.x系列的最后一个版本,已经停止开发,不再增加新功能。2020年终止支持。

The Zen of Python .

`Beautiful is better than ugly.
优美胜于丑陋
Explicit is better than implicit.
明了胜于晦涩
Simple is better than complex.
简洁胜于复杂
Complex is better than complicated.
复杂胜于凌乱
Flat is better than nested.
扁平胜于嵌套
Sparse is better than dense.
间隔胜于紧凑
Readability counts.
可读性很重要
Special cases aren't special enough to break the rules.
即便假借特例的实用性之名,也不可违背这些规则
Although practicality beats purity.
觉对不允许特列必须按照这个规则
Errors should never pass silently.
不要包容所有错误
Unless explicitly silenced.
除非你确定需要这样做
In the face of ambiguity, refuse the temptation to guess.
当存在多种可能,不要尝试去猜测
There should be one-- and preferably only one --obvious way to do it.
而是尽量找一种,最好是唯一一种明显的解决方案
Although that way may not be obvious at first unless you're Dutch.
虽然这并不容易,因为你不是 Python 之父
Now is better than never.
做也许好过不做,
Although never is often better than *right* now.
但不假思索就动手还不如不做
If the implementation is hard to explain, it's a bad idea.
如果你无法向人描述你的方案
If the implementation is easy to explain, it may be a good idea.
那肯定不是一个好方案    反之亦然
Namespaces are one honking great idea -- let's do more of those!
命名空间是一种绝妙的理念,我们应当多加利用`         

by Tim Peters

Python 设计哲学:“优雅”、“明确”、“简单”


第一行Python代码

Hello World !
#!/usr/bin/env python
#-*- conding:utf-8 -*-
  
print "Hello World"
执行过程

左边的部分 python提供的大量模块、库 和用户自定义的模块。
中间的部分 python的核心——解释器,也可以叫虚拟机,这里的箭头方向是python运行过程中数据流的方向, Scanner对应词法分析,用来将文件或命令输入的每一行代码切分为一个个的token; Parser对应语法分析,在Scanner的分析结果上进行语法分析,建立抽象语法树(AST); Compiler 则根据建立的AST 生成指令集合——字节码; Code Evaluator 执行字节码文件,所以又被称为虚拟机。
右边的部分 对象/类型、内存分配 和解释器之间的箭头表示两者之间的“使用”关系; 运行时状态与解释器之间的箭头表示“修改”关系。python在执行的过程中会不断的修改当前解释器的所处的状态,在不同的状态之间切换。
关于pyc文件

我们写一个最简单的python程序。 新建 first.py文件,文件内容如下:

#!/usr/bin/env python
# -+-coding:utf-8-+-
print("First Print!")

再建 second.py

#!/usr/bin/env python
# -+-coding:utf-8-+-

import first
print("Second print!")

然后我们执行第二个文件:python second.py

输出:

First Print !
Second Print !
说明:
执行Python代码时,如果导入了其他的 .py 文件,那么,执行过程中会自动生成一个与其同名的 .pyc 文件,该文件就是Python解释器编译之后产生的字节码。
ps:代码经过编译可以产生字节码;字节码通过反编译也可以得到代码。(任何字节码通过反编译都可以得到代码)

下面解释一下 python 的执行过程:

这个时候我们会发现生成了一个 pycache 目录; 目录下有文件first.cpython-35.pyc。 如果python版本是2.x 则会在当前目录直接生成first.pyc。 我们说python是解释型语言 ,那这个pyc是什么文件呢? 按照一般的理解来说,pyc 中的c 应该是compile的意思, 既然是这样,那么python代码是如何被转换成一系列的机器指令呢?现在我们就好好深究一下这里的因果关系。 其实本质上python和java、C#是一样的,三者的程序执行原理都可以用两个词概括——虚拟机、字节码。 在python中有一个非常核心的东西——interpreter,当我们在命令行敲入python,当我们在shell中敲入命令python的时候, 目的就是为了激活这个解释器; 当我们执行 python second.py的时候,python解释器立即被激活,然后执行python程序。在pyhton的解释器还要完成一个非常重要的工作——编译.py文件。
python解释器在执行程序的时候,首先就是对文件中的python源代码进行编译,生成一个python的字节码(byte code),然后 将字节码交给python虚拟机,虚拟机则按照顺序一条一条的执行字节码,直到程序执行完。 上面在执行python second.py时,我们发现只有second.py文件生成了pyc文件,原因我们不知道,但是我们可以猜测python在执行的时候,只对需要编译的文件进行编译。那什么是需要编译的文件呢? 比如说,first.py文件不只被 second.py调用, 还被其他的py文件调用,这个时候,如果把 first.py 进行编译,那下次就直接调用编译后的pyc文件,这样就加快了执行速度。
那么有人就要问了,如果我修改了first.py文件,下次调用first.pyc的时候不就不是最新的代码了吗,对于这个我们并不需要担心。pyc文件中包含自身创建的时间,在python程序执行的时候,首先会尝试加载pyc文件,在加载的过程中,python会比对py文件和 pyc文件的时间,如果pyc文件时间早于py文件时间,就会重新编译py文件,生成新的pyc文件, 否则就会直接调用py从文件。


编程风格

语法要求
强烈建议你在每个缩进层次使用 单个制表符 或 四个空格。
不要混合使用制表符和空格来缩进,因为这在跨越不同的平台的时候,无法正常工作。
双引号中的字符串与单引号中的字符串的使用完全相同。
利用三引号,你可以指示一个多行的字符串。可以在三引号中自由的使用单引号和双引号。
值得注意的一件事是,在一个字符串中,行末的单独一个反斜杠表示字符串在下一行继续,而不是开始一个新的行。
好的编辑器能提高开发代码的效率!
变量
变量以字母或下划线开头,由字母、数字或下划线组成,变量名称区分大小写。
可以直接输入变量名查看变量值。
下划线'_'表示最后一个表达式的值。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
name = "nhy"

上述代码声明了一个变量,变量名为: name,变量name的值为:nhy

变量的作用:昵称,其代指内存里某个地址中保存的内容

变量的赋值:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

name1 = "wupeiqi"
name2 = name1

以下关键字不能声明为变量名
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']

外层变量,可以被内层变量使用
内层变量,无法被外层变量使用

在python中没有常量的概念,所有的数值都可以改变,
定义一个常量应该用大写的形式。
AGE = 37 就是常量,他是大写的!是约定俗成的。但是他是可以改的!
#!/usr/bin/env python
Shebang 是一个由井号和叹号构成的字符串行(#!), 其出现在文本文件的第一行的前两个字符. 在文件中存在Shebang的情况下, 类Unix操作系统的程序载入器会分析Shebang后的内容, 将这些内容作为解释器指令, 并调用该指令, 并将载有Shebang的文件路径作为该解释器的参数。#!先用于帮助内核找到Python解释器, 但是在导入模块时, 将会被忽略. 因此只有被直接执行的文件中才有必要加入#!
编码

python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认 ASCII)。

ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。

显然 ASCII 码无法将世界上的各种文字和符号全部表示,因此就需要一种可以代表所有字符和符号的编码,即:Unicode

Unicode(万国码)是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定所有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536。

UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ASCII 码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存...

Alt text

Python2中文件的默认编码为ASCII,在文件中含有中文的时候就会报错,
因此要在文件开头写上:

# -*- coding: utf-8 -*- 指定编码类型为utf-8 

python3中文件的默认编码为UTF-8,已经不存在上述问题。

posted on 2016-11-24 10:22  nhy  阅读(364)  评论(0编辑  收藏  举报