第1章 Python介绍

  本章将包含Python的介绍,安装以及Python的数据类型及运算符。其中关于数据类型中的字符串、列表、元组和字典后续章节会着重介绍。

1.1 为什么学Python
  Python是一门简明并强大的面向对象编程语言,由于简单易学且适合快速开发各种程序,在科学运算、数据分析、网站开发、爬虫开发、云计算、自动化测试等领域优势明显.

1.2 Python介绍
  Python的创始人为吉多·范罗苏姆(人称gui叔),1989年的圣诞节期间,为打发时间决心开发一个新的脚本解释程序,作为ABC语言的一种继承.在开发Python语言之前他曾使用过几年的ABC语言,ABC是一门主要用于教学目的的语言(教计算机系的学生如何设计一门开发语言),但ABC并没有流行且小众,所以他决心在Python中借鉴ABC\C等语言的特点更多的被UNIX/C黑客使用.

1.3 Python发展史
  1989年 Guido决心开发Python语言
  1991年 第一个Python编译器诞生
  1999年 Zope1 web框架诞生
  1994年 Python1.0增加了lambda,map,filter和reduce
  2000年 Python2.0相比1.x版本,新增了内存回收机制,并且支持UNICODE
  2000-2020年 Python2.x是主流的工业版本
  2008年 Python3.0发布
  2009年 Python3.1
  2011年 Python3.2
  2012年 Python3.3
  2014年 Python3.4
  2015年 Python3.5
  2016年 Python3.6
  2008年就发布了Python3.0,但由于此版本并不完全兼容之前广泛使用的2.4版本,导致基于2.4开发的软件无法在3.0的平台上运行,因此推广非常缓慢,为解决这个问题,Python官方又推出了兼容2.4和3.0两个版本的2.6,2.7都是2.x版本向3.x版本过渡的版本,由于到2020年2.x系列Python官方不再提供支持,所以2.7是2.x的最后一个版本.

1.4 Python是什么样的语言
  Python是一门动态解释型的强类型定义语言.
1.4.1 编译型和解释型
(1)编译型
  编译型语言有:C,C++,GO,Pascal
  优点:编译器一般会预编译的过程对代码进行优化.因为只编译一次,运行时无需编译,所以程序执行效率高,可以脱离语言环境独立运行.
  缺点:编译之后如果需要修改就需要整个模块重新编译.编译的时候调用系统特性时会根据平台的不同而生成不同的平台机器码,导致移植就会有问题.所以需要根据运行的平台生成不同的可执行文件.
(2)解释型
  解释型语言有:JS,Python,Ruby,PHP,Perl,JAVA
  优点:有良好的平台兼容性,移植几乎不需要改动代码就可以直接运行,前提是要在使用的平台上安装了解释器(虚拟机).灵活修改代码直接修改,可以快速部署.
  缺点:每次运行的时候都要解释一遍,性能上不如编译型语言.
1.4.2 动态语言和静态语言
  通常我们所说的动态语言,静态语言是指动态类型语言和静态类型语言.
(1)动态类型语言
  动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来.Python和Ruby就是一种典型的动态类型语言.
(2)静态类型语言
  静态类型语言的数据类型是在编译期间检查的,也就是说在写程序时要声明所有变量的数据类型,C,C++,JAVA都是静态类型语言.
1.4.3 强类型定义语言和弱类型定义语言
(1)强类型定义语言
  是强制数据类型定义的语言.也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了.比如你定义了一个整型变量a,那么程序根本不可能将a当做字符串类型处理.强类型定义语言是类型安全的语言.
(2)弱类型定义语言
  数据类型可以被忽略的语言.一个变量可以赋不同数据类型的值.
1.5 Python的语言优缺点
(1)优点
  1.Python的定位:是"优雅"、"明确"、"简单",所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序.
  2.开发效率:Python有非常强大的第三方库,基本上你想通过计算机实现任何功能,Python官方库里都有相应的模块进行支持,在基础库的基础上再进行开发,大大降低开发周期,效率非常高.
  3.高级语言:无需考虑诸如如何管理程序使用的内存一类的底层细节.
  4.可移植性:如果小心避免使用依赖于系统的特性,那么无需修改就几乎可以在市场上所有的系统平台上运行.
  5.可扩展性:如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分核心程序用C或者C++编写,然后在你的Python程序中使用它们.
  6.可嵌入性:你可以把Python嵌入你的C或C++程序,从而向你的程序用户提供脚本功能.
(2)缺点
  1.速度慢:由于边编译边执行的特点导致比执行一次编译过程的C稍微慢一些.
  2.代码不能加密:本身代码存放和编译的过程是明文,不能被加密.
  3.线程不能利用多核CPU问题,后续有解决方法.
1.6 Python安装
  在Liunx上都是自带安装的,且版本都是2.x系列,在乌班图操作系统上有2.x和3.x两个版本,在Windows下直接到官方网站下载安装包即可.
1.7 Python解释器
  当我们编写Python代码时,将会得到一个包含Python代码以.py为扩展名的文本文件.要运行代码,就需要Pyhon解释器去执行.py文件.

  CPython:当我们从官方网站下载并安装好Python后,就直接获得了一个官方版本的解释器----CPython.这个解释器是用C语言开发的,所以叫CPython.在命令行下运行python就是启动CPython解释器.CPython是使用最广的Python解释器.提示符为">>>"

1.8 第一个Python程序
  在Linux系统中,使用创建一个文件名为,hello.py的文件,编辑该文件,内容如下:
  #!/usr/bin/env python
  print("Hello,World!")
  保存退出后执行:
  $ python hello.py
  Hello,World!
  上述内容中:
  #!/usr/bin/env python,是用env环境变量里显示的python的路径去执行你的.py文件,如果不加该语句执行python hello.py也是没有问题的,但如果把该程序变成可执行文件被调用的话,也就是使用./hello.py执行该文件,不指定Python解释器是会报错的.print("Hello,World!")是输出语句把引号里的内容打印到屏幕上.

2.1 Python的变量和数据类型

2.1.1 变量
  没有保存到硬盘的数据都会先寄放到内存之中,标记数据和存储数据就是变量的工作.变量就是可变的量,是用来存储得到的临时数据,以被后续调用.

  变量的命名规则:

  (1)只能是字母、数字或下划线的任意组合,不能含有特殊字符.
  (2)首字符不能以数字开头
  (3)关键字不能声明为变量
  通常变量的命名要有描述性,类似age_of_alex和AgeOfAlex(驼峰体)都是可以的,但官方建议使用第一种命名规范.还有以下两点需要注意:在Python中以首字母开始的变量一般定义类名,变量名全部采用大写一般是定义为常量,比如PI(π).
2.1.2 数据类型
  每个变量都有相应的数据类型,就像说Python是强类型定义语言.Python的基本数据类型(结构)有5种:数字\字符串\列表\元组和字典,用不同类型的数据来表示数据状态的变化(即数据的变化性和复杂性).下面来介绍下每种数据类型的不同用法:

1.数字
  定义:age = 10
  特性:1.只能存放一个值,2.一经定义不可更改,3.直接访问
(1)int(整型)
  整型就是整数,可以用二进制,八进制(0开头),十进制,十六进制(0x或0X开头)表示.

>>> age = 10
>>> bin(10) #十进制转二进制的内置函数
'0b1010'
>>> oct(10) #十进制转八进制的内置函数
'0o12'
>>> hex(10) #十进制转十六进制的内置函数
'0xa'

  在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647,在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807.

(2)long(长整型)
  跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大.在Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,3.x版本中长整数数据后面不加字母L也不会导致严重后果了,统一为int整型.
(3)float(浮点数)
  浮点数用来处理实数,即带有小数的数字.
(4)complex(复数)
  复数由实数部分和虚数部分组成,一般形式为x+yj,其中x是复数的实数部分,y是复数的虚数部分.
(5)布尔
  布尔值:真或假,True(1)或False(0),用于条件判断.
  数字都自带布尔值属性:
  非零数字自带的布尔值都是True,0是False.
  非空字符串自带的布尔值都是True.

>>> msg = ""
>>> bool(msg) #布尔函数
False

2.字符串

  字符串是以''或""括起来的任意字符,比如'abc'和"abc"没有区别.如果字符串内部既包含'又包含",可以用转义字符\来表示.比如:
  'I\'m \"OK\"!'
  表示的字符串内容是:
  I'm "OK"!
  字符串虽然可以根据索引来取元素,但不能被直接修改,修改的话只能赋值.对于字符串有如下经常用到的,详细介绍会在第三章介绍。操作如下:

(1) 移除空白

>>> name = "  abcdefg \n"
>>> name.strip() #移除字符串两边的空格\制表符\换行符等
'abc'

(2) 长度

>>> len(name) #使用len()函数

(3) 索引

>>> name.index("a") #获取已知字符串的索引值,字符串不存在则报错
0
>>> name.find("h") #另外一种获取索引值方法,如字符串不存在不报错,返回-1则说明没有该元素
-1
>>> name.find("a")
0

(4) 切片

>>> name[-3:-1] #一直都是从左到右取值
'ef'

(5) 分割

>>> name = "abcdefg"
>>> name[0:3] #从索引0开始到索引3之间的字符(顾头不顾尾)
'abc'
>>> name[0:] #获取所有字符
'abcdefg'
>>> name[:] #另一种获取所有字符的写法
'abcdefg'
>>> name[0:-1]
'abcdef'
>>> name[0::2] #以2为步长,间隔获取字符串
'aceg'
View Code

(6) 整型判断

>>> name.isdigit() #判断字符串是不是整型,返回True或False,使用type()查看类型
False
>>> type(name)
<class 'str'>
View Code

(7) 格式化(拼接)字符串

  format,%s(占位符),+(+号),join(),Template(转换表函数)
  format有3种使用格式,如下:

>>> name = "alex"
>>> age = 23
>>> print("My name is {},I'm {} years old.".format(name,age))
My name is alex,I'm 23 years old.
View Code
>>> name = "alex"
>>> age = 23
>>> print("My name is {0},I'm {1} years old.".format(name,age))
My name is alex,I'm 23 years old.
View Code
>>> name = "alex"
>>> age = 23
>>> print("My name is {name},I'm {age} years old.".format(name="alex",age=23))
My name is alex,I'm 23 years old.
View Code

  注意:前面接收变量的{}和format里提供的变量要一致,也可以小于变量的个数,但不能大于.

>>> job = "IT"
>>> print("My name is {},I'm {} years old.".format(name,age,job))
My name is alex,I'm 23 years old.
>>> print("My name is {},I'm {} years old,Job is {}.".format(name,age))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: cannot switch from manual field specification to automatic field numbering
View Code

  %s占位符(表示str字符串)拼接,还有其他常见的占位符%d(整数),%f(浮点数),%x(十六进制)使用格式如下:

>>> name = "alex"
>>> age = 23
>>> print("My name is %s,I'm %s years old." %(name,age))
My name is alex,I'm 23 years old.
View Code

  +号拼接使用格式,此方法需注意数据类型,且效率低下,不建议使用.如下:

>>> name = "alex"
>>> age = 23
>>> job = "IT"
>>> info = "My name is "  + name + ",I'm " + age + " years old, " + "Job is " + job + "."
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
>>> age = "23" #不同类型的数据不能拼接,age改成字符串
>>> print(info)
My name is alex,I'm 23 years old, Job is IT.
View Code

  join(),常用于序列,格式如下:

>>> name = "alex"
>>> age = "23" #注意数据类型
>>> job = "IT"
>>> info = ["My name is ",name,",","I'm ",age," years old,","Job is ",job,"."]
>>> ''.join(info)
"My name is alex,I'm 23 years old,Job is IT."
View Code

  Template(转换表函数):

  此处略,后续介绍.

3.列表

  列表是我们以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储,修改等操作.详细的介绍在第2章会有详细介绍。

  定义列表:

>>> name = [] #定义空列表,用大括号[]表示列表
>>> name
[]
>>> names = ["alex","john","jack"]
>>> names[0] #通过索引访问列表中的元素,索引从0开始从左到右依次计数
'alex'
>>> names[1]
'john'
>>> names[2]
'jack'
>>> names[3] #获取超出索引的元素将报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> names[-1] #从右往左取,计数为-1,-2等
'jack'
View Code

  列表的常用操作:

(1) 追加

>>> names.append("love")
>>> names    
['alex', 'john', 'jack', 'love']
View Code

(2) 插入

>>> names.insert(0,"james")
>>> names
['james', 'alex', 'john', 'jack', 'love']
>>> names.insert(1,"owen")
>>> names
['james', 'owen', 'alex', 'john', 'jack', 'love']
>>> names.insert(names.index("james"),"23") #可以多个字符串操作组合
>>> names
['23', 'james', 'owen', 'alex', 'love']
View Code

(3) 删除

>>> del names[3]
>>> names
['james', 'owen', 'alex', 'jack', 'love']
>>> names.remove("jack")
>>> names
['james', 'owen', 'alex', 'love']
View Code

(4) 索引

>>> names.index("alex")
2
>>> names[2]
'alex'
View Code

(5) 统计

>>> names.count("james")
1
View Code

(6) 排序

>>> names.sort() #按ASII码表排序
>>> names
['23', 'alex', 'james', 'love', 'owen']
>>> names.reverse() #反转
>>> names
['owen', 'love', 'james', 'alex', '23']
View Code

(7) 切片

>>> names.sort()
>>> names[:] #和字符串的操作方式一样
['23', 'alex', 'james', 'love', 'owen']
>>> names[-1]
'owen'
>>> names[-3:]
['james', 'love', 'owen']
>>> names[::2]
['23', 'james', 'owen']
View Code

4.元组
  第二章会详细介绍
5.字典
  第四章会详细介绍

3.1 运算

  1、算数运算:

 

  2、比较运算:

 

3、赋值运算:

 

4、位运算:

注: ~  举例: ~5 = -6  解释: 将二进制数+1之后乘以-1,即~x = -(x+1),-(101 + 1) = -110

按位反转仅能用在数字前面。所以写成 3+~5 可以得到结果-3,写成3~5就出错了

5、逻辑运算:

 

and注解:

  1. 在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值;而是,返回它们实际进行比较的值之一。
  2. 在布尔上下文中从左到右演算表达式的值,如果布尔上下文中的所有值都为真,那么 and 返回最后一个值。
  3. 如果布尔上下文中的某个值为假,则 and 返回第一个假值

or注解:

  1. 使用 or 时,在布尔上下文中从左到右演算值,就像 and 一样。如果有一个值为真,or 立刻返回该值
  2. 如果所有的值都为假,or 返回最后一个假值
  3. 注意 or 在布尔上下文中会一直进行表达式演算直到找到第一个真值,然后就会忽略剩余的比较值

and-or结合使用:

  1. 结合了前面的两种语法,推理即可。
  2. 为加强程序可读性,最好与括号连用,例如:
    (1 and 'x') or 'y'

6、成员运算:

 

7.身份运算

 

8.运算符优先级:自上而下,优先级从高到低

posted @ 2017-01-09 14:18  草丛抡  阅读(315)  评论(0编辑  收藏  举报