Python的创始人叫吉多·范罗苏姆(Guido van Rossum),Python诞生于1989年,用于作为ABC语言的继承。
Python崇尚优美、清晰和简单,是一个优秀并且广泛使用的语言。
2016年时,Python排名程序语言第5名。

目前Python的主要应用领域:
1、云计算:典型的如OpenStack
2、科学运算、人工智能:典型如NumPy等
3、Web开发:如Django
4、系统运维
5、金融
6、图形GUI

编程语言主要由以下几种分类方法:
1、编译型和解释型
2、静态语言和动态语言
3、强类型定义语言和弱类型定义语言

编译型:
和汇编语言是一样的,也是一个负责翻译的程序来对我们的源码进行转换,生成相应的可执行代码,这个过程称为编译(compile),负责编译的程序称为编译器(compiler)。如果我们写的程序代码都包含在一个源文件中,那么编译之后就会直接生成一个可执行的文件,我们就可以直接运行了。但是对于一个比较复杂的项目,为了方便管理,我们通常把代码分散在各个源文件中,作为不同的模块来组织。这时编译各个文件时,就会生成目标文件(object files),而不是前面所说的可执行文件。一般一个源文件的编译都会对应一个目标文件。这些目标文件里的内容基本上是可执行代码了,但对于整个项目来说,只是一部分,所以还不能直接运行。只有等待所有的源文件都编译完成,我们就可以把这些半成品的目标文件打包成一个可执行文件,这个工作由另一个程序完成,这个过程是把包含可执行代码的目标文件连接装配起来,所以又称为链接(link),负责这个步骤的程序叫做链接程序(linker)。链接程序除了目标文件之外,可能还有各种资源,如图形文件、声音文件等,还负责去除目标文件之间的冗余重复代码等,所以也很累。链接完成之后,一般就可以得到我们想要的可执行文件了。

解释型:
编译型程序,是一次把所有的代码转换成机器语言,然后写成可执行文件;而解释型程序,是每执行到源程序的某一条指令,则会有一个称之为解释程序的外壳程序将源代码转换成二进制代码以供执行,总而言之,就是不断的解释、执行、解释、执行,所以,解释型代码是离不开解释程序的。解释型程序中,由于程序总是以源代码的形式出现,因此只要有相应的解释器,移植几乎不成问题。编译型程序也可以移植,但是针对不同系统,必须分别重新编译,对于复杂工程来说,非常耗费时间。但解释型程序因为一边解释,一边执行,因此速度比编译型程序要慢上好多,几百倍也不足为奇。

总结:
编译型由于速度快,因此对系统要求较低,开发操作系统、数据库和大型应用等都使用它,比如C/C++、Pascal/Delphi、VB等都是编译语言。而一些网页脚本、服务器脚本和辅助开发接口等对速度要求不高,对不同系统平台兼容性有要求的一般使用解释型语言,如Java、JavaScript、VBScript、Perl、Python等。
打个比方,有一本英文书你想看,但是你又不懂英语,于是乎请来一位资深翻译。这位资深翻译可以从头到底给你一口气全部翻译完,然后把中文版的书交给你阅读,这种就是编译型的方式来处理。而这位资深翻译可以翻译一个章节后,你可以阅读翻译完的这个章节,之后这位资深翻译继续翻译下面的章节,翻译完毕后,你才能再读接下去的章节,但是当你想回看之前的章节,那么必须由这名翻译再次翻译一下这个你想再次看的章节,等待翻译完毕后,你才能再次阅读这个章节,这种就是解释型的方式来处理。

动态类型语言:
动态类型语言是指在运行期间采取做数据类型检查的语言。也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其它的各种脚本语言如VBScript也多少属于动态类型语言。

静态类型语言:
静态类型语言刚好和动态类型语言相反,它的数据类型是在编译期间去检查的,也就是说在写程序时,是需要声明变量的数据类型的,如C/C++就是典型的例子,其它的还有C#、Java等。

强类型定义语言:
是指强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就是永远这个数据类型了。比如说,如果定义了整型变量a,那么程序就不会把a当做字符串类型处理了。强类型定义语言时类型安全的语言。

弱类型定义语言:
数据类型可以被忽略的语言。一个变量可以被赋予不同数据类型的值。

总结:
强类型语言运行速度慢于弱类型语言,但是强类型定义语言更安全,Python是强类型定义语言。另外,一门语言是不是动态语言和是不是强类型定义语言没有任何关系。

由此得出结论,Python是一门解释型的动态强类型定义语言。

那么Python的优缺点有哪些?
优点:
1、优雅、明确、简单,容易入门
2、开发效率很高,有强大的第三方库
3、高级语言,无需考虑内存调用等底层细节
4、可移植性
5、可扩展性,如果希望关键代码不公开,这部分可以用C或C++来写,然后在Python中使用
6、可嵌入性,可以把Python嵌入C/C++程序,向用户提供脚本功能
缺点:
1、速度慢,Python比C和Java都要慢
2、代码不能加密
3、线程不能利用多CPU

Python解释器:
当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码,就需要Python解释器去执行.py文件。
由于整个Python语言从规范到解释器都是开源的。所以理论上,只要水平够高,任何人都可以编写Python解释器来执行Python代码(当然难度很大)。事实上,确实存在多种Python解释器。
CPython:
存在于Python官方网站,C语言开发的,使用最广。Linux默认安装也是这个。
IPython:
基于CPython之上的交互式解释器。IPython只是在交互方式上有所增强,但是执行代码功能和CPython其实一样。好比很多浏览器外观不同,其实质都是内核调用IE。
PyPy:
执行速度快一些,采用JIT技术,对Python代码动态编译(注意不是解释),所以可以显著提高Python代码执行速度。绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有些不同,这就导致相同Python代码在两种解释器下输出结果有些不同。
Jython:
运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码的执行。
IronPython:
运行在微软.net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。

Twisted目前还不支持Python@v3,该模块正在改。

用PyCharm来开发Python代码,效果很好,开发效率高。

Python的第一个程序Hello World:
print("Hello World!")
输出:
Hello World
若是在Linux下执行:
vim hello_world.py
#!/usr/bin/env python -> 最好的写法
print("Hello World!")
chmod +x hello_world.py
./hello_world.py

关于变量:
变量是用来存数据的,为了后面的调用。
name = "Alex Hou"
注意,=两边有空格。

示例:
name = "Alex Hou"
print("My name is ",name)
输出:
My name is Alex Hou

示例:
name = "Alex Hou"
name2 = name
name = "new string"
print(name,name2)
输出:
new string Alex Hou
说明:
上述示例的原理是这样的,name这个变量首先被赋值"Alex Hou",接着name2这个变量也被赋值"Alex Hou",这些赋值的行为是在内存中开辟新的空间,然后变量通过指针指向这些内存地址,因此也就表示该变量中存着这些值,之后name变量又被赋予新的值"new string",此时name变量的指针指向新的内存地址,原来的指针失效了,因此name变量此时有了新的值,而name2是不受影响的。

变量定义的规则:
1、变量名只能是字母、数字或者下划线的任意组合
2、变量名的第一个字符不能是数字
3、以下关键字不能声明为变量名
['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']
4、变量取名要有意义,容易读懂
5、不写拼音和中文
6、巧用下划线,gf_of_alex
7、巧用驼峰写法,GFOfAlex
8、在Python中表示常量,一般写全大写,如PIE = 3.14

关于字符编码:
Python解释器在加载.py文件中的代码时,会对内容进行编码(默认Ascii)
Ascii(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其它西欧语言,其最多只能用8位来表示(1个字节),所以Ascii码最多只能表示255个符号。

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制码,规定所有的字符和符号最少由16位来表示(2个字节),2**16=65536
UTF-8,是对Unicode编码的压缩和优化,它不再使用最少使用2个字节,而是将所有的字符和符号进行分类:Ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存、东亚的字符用3个字节保存。

注释:
单行注释:# 被注释内容
多行注释:''' 被注释内容 ''',或者""" 被注释内容 """
在Python中,单引号和双引号基本上是一样的,除了以下的情况:
msg = "I'm Alex."

关于在Python3.x中的用户输入:
使用input函数:
name = input("what is your name?")
print("Hello " + name)
输入密码时,如果想要不可见,需要利用getpass模块中的getpass方法,即:
import getpass
pwd = getpass.getpass("请输入密码: ")
print(pwd)
注意,getpass模块在PyCharm中不好用,只能在cmd中使用。

打印一个变量的数据类型:
print(type(age))
查看变量age的数据类型。

Python中的占位符,顾名思义就是插在输出里站位的符号。我们可以把它理解成我们预定饭店。当我们告诉饭店的时候,饭店的系统里会有我们的预定位置。虽然我们现在没有去但是后来的顾客就排在我们后面。
常用的占位符有三个:
1、%s,字符型占位符。在Python中,input()函数用户输入默认是字符型的,因此默认%s占位符,其余占位符不可用,如果需要使用,需要强制转换,如:
age = int(input("age:"))
由于使用了int()函数,此时的age变量类型是整数型,原来默认是字符型。
如果想转字符型,可以使用str()函数。
raw_input()是在Python 2.x中使用的,和Python 3.x中的input()是一样的。
在Python 2.x中也有input()函数,它接收到什么数据类型,就是什么数据类型,用起来有些复杂,不建议使用。
2、%d,整数型占位符。
3、%f,浮点数型占位符。

Python中的format函数,也可以起到格式化的作用:
format函数常与print()函数结合使用,具备很强的格式化输出能力。
通过变量,逗号隔开:
print('{我}今天{action}'.format(我='拦路雨',action ='在写博客'))
通过位置:
print('{1}今天{0}'.format('拦路雨','写博客'))

关于Python中的if函数:
举例:
_username = "alex"
_password = "abc123"
username = input("username:")
password = getpass.getpass("password")
if _username == username and _password == password:
print("Welcome user {name} login...".format(name=username))
else:
print("Invalid username or password!")
注意,自动缩进。
缩进的目的可以省去结束符,并且结构优雅,缩进还表示逻辑和级别结构。
顶级代码必须顶格写。

==,表示等于。
=,表示赋值。

举例:
age_of_oldboy = 56
guess_age = int(input("guess age:"))
if guess_age == age_of_oldboy:
print("Yes, you got it.")
elif guess_age >age_of_oldboy:
print("think smaller...")
else:
print("thnik bigger!")

关于Python中的循环,使用while语句:
count = 0
while True: -> 无限循环
print("count:",count)
count = count + 1 # count +=1

举例:
age_of_oldboy = 56
guess_age = int(input("guess age:"))
count = 0
while count < 3:
if guess_age == age_of_oldboy:
print("Yes, you got it.")
break
elif guess_age >age_of_oldboy:
print("think smaller...")
else:
print("thnik bigger!")
count +=1
else:
print("You have tried too many times.")

关于Python中的循环,使用for语句:
for i in range(10):
print("loop ",i)
注意,这里是0到9的打印。

举例:
age_of_oldboy = 56
guess_age = int(input("guess age:"))
for i in range(3):
if guess_age == age_of_oldboy:
print("Yes, you got it.")
break
elif guess_age >age_of_oldboy:
print("think smaller...")
else:
print("thnik bigger!")
count +=1
else:
print("You have tried too many times.")

举例:
for i in range(0,10,2)
这里指,从0打印到10,间隔为2,打印0,2,4,6,8

举例:
age_of_oldboy = 56
guess_age = int(input("guess age:"))
for i in range(3):
if guess_age == age_of_oldboy:
print("Yes, you got it.")
break
elif guess_age >age_of_oldboy:
print("think smaller...")
else:
print("thnik bigger!")
count +=1
if count == 3:
countine_confirm = input("do you want to keep guessing?")
if continue_confirm != 'n':
count = 0

break是跳出循环,并且结束整个循环不再继续。
continue是跳出本次循环,进行下一次循环。