学习来自马哥教育的视频,感谢马哥
编程语言:
用户:
问题空间
计算机:解决问题
解空间
抽象:
机器代码-->微码编程-->高级语言
(语言的高下级的是根据语言是否被人类容易理解或者更接近于人类的理解范围)
python:可当三种工具使用
shell编程:
编程语言:用于实现粘结
框架:web、Django
缺陷:
字节码:bytecode
python的执行流程
python的源程序都表现为.py的文件,源代码文件由编译器(Complier解释器)在第一次被执行时编译为格式为.pyc的字节码, 字节码在解释器(interpreter解释器)中运行,这是interpreter被成为PVM(python的虚拟机)。
当编译(complier)结束时,由PVM读取bytecode,而后在处理器(prosseor)上予以执行。
Python的实现:三种
1、CPython
原始、标准的实现方式
2、Jython
用于与Java语言集成的实现
3、IronPython
用于与.NET框架集成的实现
Python性能优化工具
1、Psyco
Python语言的一个扩展模块,可以即时对程序代码进行专业的算法优化,可以在一定程度上提高程序的执行速度,尤其是在程序中有大量循环操作时
目前开发工作已经停止,由PyPy所接替
2、PyPy
PyPy是用于python实现的python解释器
python语言的动态编译器,是Psyco的后继项目
可以运行在Linux的32位和64位、MacOSX和Windows的32位平台中
3、Shed Skin
python编译器,能够将python代码装换成优化的C++代码
编写、执行python代码
1、交互式解释器
直接启动python,其显示信息取决于程序版本及操作系统等
2、python程序文件
(1) 交互式模式下的程序执行完成后难以再次运行
(2) 将编写的程序保存指文件(.py)中方便多次运行
python的此类包含了一系列预编写好的语句的程序文件称作 ”模块“
能够直接运行的模块文件通常称作脚本(即程序的顶层文件)
python分为程序入口文件和模块文件(即函数文件),模块文件自己无法运行,要利用程序入口文件调用之后才能运行,模块文件可以编写一段代码自己检查是否有语法错误。
python程序文件
1、python源程序文件通常以.py为扩展名
(1)例如,新建一个名为firstpycode.py的文件,内容如下所示
#!/usr/bin/python
import platform
print platform.uname()
uname可以理解为platform模块提供的函数
(2)第一行为shebang,即执行脚本时通知内容要启动的解释器
(3)第二行通过import导入一个python模块platform
(4)第三行打印platform模块的uname方法的执行结果
2、给予此脚本以执行权限,并执行即可
shebang魔术:任何程序要想启动执行,通常表现为一个进程,这个进行要想启动,必须向内核注册,由内核给它生成一个进程描述机构,才能运行起来。所以内核必须要理解这是一个可执行程序,按照可执行程序内部的各种执行结构,了解它的执行入口,内核把执行入口放到CPU上,内核退出,程序执行。
#!/usr/bin/python:文本文件不是机器代码,就没办法执行,第一行(#!/usr/bin/python)就是生成一段特殊结构,内核通过读取这一行中的代码,就会知道这个文件不能拿到CPU上直接执行,而是先调用python程序,由python程序把print platform,username()这一段代码当作参数来执行。而python自己是能够在内核上执行的二进制应用程序,所以此处当python二进制应用程序执行起来以后,就由python把代码加载进来进行执行。
python程序文件
1、python程序可以分解成模块、语句、表达式和对象
(1)程序由模块构成
(2)模块包含语句
(3)语句包含表达式
(4)表达式建立并处理对象
表达式是”某事“,而语句是“做某事(即指令)”;
例:“3+4”是某事,而"print 3+4"则是做某事;
语句的特性:它们改变了事物,例如:赋值语句改变了变量,print语句改变了屏幕输出等;
python一切皆对象
Python IDE
1、IDLE
标准python环境提供
2、Eclipse和PyDev
3、Python Win
4、Komodo
5、Wingware
6、PyCharm
交互式解释器
python程序文件.py
面向过程
以指令为中心,由指令处理数据
如何组织代码解码问题
面向对象
以数据为中心,所有的处理代码都围绕数据展开
如何设计数据结构组织数据,并提供对此类数据所允许处理操作
使用高版本python简单方法:
1、编译安装新版本至某特定路径
2、pyenv
编译安装python
1、准备开发环境
Python-2.7.6.tar
ipython-1.2.1.tar
需要使用readline-devel
# yum install readline-devel -y
# tar xf Python-2.7.6.tar.xz
# ./configure --prefix=/usr/local/python27
#make && make install
2、测试
# /usr/local/python27/bin/python2.7
3、安装ipython
# tar xf ipython-1.2.1.tar.gz
# cd ipython-1.2.1
# /usr/local/python27/bin/python2.7 setup.py build //编译
# /usr/local/python27/bin/python2.7 setup.py install //安装
# ls /usr/local/python27/bin/ //安装目录
链接python2.7和ipython
# ln -sv /usr/local/python27/bin/python2.7 /usr/local/bin/python27 //为了调用方便,为安装程序创建软连接
# ln -sv /usr/local/python27/bin/ipython /usr/local/bin/ //同上
快速入门
数据结构
1、通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他的数据结构;
2、python的最基本数据结构是序列;
3、序列中的每个元素被分配一个序号-----即元素的位置,也称为索引:索引从0开始编号;
4、Python包含六种内建的数据序列:列表、元素、字符串、Unicode字符串、buffer对象和xrange对象。
Python的关键要素
1、基本数据类型
2、对象引用
3、组合数据类型
4、逻辑操作符
5、控制流语句
6、算术操作符
7、输入/输出
8、函数的创建与调用
要素1:基本数据类型
1、任何程序语言都必须能够表示基本数据项
2、python中的基本数据类型有:
Integral类型
整型:不可变类型
-257,201939249239239
布尔型(布尔型不能加引号;但是字符串必须加引号,单双引号不加区别)
true,false
浮点类型
浮点数
3.1415
复数
3+6j
十进制数字
字符串
‘GNU is not Unix’,“hello”,“world”
变量分为可变类型和不可变类型,其中整型就是不可变类型,
布尔型不能加引号
python中所有的字符串全都需要引号引起来,单双引号不加区别,但必须有引号,数值无需引号
不可变类型:变量num定义为对象2时,对象是不可以被修改的 (注意2在python中被保存为对象),变量可以被修改
注意:num是变量,而2或者3是对象
定义了变量num所引用的对象(2或3)在内存中的地址,即变量num的对象是2时,内存地址是18512976,是3时,地址就为18512952,id不一样就表示对象在内存中不是同一个位置,即对象不一样。
所以2没有动,3也没有动,只是变量所指向的内存空间发生改变了
字符串不加区别的用单双引号引起来,字符串在python中本身是一种序列,是把多个字符按照特定次序组织起来的一种数据结构,所以称为序列,所有序列可以通过索引、下标进行引用。
字符串是不可变类型
这里jerry就是一个序列
字符串是一个组合,可以只引用一个变量,是不可变类型
要素2:对象引用(变量)
python将所有数据存为内存对象;
python中,变量事实上是指向内存对象的引用;
动态类型:在任何时刻,只要需要,某个对象引用都可以重新引用一个不同的对象(可以是不同的数据类型);
内建函数type()用于返回给定数据项的数据类型;
“=” 用于将变量名与内存中的某对象绑定:如果对象事先存在,就直接进行绑定;否则,则由 “=” 创建引用的对象。
变量和对象是分开存放的
在内存空间中存储一个jerry字符串,jerry在内存要有地址,需要指定起始地址,
变量名称自身name也在内存中,让 name = jerry可以理解为声明了两个对象,name是一个指针指向了jerry的起始地址,
从而把Jerry这个内存对象中的值赋值给name了。
如果要把name改为等于tom,jerry是不可变的,所以一旦name=tom,那么就会在内存中再找一个空间存tom,
而后将name的指向结果指向tom的起始位置。jerry这个对象依然还在内存中。
各种内存对象在不被引用时有垃圾回收器回收,在内存对象计数为0时,就会被垃圾回收器回收
对象事先存在,直接绑定
要素2:对象引用(变量)
1、变量命令规则
只能包含字母、数字和下划线,且不能以数字开头
区分字母大小写
禁止使用保留字
python2与python3的保留字有所不同
2、命令惯例
以单一下划线开头变量名(__x)不会被from module import *语句导入;
前后有下划线的变量名(__x__)是系统定义的变量名,对python解释器有特殊意义;
以两个下划线开头但结尾没有下划线的变量名(__x)是类的本地变量;
交互式模式下。变量名“_”用于保存最后表达式的结果
注意:变量名没有类型,对象才有
保留字是系统中的关键字,变量名“_”用于保存最后表达式的结果
变量名没有类型,对象才有
变量可以引用任何对象,比如刚才引用的是对象3,下一次可以引用对象jerry,在python中变量名只是内存引用的标识。
要素3:组合数据类型
1、数据结构:通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合
2、python常用的组合数据类型
序列类型
列表:使用[]创建。如["call","me","Ishmael","."]
元组:使用()创建,如('one','two')
字符串也属于序列类型
集合类型
集合
映射类型
字典
列表:是可变对象,支持原处修改,可以对数据本身进行修改
元组:不可变对象
列表和元组的区别在于:
列表是可改变的,可以直接把列表中的字符改为别的,比如“pig”改为“tree”,但是l1的内存对象位置不会发生改变(但pig这个元素的引用位置已经发生改变,即指针的起始位置改到tree的起始位置了)。
sheep改为dog,dog改为tom是在原处修改,在内存中直接改掉。原处修改后,sheep、dog、tom本身各自是字符串,并没有被改掉,而是l1[3]这个引用被改掉了,元素引用位置被改变了
字符串可以做切片,切片本身又创建新的对象,原片不发生任何改变
2表示步进长度
使用 type() 获取函数的类型
使用 id() 获取内存的位置
使用 dir() 获取模块的子命令
使用 len() 获取元素内部的个数
使用 help() 获取函数详细信息
要素3:组合数据类型
1、列表是可变序列,元组是不可变序列;
2、python中,组合数据类型也是对象,因此其可以嵌套;
['hello','world',[1,2,3]]
3、实质上,列表和元组并不真正存储数据,而是存放对象引用;
4、python对象可以具有其可以被调用的特定“方法(函数)”;
5、元组、序列以及字符串等数据是“有大小的”,也即,其长度可使用内置函数len()测量;
列表和元素并不真正存储数据,而是存放对象引用?
B为列表,列表要用[]括起来,使用[]定义一个列表时,列表内部就会有好几个元素;但B引用A这个列表中的元素时,B存的不是元素自身,而是元素引用,所以写“this”并不是在列表B中存了this这个字符串,而是在内存中找了个地方存了this,然后,把this存储的位置放到了列表(B)中,所以每一次元素改变,但字符串自身不可变,但前面把sheep改为dog,之所以可以改变是因为把引用(B中)改变了,即引用了新的内存对象,引用改变了,看上去也就改变了,但是B在内存中也是对象,也有一个一个起始位置,但B的起始位置并没有发生变化,所以说列表是可变对象。如果B中存了this,其实并不是this(B中),而是存的是指向this的指针(指向A,即内存中存的this对象的起始位置),所以B中存的是引用。
要素4:逻辑操作符
1、逻辑运算是任何程序设计语言的基本功能;
2、python提供了4组逻辑运算
身份操作符
is:判定左端对象引用是否相同于右端对象引用;也可以与None进行;
比较操作符
<,>,<=,>=,==
成员操作符
in或not in:测试成员关系
逻辑操作符
and,or,not
name和test引用了同一个对象
对象引用可以不同,但是对象所属类型有可能相同。
要素5:控制流语句
1、控制流语句是过程式编程语言的基本控制机制
2、python的常见控制流语句
要素6:算术操作符
1、python提供了完整的算术操作集;
2、很多的python数据类型也可以使用增强的赋值操作符,如+=、-=等;
3、同样的功能,使用增强型赋值操作符的性能较好;
4、python的 int 类型是不可变的,因此增强型赋值的实际过程是创建了一个新的对象来存储结果后将变量名执行了重新绑定;
要素7:输入输出
1、现实中,具有实际功能的程序必须能够读取输入(如从键盘或文件中),以及产生输出,并写到终端或文件中;
2、python的输入/输出
输出
python3:print()函数
python2:print语句
输入
input()
raw_input()
raw_input() //交互式时不知道有什么区别或不加区别时使用
交互式,通过键盘输入的方式创建一个内存对象,只不过创建之后,直接输出了,以后再也无法引用了,因此应该引用一个变量,将创建的结果保存下来,方便多次引用。
如:定义一个变量 a
要素7:输入/输出
1、python解释器提供了3种标准文件对象,分别为标准输入、标准输出和标准错误,它们在sys模块中分别以sys.stdin、sys.stdout和sys.stderr形式提供;
2、python的print语句实现打印--一个对程序员友好的标准输出流接口;
3、从技术角度来讲,print是把一个或多个对象转换为其文本表达形式,然后发送给标准输出或另一个类似文件的流;
(1) 在python中,打印与文件和流的概念联系紧密;
文件写入方法是把字符串写入到任意文件;
print默认把对象打印到stdout流,并添加了一些自动的格式化。
(2) 实质上,print语句只是python的人性化特性的具体实现,它提供了sys,stdout,write()的简单接口,再加上一些默认的格式设置;
(3) print接受一个逗号分隔的对象列表,并为行尾自动添加一个换行符,如果不需要,则在最后一个元素后添加逗号。