目前由于大数据和人工智能的流行,Python越来越火,和其他语言相比,Python简洁易用,实现同样的功能往往其他语言需要好多行代码,而Python只需要几行就完成了。Python目前用的最多的地方是人工智能方向,其次在Web应用上用的也比较多,另外作为脚本语言,在自动化测试等方面使用也比较广泛。
Python入门简单,但是想深入掌握并不容易,每一门语言都是这样,而且由于python灵活,更增加了它的难度,我个人做过Java和Golang的开发,Python和另外两门语言比较,确实太灵活,这是它的优点,有时候感觉也是缺点。
1.1 Python版本说明
目前最流行的是Python3.x版本,在2008年12月发布的,Python3.0是一次重大升级,而且为了避免引入历史包袱,Python3.0没有考虑与Python2.x兼容,这就导致了Python2.x与Python3.x之间差异较大,所以如果使用Python2.x,很多地方与Python3.x不兼容,所以初学者最好上手就用Python3.x版本
1.2 Python特点
优点:
Python是一种面向对象的解释型的弱类型的脚本语言,相比Java等语言,Python代码显得比较简单,上手非常容易,而且简洁。
Python没有大括号,而是使用缩进的方式,这点后续通过代码可以感受到
Python是一门解释型语言,因此天生就具有跨平台的特征,只要为该操作系统提供了相应的Python解释器,Python程序就可以在上面运行。
缺点:
执行速度慢:由于Python是解释型语言,因此它的执行速度比较慢,比如和Java、C、 C++相比都要慢
源代码加密困难:Python不像编译型语言的源程序会被编译成目标程序,Python是直接运行源程序,因此对源代码加密比较困难,所以如果要商业化一个软件,源代码就有可能被窃取,需要做其他处理。
1.3第一个程序
学每一门编程语言,第一个程序基本都是hello world,下面是Python的hello world程序
例1.1 Hello world
#!usr/bin/python3
print("Hello world")
结果:
Hello world
1.4 交互式解释器
交互式解释器可以让开发者逐行输入Python代码,解释器逐行解释,交互式解释器可以用于测试各种功能,方便快捷
例1.2 使用交互式解释器执行hello world
例1.3 获取python关键字
例1.4 计算加法
1.5 变量
所有编程语言的第一个功能基本都是定义变量,变量是编程的起点,程序用到的各种数据都是存储在变量内的,Python是一门弱类型语言,弱类型包含两方面含义
1. 所有的变量无须声明即可使用,或者说对从未用过的变量赋值就是声明了该变量。
2. 变量的数据类型可以随时改变,同一个变量可以一会儿是数值型,一会儿是字符串型
变量就像一个个小容器,用于盛装程序中的数据,常量同样也可以做到这点,区别是:常量一旦保存了某个数据后,该数据就不能发生改变,但变量保存的数据则可以多次发生改变,只要程序对变量重新赋值即可。
变量的命名规则:同其他编程语言类似,Python变量支持以字母、下划线开头,后面更若干个字母、下划线、数字
定义变量的时候尽量不要和关键字和内置函数重名,否则可能出现问题
定义变量用=运算符,如下所示:
例1.5 定义变量
#!usr/bin/python3
a = 5 #定义变量
print("a = ", a)
a = "haha" #定义变量
print("a = ", a)
print("type = ", a)
结果:
a = 5
a = haha
type = haha
全局变量与局部变量
#!/usr/bin/python3
total1 = 0 # 这是一个全局变量
def sum(arg1, arg2):
total2 = arg1 + arg2 # total2在这里是局部变量.
print("函数内是局部变量 : ", total2)
return total2
# 调用sum函数
sum(10, 20)
print("函数外是全局变量 : ", total1)
结果:
函数内是局部变量 : 30
函数外是全局变量 : 0
常量
pi: 数学常量 pi(圆周率,一般以π来表示)
e: 数学常量 e,e即自然常数(自然常数)
#!usr/bin/python3
import math
print("pi = ", math.pi)
print("e = ", math.e)
结果:
pi = 3.141592653589793
e = 2.718281828459045
print函数
这里插一下print()函数,如上例所示,print可以将变量打印出来,print也可以输入多个变量,如下所示:
例1.6 print输入多个参数
#!usr/bin/python3
name = "zhangsan"
age = 20
print("name = ", name, "age = ", age)
结果:
name = zhangsan age = 20
file参数指定了print()函数的输出目标,print()函数file参数的默认值是sys.stdout,该默认值代表了系统标准输出,也就是屏幕,因此print()函数默认输出到屏幕上,实际上,完全可以通过改变该参数让print()函数输出到特定文件中,如下所示:
例1.7
#!usr/bin/python3
f = open("test.txt", "w")
print("haha", file=f)
print("hehe", file=f)
f.close()
结果:输入到了test.txt中
1.6 运算符
与其他编程语言一样,python也有众多的运算符,运算符是用来表示数据的运算、赋值和比较等,编程语言的运算符一般分为如下几种:
1. 赋值运算符
2. 算术运算符
3. 位运算符
4. 索引运算符
5. 比较运算符
6. 逻辑运算符
7. 成员运算符
1.5.1 赋值运算符
赋值运算符已经用了很多了,几乎所有编程语言都用 = ,将右边的值赋给左边的变量或常量,如下所示:
例1.8 普通赋值运算符
#!usr/bin/python3
a = 3 #为变量a赋值
b = a #将变量a的值赋给变量b
print("a = ", a)
例1.9 幂赋值运算符
a = 2
b = 5
b **=a #相当于b = b ** a
print("b = ", b)
结果:
25
python支持给多个变量同时赋值,例如:
例1.10
#!usr/bin/python3
a, b, c = 10, 20, 30
print("a = ", a)
print("b = ", b)
print("c = ", c)
结果:
a = 10
b = 20
c = 30
1.5.2 算术运算符
算术运算符包括经常使用的加、减、乘、除、取余等
1. 加法
例1.11
#!usr/bin/python3
a = 3
b = 5
c = a + b
print("c = ", c)
结果:
c = 8
2. 减法
例1.12
#!usr/bin/python3
a = 8
b = 1
c = a - b
print("c = ", c)
结果:
c = 7
"-"除了做减法,还可以当作求负数的运算符
例1.13
#!usr/bin/python3
a = -3
print("a = ", a)
结果:
a = -3
3. 乘法
例1.14
#!usr/bin/python3
a = 8
b = 2
c = a * b
print("c = ", c)
结果:
c = 16
4. 除法 / 与 //
python 中有两种除法,/ 与数学意义上的除法一样,除不尽,会有小数,而// 的结果只有整数部分。
例1.15
#!usr/bin/python3
a = 19.0
b = 4
print("a / b = ", a / b)
print("a // b = ", a // b)
结果:
a / b = 4.75
a // b = 4.0
5. 乘方
例1.16
a = 2
b = 4
c = a ** b
print("c = ", c)
结果:
c = 16
6. 取余
就是求余数,求余数涉及到除法,因此第二个操作数不能是0
例1.17
#!usr/bin/python3
a = 5
b = 2
c = a % b #5除以2余数是1
print("c = ", c)
结果:
c = 1
1.5.3 成员运算符in
成员运算符有in 和 not in,用法见下例:
例1.18
a = 10
lists = [1, 2, 3, 4, 5]
if a in lists:
print("a 在list中")
else:
print("a不在list中")
结果:
a不在list中
例1.19
#!usr/bin/python3
a = "haha hehe"
if "haha" in a:
print("haha")
if "heihei" not in a:
print("hehe")
结果:
haha
hehe
1.5.4 比较运算符
比较运算符一般有如下几种:
1. > 判断第一个数是否大于第二个数
2. < 判断第一个数是否小于第二个数
3. >= 判断第一个数是否大于等于第二个数
4. <= 判断第一个数是否小于等于第二个数
5. == 判断第一个数是否等于第二个数
6. != 判断第一个数是否不等于第二个数
7. is 判断两个变量所引用的对象是否相同,如果相同则返回True
8. is not 判断两个变量所引用的对象是否不同,如果不同则返回True
比较运算符中需要注意==表示两个变量的值是否相等,而is 是比较两个对象是否是同一个对象,注意区分。
例1.20
#!usr/bin/python3
import time
a = time.gmtime()
b = time.gmtime()
print("a == b : ", a == b) #当前系统时间相等,因此这里返回True
print("a is b : ", a is b) #二者不是一个对象,因此这里返回False
print(id(a)) #返回a的地址
print(id(b)) #返回b的地址,二者的地址不一样,因此是不同的对象
结果:
a == b : True
a is b : False
4435201344
4435604288
1.5.5 位运算符
位运算符一般都用在比较底层的地方,可以直接操作数值的原始bit位,初学者可以先跳过
1.5.6 索引运算符
主要用在字符串或列表中,用于获取字符串或列表的元素,如:
例1.21
#!usr/bin/python3
a = "www.baidu.com"
print(a[4]) #打印索引为4的元素b
结果:
b
1.5.7 逻辑运算符
逻辑运算符用于操作bool类型的变量、常量、表达式,返回值也是bool类型
python的逻辑运算符有如下3个
1. and: 与,其他编程语言一般写作&&,前后两个操作数必须都是True才返回True,否则返回False,即“一假即假”
2. or : 或,其他编程语言一般写作||,前后两个操作数只要有一个是True就True,除非两个都是False才返回False,即“一真即真”
3. not:非,只需要一个操作数,操作数为True,则取非返回False,操作数为False,则取非返回True
逻辑运算符在条件语句、循环语句用的非常多,相关用法在条件语句和循环语句介绍
1.5.8 三目运算符
三目运算符是为了简洁,将if else语句转化为了1行,一般使用三目运算符的地方都可以用if else条件语句替代,这里不再介绍
1.6 数据类型
在所有编程语言中,都有数据类型的概念,Python虽然是弱类型语言,同样也有数据类型的概念,一般情况,数据类型都有整型、浮点型、字符型、布尔型。
1.6.1 数据类型的分类
1.6.1.1 整型
Python的整型支持各种整数值,不管是大的数,还是小的数,这点与Java不同,有Java语言经验的伙伴应该记得Java表示整型还分byte、short、int、long,来分别代表不同范围的数字,Python将这一切都简化了,如下所示:
例1.22
#!usr/bin/python3
a = 45
print(a)
a = 678934438483483843843833232324834 #多大的数都可以表示,如果放到其他语言,可能会溢出
print(a)
print(type(a))
结果:
45
678934438483483843843833232324834
<class 'int'>
另外python也支持None值(空值,类似于java的null,golang的nil),如下所示:
例1.23
#!usr/bin/python3
a = None
print(a)
if a == None:
print("a == None")
if a is None:
print("a is None")
结果:
None
a == None
a is None
1.6.1.2 浮点型
与其他编程语言一样,浮点数用于保存带小数点的数值,Python中的浮点数有两种表示方式:
1. 十进制形式:这种方式最常见,如5.34,浮点数必须包含一个小数点
2. 科学计数形式:例如5.34e2 (即5.34 x 10 的平方),只有浮点型数值才可以使用科学技术形式表示。
例1.24
#!usr/bin/python3
a = 4.232
print("a = ", a)
print("type(a) = ", type(a))
b = 5e4
print("b = ", b)
print("type(b) = ", b)
结果:
a = 4.232
type(a) = <class 'float'>
b = 50000.0
type(b) = 50000.0
1.6.1.3 复数
这个用的不多,其他编程语言用的也很少,知道Python支持复数就行,初学者很难接触到
1.6.1.4 布尔型
布尔型在所有编程语言中几乎都存在,有两个值True、False,表示真假,如5 > 3就是真,5 < 3就是假,相关用法在比较运算符那里使用过,后面在条件判断语句和循环语句中经常要用到
例1.25
#!usr/bin/python3
a = 5 > 3
b = 5 < 3
print("a = ", a)
print("b = ", b)
结果:
a = True
b = False
1.6.2 字符串操作
在各种编程语言中,字符串都是少不了的,字符串就是一串字符,比如"haha",字符串必须用引号括起来,在Python中使用单引号和双引号都可以,但是在其他编程语言中基本只能用双引号。
例1.26
#!usr/bin/python3
str = "haha"
print("str = ", str)
结果:
str = haha
字符串拼接
例1.27
#!usr/bin/python3
s1 = "hello "
s2 = "world"
s = s1 + s2
print("s = ", s)
结果:
s = hello world
多个相同字符串拼接
例1.28
#!usr/bin/python3
a = "haha.hehe"
b = a * 5 #5个相同字符串拼接
print("b = ", b)
结果:
b = haha.hehehaha.hehehaha.hehehaha.hehehaha.hehe
字符串与数字拼接
字符串与数字进行拼接,需要先将数字转化为字符串,转化的方式有使用str()和repr()两种,如下所示:
例1.29
#!usr/bin/python3
price = 10.3
print("the price of this book is " + str(price))
print("the price of this book is " + repr(price))
结果:
the price of this book is 10.3
the price of this book is 10.3
获取用户输入
input()函数用于向用户生成一条提示,然后获取到用户输入的内容,该函数返回的是一个字符串,如下所示:
例1.30
#!usr/bin/python3
msg = input("please input a str")
print("msg = ", msg)
结果:
Python长字符串
Python可以用''' '''来表示长字符串,同时也可以被用来做注释,如下:
例1.31
#!usr/bin/python3
s = ''' dksfjdsfkdskfjkdsjkfjdsjf
dksfjdjksfjdskfkjdsjkfjkdsjfjdsk
dfksadjfkjdsjfdjkskfjdskfjdskfjsd
kdsfjkdskjfkdsjfkdsjkkfjjdskfjds '''
print("s = ", s)
结果:
s = dksfjdsfkdskfjkdsjkfjdsjf
dksfjdjksfjdskfkjdsjkfjkdsjfjdsk
dfksadjfkjdsjfdjkskfjdskfjdskfjsd
kdsfjkdskjfkdsjfkdsjkkfjjdskfjds
字节串(bytes)
所谓的字节串,官方没有这个概念,指的是和字符串对应,基本单位是字节,以字节为单位进行操作。字符串转字节串有3种方式,分别是:
a. 如果字符串内容都是ASCII字符,可以直接在字符串之前添加b来构建字节串值
b. 调用bytes()函数,将字符串按指定字符集转换成字节串
c. 调用字符串本身的encode()方法将字符串按指定字符集转换成字节串,如果不指定字符集,默认使用UTF-8字符集
例1.32
#!usr/bin/python3
a = b"python"
b = bytes("我喜欢python", encoding="utf-8")
c = "我喜欢python".encode()
print("a = ", a)
print("b = ", b)
print("c = ", c)
结果:
a = b'python'
b = b'\xe6\x88\x91\xe5\x96\x9c\xe6\xac\xa2python'
c = b'\xe6\x88\x91\xe5\x96\x9c\xe6\xac\xa2python'
同样也可以把字节串转码为字符串,如下所示:
例1.33
#!usr/bin/python3
a = b'\xe6\x88\x91\xe5\x96\x9c\xe6\xac\xa2python'
s = a.decode()
print("s = ", s)
结果:
s = 我喜欢python
转义字符
与其他编程语言一样,Python也有转义字符,用\ ,如\n表示换行,\\表示反斜线,如下例所示:
例1.34
#!usr/bin/python3
s = "haha\nhehe\nheihei\nxixi"
print("s = ", s)
结果:
字符串格式化
Python提供了 % 对各种类型的数据进行格式化输出,例如:
例1.35
#!usr/bin/python3
age = 30
print("the age of xiaoming is %s" % age)
结果:
the age of xiaoming is 30
如果出现了多个占位符,那么也应该有多个值和它对应,如下所示:
例1.36
#!usr/bin/python3
name = "xiaoming"
age = 20
print("the age of %s is %s" % (name, age))
结果:
the age of xiaoming is 20
Python占位符不止只有%s一个,还有其他,如%d表示十进制整数,%f表示浮点数等,这点和其他编程语言类似,尤其注意的是%f可以指定小数点后的位数,如下所示:
例1.37
#!usr/bin/python3
a = 12.345
print("a = %0.2f" % a) # %0.2f表示转换后保留2位小数
结果:
a = 12.35
字符串序列相关方法
字符串是由一堆字符组成的,程序允许通过索引来操作字符,比如获取指定索引处的字符,在Python中,可以正向获取,也可以逆向获取,如下所示:
例1.38
#!usr/bin/python3
a = "www.baidu.com"
print("a[0] = ", a[0]) #正向获取第一个
print("a[-2] = ", a[-2]) #逆向获取倒数第2个
结果:
a[0] = w
a[-2] = o
除了获取单个字符,还可以获取一个范围的子串,如下所示:
例1.39
#!usr/bin/python3
a = "www.baidu.com"
print("a[2:5] = ", a[2:5]) #获取索引从2到4,不包含5,左闭右开
print("a[-5:-2] = ", a[-5:-2]) #获取索引从-5到-3,不包含-2,同样左闭右开
print("a[1:-2] = ", a[1:-2]) #获取索引从1到-3,不包含-2,同样左闭右开
结果:
a[2:5] = w.b
a[-5:-2] = u.c
a[1:-2] = ww.baidu.c
上面的用法还允许省略起始索引和结束索引,如果省略起始索引,相当于从开始处截取,如果省略了结束索引,相当于截取到最后,如下所示:
例1.40
#!usr/bin/python3
a = "www.baidu.com"
print("a[:5] = ", a[:5]) #省略起始索引,相当于从索引0开始截取到索引4,不含5,同样左开右闭
print("a[-5:] = ", a[-5:]) #省略结束索引,相当于从索引-5开始,截取到最后
结果:
a[:5] = www.b
a[-5:] = u.com
判断是否包含字串
Python与其他编程语言一样,都可以判断一个字符串是否包含某个子串,如下所示:
例1.41
#!usr/bin/python3
a = "www.baidu.com"
b = "www" in a #返回True
c = "haha" in a #返回False
print("b = ", b)
print("c = ", c)
结果:
b = True
c = False
获取字符串长度
例1.42
#!usr/bin/python3
a = "www.baidu.com"
print("len = ", len(a))
结果:
len = 13
获取最大最小字符
例1.43
#!usr/bin/python3
a = "www.baidu.com"
print("max = ", max(a))
print("min = ", min(a))
结果:
max = w
min = .
大小写相关方法
Python可以对字符串进行大小写的转换,通常有如下几种:
1.title()首字母改为大写
2.lower()将整个字符串改为小写
3.upper()将整个字符串改为大写
例1.44
#!usr/bin/python3
s = "www.BAIdu.com"
print(s.title()) #首字母大写
print(s.lower()) #全部改为小写
print(s.upper()) #全部改为大写
结果:
Www.Baidu.Com
www.baidu.com
WWW.BAIDU.COM
删除空白
Python提供了一些方法来删除空白
1. strip() 删除字符串前后的空白
2. lstrip()删除字符串前面(左边)的空白
3. rstrip()删除字符串后面(右边)的空白
例1.45
#!usr/bin/python3
a = " www.baidu.com "
print(a.strip()) #删除两边的空白
print(a.lstrip()) #删除左边的空白
print(a.rstrip()) #删除右边的空白
结果:
www.baidu.com
www.baidu.com
www.baidu.com
查找与替换相关方法
Python的字符串提供了很多查找替换相关的方法,有如下几种:
1. startswith() 判断字符串是否是以指定子串开头
2. endswith() 判断字符串是否以指定子串结尾
3. find() 查找指定子串在字符串中出现的位置,如果没有找到指定子串,则返回-1
4. index() 查找指定子串在字符串中出现的位置,如果没有找到,则引发ValueError错误
5. replace() 使用指定子串替换字符串中的目标子串
例1.46
#!usr/bin/python3
a = "www.baidu.com"
b = "www"
c = "com"
print(a.startswith(b))
print(a.endswith(c))
结果:
True
True
例1.47
#!usr/bin/python3
a = "www.baidu.com"
b = "baidu"
c = "haha"
print(a.find(b)) #打印出下标4
print(a.index(c)) #报错,因为没有找到子串
结果:
例1.48
#!usr/bin/python3
a = "www.baidu.com"
print(a.replace("www", "haha")) #将www替换为haha
结果:
haha.baidu.com
字符串分割、连接
1. split()将字符串按照指定分隔符分割成多个子串
2. join()将多个字符串拼接成一个,与split()是逆运算
例1.49
#!usr/bin/python3
a = "www-baidu-com"
b = ["haha", "hehe", "heihei"]
print(a.split("-"))
print("-".join(b))
结果:
['www', 'baidu', 'com']
haha-hehe-heihei
1.6.3 数据类型转换
隐式类型转换
在隐式类型转换中,Python 会自动将一种数据类型转换为另一种数据类型,不需要干预。
如下例,int和float相加后,结果变成float
例1.50
a = 123
b = 1.23
c = a + b
print("datatype of a:", type(a))
print("datatype of b:", type(b))
print("Value of c:", c)
print("datatype of c:", type(c))
结果:
datatype of a: <class 'int'>
datatype of b: <class 'float'>
Value of c: 124.23
datatype of c: <class 'float'>
显式类型转换
例1.51
a = int(11)
b = int(2.3)
c = int("34")
print("a=",a)
print("b=",b)
print("c=",c)
结果:
a= 11
b= 2
c= 34
例1.52
x = float(122)
y = float(2.2)
z = float("9")
w = float("4.8")
print(x)
print(y)
print(z)
print(w)
结果:
122.0
2.2
9.0
4.8
例1.53
a = str("sss1")
b = str(32)
c = str(23.3)
print("a = ", a)
print("b = ", b)
print("c = ", c)
结果:
a = sss1
b = 32
c = 23.3
1.8 import 与 from ... import
import 和from ... import主要用于导入相关模块,python中的第三方类库非常多,都需要导入才行
例1.54
import sys
print("命令行参数是:")
for i in sys.argv:
print(i)
print("python路径是:",sys.path)
from sys import path # 导入特定的成员
print('path:', path)