编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;
而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.
这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式)
编译型vs解释型
编译型
优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。
缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。
解释型
优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
python是一门动态解释性的强类型定义语言。
五、Python的优缺点
先看优点:
1、Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。
2、开发效率非常高,Python有非常强大的第三方库,基本上你想通过计算机实现任何功能,Python官方库里都有相应的模块进行支持,直接下载调用后,在基础库的基础上再进行开发,大大降低开发周期,避免重复造轮子。
3、高级语言——当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节。
4、可移植性——由于它的开源本质,Python以及被移植到许多平台上(经过改动使它能够工作在不同平台上)。如果你小心的避免使用依赖于系统的特性,那么你的Python程序无需修改就几乎可以在市场上所有的系统平台上运行。
5、可扩展性——如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。
6、可嵌入性——你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚步功能。
再看缺点:
1、速度慢,Python的运行速度相比C语言确实慢很多,跟Java相比也要慢一些,因此这是很多所谓的大牛不屑于使用Python的主要原因,但其实这里所指的运行速度慢在大多数情况下用户是无法直接感知到的,必须借助测试工具才能体现出来!
2、代码不能加密,因为Python是解释性语言,它的源码都是以明文形式存放的,不过我不认为这算是一个缺点,如果你的项目源代码必须是加密的,那你一开始就不应该用Python来去实现。
3、线程不能利用多CPU问题,这是Python被人诟病最多的一个缺点,GIL即全局解释器锁(Global Interpreter Lock),是计算机程序设计语言解释器用于同步线程的工具,使得任何时刻仅有一个线程在执行,Python的线程是操作系统的原生线程。在Linux上为pthread,在windows上为Win thread,完全由操作系统调度线程的执行。一个Python解释器进程内有一条主线路,以及多条用户程序的执行线程。即使在多核CPU平台上,由于GIL的存在,所以禁止线程的并行执行。关于这个问题的折衷解决方法,我们在以后线程和进程章节里再进行详细探讨。
六、Python解释器
当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码,就需要Python解释器去执行.py文件。
由于整个Python语言从规范到解释器都是开源的,所以理论上,只要水平够高,任何人都可以编写Python解释器来执行Python代码(当然难度很大)。事实上,确实存在多种Python解释器。
CPython
官方下载并安装号Python2.7后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。
CPython是使用最广范的Python解释器。我们默认所有代码也都在CPython下执行。
IPython是基于CPython的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。好比很多国产浏览器虽然外观不同,但内核其实都是调用了IE。
CPython用>>>作为提示符,而IPython用In [序号]:作为提示符。
PyPy据说是Python的未来,开发者也说想让你的Python代码块用此解释器。
PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。
绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点。
Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
小结:Python的解释器很多,但使用最广泛的还是CPython。如果要和Java或.Net平台交互,最好 办法不是用Jython或IronPython,而是通过网络调用来交互,确保各程序之间的独立性。
七、用Python2还是Python3
官方的建议是尽快升级到Python3,而且Python3有很多新功能,新特性,所以除非有一些业务是用Python2编写的,一般建议用Python3。
Python3.0还有一个比较大的功能没有完成,那就是Twisted ,这是一个非常庞大的系统工程,预计最近应该快完成了吧,敬请期待吧!
八、Python安装
windows
1、下载安装包
https://www.python.org/downloads/
2、安装
最新版win7及以后系统,默认安装路径:C:\Users\Administrator\AppData\Local\Programs\Python\Python36\
3、配置环境变量
【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【Python安装目录追加到变值值中,用 ; 分割】
如:原来的值;C:\Users\Administrator\AppData\Local\Programs\Python\Python36\,切记前面有分号
linux、Mac
无需安装,原装Python环境,只要更新一下版本就可以了!
九、变量/字符编码
变量是什么?
简单的说,变量就是一个标签用来说明内存上的空间地址的。声明变量的过程就是向内存申请一块空间用来存放数据的过程。
声明变量
#_*_coding:utf-8_*_
name = "Alex Li"
上述代码声明了一个变量,变量名为: name,变量name的值为:"Alex Li"
变量定义的规则:
①变量名只能是 字母、数字或下划线的任意组合
②变量名的第一个字符不能是数字
③以下关键字不能声明为变量名
['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']
变量的赋值
name = "Alex Li"
name2 = name
print(name,name2)
name = "Jack"
print("What is the value of name2 now?")
变量名尽量有意义,让人能一眼就知道这个变量表示什么意思。
如果要表示一个关系型的变量名,一般的写法是:
gf_of_oldboy = "Chen da hua"
GFOfOldboy = "Chen da hua"
Python里面没有定义常量这么个概念,但是习惯上是用大写字符串表示常量例如:
PIE = 3.1415926
保留字段不能使用,尽量不要使用中文名和拼音做变量名,这样会显得很low。
字符编码的区别与介绍
在Python2.X版本里面,不能直接使用中文,要使用必须事先声明:
# -*- coding:utf-8 -*-
name = "你好,世界"
print(name)
Python代码添加注释的方法:
1、直接在以#开头即表示注释。
2、多行注释,在要注释的代码前后行使用三个【'''】或者【"""】把要注释的内容放进去就可以了。
另外,【'''】或者【"""】包括的内容可以作为一个整体赋值个一个变量来处理。
例子:
msg = '''
gf_of_oldboy = "wang da hua"
GFOfOldboy = "Chen rong feng"
'''
#print(gf_of_oldboy,GFOfOldboy)
print(msg)
执行结果:
gf_of_oldboy = "wang da hua"
GFOfOldboy = "Chen rong feng"
另外需要说明的是,单引号和双引号的作用和shell中类似,单引号表示强引用,双引号表示弱引用。
用户交互程序
格式化输出指定内容:
方法一:++表示法
name = input("Name:")
age = input("Age:")
job = input("Job:")
salary = input("Salry:")
info = '''
------------------------- info of ''' + name +'''---------------------------------------
Name:''' + name + '''
Age:''' + age + '''
Job:''' + job + '''
Salary:''' + salary + '''
------------------------ info of ''' + name + '''---------------------------------------
'''
print(info)
方法二:占位符表示法
name = input("Name:")
#age = input("Age:")
age = int(input("Age:"))
print(type(age),type(str(age))) #这里会打印age的数据类型,然后转换成字符串后又打印出数据类型,为了验证上面的转换是否生效
job = input("Job:")
salary = input("Salry:")
info2 = """
------------------------------ info of %s ---------------------------------------------
Name:%s
Age:%s #这里可以使用%d指定只能输入整数,而非默认字符串,不过要在输入时强制转换数据类型,否则会报错。
Age:%d
Job:%s
Salary:%s
----------------------------- info end %s ---------------------------------------------
""" %(name,name,age,job,salary,name)
print(info2)
方法三:{}表示法
name = input("Name:")
age = input("Age:")
job = input("Job:")
salary = input("Salry:")
info3 = """
------------------------------ info of {_name} ---------------------------------------------
Name:{_name}
Age:{_age}
Job:{_job}
Salary:{_salary}
----------------------------- info end {_name} ---------------------------------------------
""" .format(_name=name,
_age=age,
_job=job,
_salary=salary)
print(info3)
方法四:是方法三的引申,用数字代表具体变量
info4 = """
------------------------------ info of {0} ---------------------------------------------
Name:{0}
Age:{1}
Job:{2}
Salary:{3}
----------------------------- info end {0} ---------------------------------------------
""" .format(name,age,job,salary)
print(info4)
注意:
除非迫不得已,否则尽量不要用,因为太耗内存,其他方法则好的多。
法一可以和法二、法三、法四混用,但是法二、法三、法四不能混用。
十、模块初识
Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相应的Python库支持,以后的课程中会深入讲解常用到的各种库,现在,我们先来象征性的学2个简单的。
sys模块
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
print(sys.argv)
#输出
$ python test.py helo world
['test.py', 'helo', 'world'] #把执行脚本时传递的参数获取到了
os模块
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
os.system("df -h") #调用系统命令
完全结合一下
import os,sys
os.system(''.join(sys.argv[1:])) #把用户的输入的参数当作一条命令交给os.system来执行
十一、选择表达式if ... else
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Bill Xie
import getpass
_username = "xiaoxie"
_password = "123456"
username = input("username:")
password = input("password:")
#password = getpass.getpass("password:")
if _username == username and _password == password:
print("Welcome user %s login."%(username))
else:
print("Invalid username or password!")
注意事项:
1、Python代码是严格要求语法缩写的,如果不注意就会报错,缩进错误
IndentationError: expected an indented block
学习 Python 与其他语言最大的区别就是,Python 的代码块不使用大括号 {} 来控制类,函数以及其他逻辑判断。python 最具特色的就是用缩进来写模块。缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个必须严格执行。
IndentationError: unexpected indent 错误是 python 编译器是在告诉你"Hi,老兄,你的文件里格式不对了,可能是tab和空格没对齐的问题",所有 python 对格式要求非常严格。
如果是 IndentationError: unindent does not match any outer indentation level错误表明,你使用的缩进方式不一致,有的是 tab 键缩进,有的是空格缩进,改为一致即可。
因此,在 Python 的代码块中必须使用相同数目的行首缩进空格数。
建议你在每个缩进层次使用 单个制表符 或 两个空格 或 四个空格 , 切记不能混用
2、这里的打印输出命令内使用了变量引用,这里说说两种变量引用的方式。
① 和上面注释那里提到的方式类似,先使用%s占位符,然后再指明占位符要使用的变量。
print("Welcome user %s login."%(username))
②使用花括号{}引用
print("Welcome user {_username} login." .format(_username=username))
print("Welcome user {0} login." .format(username)) #与上面类似,只不过是用数字代替第几个要替换的变量。
十二、循环体
猜数游戏:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:Bill Xie
age_of_oldboy = 29
guess_age = int(input("Guess oldboy's age:"))
if guess_age == age_of_oldboy:
print("You got it.")
elif guess_age > age_of_oldboy:
print("Think smaller...")
else:
print("Think bigger...")
引出循环的说明:
while循环语法:
while 条件:
循环体
esle:#可以没有这个
循环体
for循环语法:
for i in range(开始数,结束数,步长):
循环体
else#可以没有
循环体
未完,待更新。。。。