初识Python
第1章 初识Python
1.1什么是编程?
编程的目的就是:让机器按照人们事先为其编写好的程序自发地去工作。
1.2编程语言分为哪些种类?
1.2.1机器语言
机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合,俗称“01编程”。
优点:灵活、直接执行和速度快。
缺点:不同型号的计算机其机器语言是不相通的,按着一种计算机的机器指令编制的程序,不能在另一种计算机上执行。
1.2.2汇编语言
汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的,标识符更容易识别和记忆。它同样需要编程者将每一步具体的操作用命令的形式写出来。
优点:能完成一般高级语言所不能实现的操作,而且源程序经汇编生成的可执行文件较小,且执行速度很快。
缺点:源程序比较冗长、复杂、容易出错,而且使用汇编语言需要有更多的计算机专业知识。
1.2.3高级语言
明确地讲,高级语言就是说人话,用人类能读懂的(比如英文)字符编程。高级语言是绝大多数编程者的选择。和汇编语言相比,它不但将许多相关的机器指令合成为单条指令并且去掉了与具体操作有关但与完成工作无关的细节,例如使用堆栈、寄存器等。
优点:大大简化了程序中的指令。同时,由于省略了很多细节,编程者也就不需要有太多的专业知识。
缺点:高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行。
1.2.3.1 解释型语言
执行方式类似于我们日常生活中的“同声翻译”,应用程序源代码一边由相应语言的解释器“翻译”成目标代码(如python程序,先翻译/编译成字节码,然后由解释器解释执行,这个过程程序员都无需关心了,享受这种便利即可),一边执行。
缺点:效率比较低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器。只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的。
1.2.3.2 编译类语言
编译是指在程序执行之前,就将程序源代码“翻译”成机器指令,并保存成二进制文件。
优点:编译后的代码可以直接在机器上运行,运行速度比解释型要高。
缺点:调试程序麻烦,程序一旦需要修改,必须先修改源代码,再重新编译后才能执行。
1.2.4总结
机器语言:优点是最底层,速度最快,缺点是最复杂,开发效率最低
汇编语言:优点是比较底层,速度最快,缺点是复杂,开发效率最低
高级语言:
编译型语言执行速度快,不依赖语言环境运行,跨平台差
解释型跨平台好,一份代码,到处使用,缺点是执行速度慢,依赖解释器运行
第2章 Python介绍
Python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,Guido开始写Python语言的编译器。Python这个名字,来自Guido所挚爱的电视剧Monty Python’s Flying Circus。他希望这个新的叫做Python的语言,能符合他的理想:创造一种C和shell之间,功能全面,易学易用,可拓展的语言。
Python是一种面向对象、解释型计算机程序设计语言。语法简洁清晰,强制用空白符作为语句缩进。Python具有丰富和强大的库,又被称为胶水语言。能把其他语言(主要C/C++)写的模块很轻松的结合在一起。
2.1Python的应用领域
- Web网站:有很多优秀的开源Web框架,比如Django(最流行)、Tornado(轻量级、异步)、Flask(微型)、Web.py(简单)等。
- 网络编程:支持高并发的Twisted网络框架, py3引入的asyncio使异步编程变的非常简单。
- 云计算:目前最火最知名的云计算框架就是OpenStack,Python现在的火,很大一部分就是因为云计算。
- 数据采集(爬虫):有好用的http库,比如urllib2、requests等。还有高级的屏幕爬取及网页采集框架scrapy。并对网页解析也有很多库,比如lxml、xpath、BeautifulSoup等。
- 大数据分析:常用模块有Numpy、Pandas。并支持写MapReduce、PySpark处理Spark RDD(弹性分布式数据集)。
- 运维自动化:编写脚本、Web平台,自动化日常工作。
- 科学计算:在科学计算也应用越来越广泛,常用的模块有Numpy、SciPy。
2.2为什么要学习Python?
Python是一种效率极高的的语言,相比于其他语言,使用Python编写时,程序包含的代码更少。Python的语法也有助于创建整洁的代码,使用Python写出来的代码更容易阅读、调试和扩展。
学习Python主要目的是用于实现运维的自动化,我学习Python从以下四方面考虑:
- 语法简洁,易于学习。
- 广泛的标准库,适合快速开发,不就追求极快处理速度。
- 跨平台,基本所有的所有的操作系统都能运行。
- 运维领域Python最流行。
2.3Python解释器的版本
1)CPython
当我们装完Python后,其默认解释就是CPython,也是官方默认解释器。CPython是C语言写的,当执行代码时会将代码转化成字节码(ByteCode)。
2)IPython
基于CPython之上的一个交互式解释器,相当于默认解释器的一个增强版,最显著的功能就是自动补全,挺好用的。
3)PyPy
PyPy本身是由Python编写的,使用了JIT编译器(即时编译器)技术,当执行代码时JIT编译器将代码翻译成机器码。性能相比CPython要好。JAVA也采用了JIT编译器。
4)Jython
Jython是由JAVA编写的一个解释器,可以把JAVA模块加载到Python的模块中使用,也可以把Python代码打包成JAR包,意味着允许用Python写JAVA程序了。当执行代码时会将代码转化成JAVA字节码,然后使用JRE(Java Runtime Environment)执行。
5)IronPython
在.NET平台上工作的Python语言。
2.4Python代码执行过程
源代码编译成字节码(.pyc文件)--> Python虚拟机 --> 执行编译好的字节码 --> Python虚拟机将字节码翻译成对应的机器指令(机器码)
运行Python程序时,先编译成字节码并保存到内存中,当程序运行结束后,Python解释器将内存中字节码对象写到.pyc文件中。
第二次再运行此程序时,先回从硬盘中寻找.pyc文件,如果找到,则直接载入,否则就重复上面的过程。
这样的好处是,不重复编译,提供执行效率。
2.5Python代码规范
1)缩进
Python以空白符作为语句缩进,意味着语句没有结尾符,刚入门的朋友往往因为上下逻辑代码不对齐导致运行报错,在Python中最好以4个空格作为缩进符,严格对齐。
2)代码注释
据说优质的代码,注释说明要比代码量多,详细的代码说明不管是对自己还是对他人,在后期维护中都是非常有利的。就像一个流行的开源软件,如果没有丰富的使用文档,你认为会有多少人耐心的去花大把的时间研究它呢?
3)空格使用
在操作符两边,以及逗号后面,加1个空格。但是在括号左右不加空格。
在函数、类、以及某些功能代码块,空出一行,来分隔它们。
4)命名
- 模块:自己写的模块,文件名全部小写,长名字单词以下划线分隔。
- 类:大/小驼峰命名。我一般采用大驼峰命名,也就是每个单词首字母大写。类中私有属性、私有方法,以双下划线作为前缀。
- 函数:首单词小写,其余首字母大写。
- 变量:都小写,单词以下划线分隔。
需要注意的是:所有的命名规则必须能简要说明此代码意义。
5)代码换行
按照语法规则去换行,比如一个很长的表达式,可以在其中某个小表达式两边进行换行,而不是将小表达式拆分,这样更容易阅读。
2.5.1注释
单行注释:# 被注释内容
多行注释:""" 被注释内容 """
2.6变量
>>> age_of_wangzhiwei = 18 #定义变量 >>> age_of_wangzhiwei #引用变量 18
2.6.1变量命名规范
在Python中使用变量,需要遵守一些规则,以下是有关变量的规则:
- 变量名只能包含字母、数字和下划线。变量名可以是字母或下划线开头,但不能以数字开头。
- 变量名不能包含空格,但可以使用下划线来分割其中的单词。
- 不要将Python关键字和函数用作变量名。
- 变量名应既简短又具有描述性。
- 慎用小写字母i和大写字母O,因为这两个字母会被看错为数字的1和0。
2.6.2变量的特征
定义一个变量有三个特征:
1)内存空间位置,id:id(变量名)
2)变量类型,type:type(变量名)
3)变量的值,value:变量名
>>> x = 18 >>> id(x) 1516460032 >>> type(x) <class ‘int‘> >>> x 18
注意:Python中的变量名没有存储值的功能,变量名与变量值只是一种绑定关系。
第3章 程序交互
代码:
username = input(‘please input your name: ‘) userpasswd = input(‘please input username password:‘) print(username) print(userpasswd)
执行效果:
please input your name: wangzhiwei please input username password: 123 wangzhiwei 123
第4章 数据类型
4.1整型
整型数字,可以用来表示:年龄、身份证号、电话、QQ号码等。
4.2字符串
只要是在引号里面包含的都是字符串类型,可以用表示:姓名、性别等。
4.3浮点型
4.4列表
列表可以存放多个值,每个值可以是任意数据类型,要取列表内的元素,需要通过下标,下标从0开始。
例子:
>>> hobbies =[1,‘chouyan‘,‘hejiu‘,‘tangtou‘] >>> hobbies[0] 1 >>> hobbies[1] ‘chouyan‘ >>> hobbies[2] ‘hejiu‘ >>> hobbies[3] ‘tangtou‘ >>> hobbies =[1,‘chouyan‘,‘hejiu‘,‘tangtou‘,[5,6]] >>> hobbies[4] [5, 6] >>> hobbies[4][0] 5 >>> hobbies[4][1] 6
注意,列表中嵌套列表,有几个中括号,输出时最多就有几个中括号。
4.5字典
字典数据类型,采用key:value的方式存储值,可以存放多个值。每个value也可以是任意数据类型,但是key必须是不可变数据类型。
>>> dic={‘name‘: ‘wangzhiwei‘, ‘age‘: 18,‘sex‘: ‘man‘} >>> dic {‘name‘: ‘wangzhiwei‘, ‘age‘: 18, ‘sex‘: ‘man‘} >>> dic[‘name‘] ‘wangzhiwei‘
4.5.1可变数据类型(或称为不可hash类型)
id不变,type不变,值改变。
列表属于可变类型。
4.5.2不可变数据类型
数字和字符串都是不可变类型。
4.6布尔类型
布尔类型很简单,就两个值 ,一个True(真),一个False(假), 主要用记逻辑判断。
>>> age = 18 >>> age > 100 False
4.7格式化输出
操作符号 |
说明 |
%s |
字符串(str()) |
%d |
整数 |
%f |
浮点数,可指定小数点后的精度 |
字符串和整型格式化输出例子:
users=[ {‘username‘:‘alex‘,‘age‘:18,‘job‘:‘teacher‘,‘hobbie‘:‘girls‘}, {‘username‘:‘egon‘,‘age‘:16,‘job‘:‘teacher‘,‘hobbie‘:‘study‘} ] msg=‘‘‘ ---------- info of %s -------- Name : %s Age : %d Job : %s Hobbie: %s ---------- end -------- ‘‘‘%(users[1][‘username‘],users[1][‘username‘],users[1][‘age‘],users[1][‘job‘],users[1][‘hobbie‘]) print(msg)
保留小数点格式化输出例子:
>>> print(‘%.3f‘ %(float(100)/1024)) 0.098
第5章 运算符
5.1算数运算
以下假设变量:a=10,b=20
运算符 |
描述 |
实例 |
+ |
加,两个对象相加 |
a + b输出结果是30 |
- |
减,得到附属或是一个数减去另一个数 |
a - b输出结果是-10 |
* |
乘,两个数相乘或是返回一个被重复若干次的字符串 |
a * b输出结果是200 |
/ |
除,x除以y |
b / a输出结果是2 |
% |
取模,返回除法的余数 |
b % a输出结果是0 |
** |
幂,返回x的y次幂 |
a ** b为10的20次方 |
// |
取整除,返回商的证书部分 |
9 // 2输出结果是4,9.0//2.0输出结果是4.0 |
5.2赋值运算
以下假设变量:a=10,b=20
运算符 |
描述 |
实例 |
= |
简单的复制运算符 |
c = a + b将a + b的运算结果赋值为c |
+= |
加法赋值运算符 |
c + = a等效于c = c + a |
-= |
减法赋值运算符 |
c - = a等效于c = c - a |
*= |
乘法赋值运算符 |
c * = a等效于c = c * a |
/= |
除法赋值运算符 |
c / = a等效于c = c / a |
%= |
取模赋值运算符 |
c % = a等效于c = c % a |
**= |
幂赋值运算符 |
c ** = a等效于c = c ** a |
//= |
取整除赋值运算符 |
c // = a等效于c = c // a |
5.3逻辑运算
运算符 |
描述 |
实例 |
and |
布尔“与”,如果为False,x and y返回False,否则它返回y的计算值 |
(a and b)返回true |
or |
布尔“或”,如果x为True,它返回True,否则它返回y的计算值 |
(a or b)返回true |
not |
布尔“非”,如果x为True,返回False,如果x为False,它返回True |
not(a and b)返回false |
5.4成员运算
运算符 |
描述 |
in |
在对象里 |
not in |
不在对象里 |