*************************************************************************************************************
本部分内容是以《Python程序设计:任务式驱动教程》@作者:郑凯梅 这本书为基础对Python相关知识进行介绍,结合网上资料以及相关例程对Python相关知识进行解读和总结,帮助Python学习者快速进阶
*************************************************************************************************************
(1)简单
(2)易学
(3)免费、开源
(4)可移植性
(5)解释性:Python语言写的程序不需要编译成二进制代码。Python的解释器把源代码转换为字节码的中间代码形式,然后翻译成计算机使用的机器语言并运行。
(6)面向对象:及支持面向过程也支持面向对象。面向过程的编程中,Python程序由模块或者函数构建;在面向对象的编程中,Python程序通过数据和功能组成的类来构建。
(7)可扩展性
(8)库丰富
IDLE、Emacs、Vim、Eclipse
1.3Python的文件类型
Python文件通过Python解释器解释运行。在Windows中必须要有python.exe与pythonw.exe,只要设置正确的环境变量,即可运行Python程序
(1)源代码
扩展名是.py,pym文件是Windows下开发图形用户接口(GUI)
(2)字节代码
Python源文件经过编译后生成以.pyc为为扩展名的文件。PYC文件是字节码文件,不能使用文本编辑工具打开或修改。PYC文件与平台无关,可运行在Windows、Unixs、Linux等操作系统中。PY文件直接运行后,即可得到PYC文件,或通过脚本生成该类型的文件。例如:
import py_compile
py_compile.compile('hello.py')
(3)优化代码
扩展名为.pyo的文件是经过优化的源文件
(1)缩进
默认值,4个空格表示一个缩进层次
(2)行的最大长度
可使用\,即反斜杠符号对行进行延续
(3)导入
import通常放在文件的顶部
(4)运算符
最好在二元运算符的两侧各放置一个空格,赋值 = 、比较 == > < in 、not in 、is、is not 及布尔运算(and,or not)
(5)注释
#+空格+内容+空格+#
(6)命名约定
单词首字母大写;模块名应该是不含下划线的、简短的、小写的名字——模块名被映射到文件名,有些文件系统大小写不敏感;
双下划线"__"作为前导为类的私有属性;全局变量使用一个前缀下滑线"_"防止其被导出
Python中的基本数据类型主要分为两种,即数值数据类型和字符串数据类型。Python使用对象模型来存储数据,每一个数据都有相对应的内置类。新建一个数据,实际就是初始化并生成一个对象,即所有数据都是对象。
Python中的对象有下述三个特性。
(1)标识:对象的内存地址,可以使用函数id()来获得
(2)类型:决定了该对象可以保存什么值,可执行何种操作,需要遵守什么规则,可以使用函数type()来获得
(3)值:内存空间保存的真实数值
Python3支持int、float、bool、complex(复数)等几种数值数据类型
(1)整型(int)
正整数或者负整数,无小数点。无大小限制,可以作为long使用
整型的四种表现形式如下:
《1》二进制:0b开头
《2》八进制:0o开头
《3》十进制:正常表示
《4》十六进制:0x开头
这四种进制数据的转换,通过Python的内置函数bin()、oct()、int()、hex()来实现
(2)浮点型(float)
也可以用科学计数法来表示2.5e3
(3)布尔型(bool)
布尔型数据的运算结果是常亮True或False。这两个常量的值是1和0
(4)复数(complex)
complex(a,b)------->复数的实部a和虚部b都是浮点型数据
Python中字符串是用单引号(')、双引号('')、三引号(''')括起来,同时使用反斜杠(\)转义特殊字符的一段文字,常用转义字符可以自行百度,其中,print(r'content')-----开头的r可以使得转义字符不进行转义,字符串的前面加上字母r就表示raw string,也叫原始字符串。
Python是一种动态类型的语言,在赋值过程中可以绑定不同类型的值。Python中的变量不需要声明,但是每个变量在使用前必须赋值。只有变量赋值后,才会创建该变量并分配内存空间
注意:
《1》变量命名规则:(下划线或字母)+(任意数目的字母、数字、下划线)
《2》(_X_)前后都有下划线的变量名是系统定义的变量名,对解释器有特殊意义
《3》变量赋值方式:
普通赋值:y =1
链式赋值:x = y = a = 1
多元赋值:x,y = 1,2
增量赋值:x += 1 (理解同C,变量左侧,常量右侧)
正则表达式RE(Regular Expression)是定义模式的字符串,其本质是字符串,主要是用来匹配目标字符串 ,并对其进行处理,如替换、分隔等。
本章暂不进行深究,后续在涉及爬虫相关的知识到会进行补充
Python运算符包括赋值运算符、算术运算符、关系运算符、逻辑运算符、位运算符、成员运算符。表达式是将不同类型的数据(常量、变量、函数)用运算符按照一定的规则连接起来的式子。
/:除法,5/2=2.5
**:幂指数,5**2=25
//:整除,5//2=2
把数字转换为二进制进行位运算,运算结果再转换为原来的进制
变量名= input("输入提示信息字符")
注意:
(1)通过int()、float()、eval()函数与input()函数的组合,可以输入整数或者小数。
(2)多输入时可以使用eval()函数,例如:x,y,z=eval(input())
print()的语法如下:
print(*object, sep=' ', end= '\n', file=sys.stout, flush = False)
值得注意的是:format()函数是Python2.6之后的版本新增的格式化输出函数,功能十分强大。其特点是用{}代替%进行格式控制,且不限制参数个数,位置不必按照顺序书写;一个参数可以多次使用,也可以不使用
例:
a,b =eval(input("please input the number\n"))
print('{1:.3f},{0:.4f}' .format(a,b))
输入为1.7,2.3
输出结果为2.300,1.7000
Python除支持基本的数学运算外、还提供其他语言不常见的数学特性,如分数运算和复数运算。Python的math模块包含高级运算中常见的三角函数、统计函数、对数函数等
Python的模块fractions中定义了一个特殊的对象,叫做Fraction。该对象的属性包括分子和分母。一旦定义了分数对象,就可以进行各种各样的算术运算了。在使用分数对象之前,需要引入fractions模块,语法如下:
from fraction import Fractions
Fraction对象有3种实例化方式:
(1)t = Fraction(1, 3)
(2)t = Fraction(3.5)
(3)t = Fraction('3/5')
complex(real,imag)
主要分为三种:顺序结构、选择结构和循环结构
if 条件:
条件为真时要执行的语句
else:
条件为假时要执行的语句
if-elif-else语法格式如下:
if 条件1:
条件1为真时执行的语句块1
elif 条件2:
条件2为真时执行的语句块2
.
.
.
elif 条件n:
条件n为真时执行的语句块n
else:
上述条件均不满足时执行的语句块n+1
if 条件1:
if 条件2:
条件1为真且条件2为真时执行的语句块1
else:
条件1为真且条件2为假时执行的语句块2
else:
条件1为假时执行的语句块3
例程如下:判断三角形的类型:是直角还是钝角还是锐角
a,b,c = eval(input('please input the a,b,c\n'))
if(a > b):
(a, b)= (b, a) #这点很有意思,在C中需要一个额外的容器来存放交换的中间值
if(a > c):
(a, c)= (c, a)
if(b > c):
(b,c) = (c, b)
#print(a,b,c)
if(a+b>c):
if(a**2 +b**2 == c**2):
print('This a zhijiao\n')
elif(a**2 +b**2 > c**2):
print('This is dunjiao\n')
elif(a**2 +b**2 < c**2):
print('This is ruijiao\n')
else:
print('This is not a triangle!')
while循环语法格式如下:
[初始化语句]
while(循环条件):
语句块
[迭代语句]
流程如下:
执行到while循环的时候,先判断“循环条件”,若结果为“True”,则执行下面缩进的循环体;执行完毕,再次判断“循环条件”,同上,为“True”则继续执行循环体,为“False”则不再执行循环体,循环结束。循环结束后,继续执行循环结构之后的语句。
注意:
(1)初始化语句:循环控制变量赋初值,或其他循环中用到的变量的初始化。
(2)循环条件:循环结构继续执行的条件,是一个结果为True或False的表达式。
(3)迭代语句:通常是循环控制变量的改变,且朝着循环结束条件的方向变化,使得循环可以正常结束。
例程如下:
根据公式求解pi的大小,要求最后的相邻两个数值之差小于1e-10
import fractions
n = 1
sum = 1.0
s1 = fractions.Fraction(2,3)
temp = 0.0
results = 0.0
while(abs(s1-temp) >= 1e-20):
sum =sum * s1
temp = s1
n = n+1
s1 = (2*n)**2/((2*n-1)*(2*n+1))
results = sum*4
print('the final resaults is {}' .format(results))
在为一个集合(序列和其他可迭代对象)的每个元素都执行一个相同的代码块,使用for语句更有效。
for语句的基本形式如下:
for <变量> in <序列>:
循环体语句块
其中,序列可以是等差数列、字符串、列表、元组或者是一个文件对象。在执行过程中,变量依次被赋值为序列中的每一个值,然后执行缩进语句块。序列中的所有元素被扫描完毕,循环结束。
注意:
(1)缩进问题
(2)序列可以是后面要讲得数据结构的对象,也可以是通过range来产生的一个连续的数字列表。range不是一个真正的函数,它是一种数据类型,代表不可操作的连续数字。
(3)range用法如下:
@1 range(stop)
产生0~x-1的整数序列
例:range(6)产生0、1、2、3、4、5
@2 range(start,stop)
产生start、start+1、....、stop-1这系列的整数。
要求start和stop是整数且start
例:range(0,5)产生0、1、2、3、4
@3 range(start,stop,step)
例:range(3,10,2)产生3、5、7、9的整数序列
for循环语句使用例程1——计算n的阶乘
#calculate n!= 1*2*3*4*....*n
number = int(input('Please enter an integer\n'))
results = 1
for i in range(1,number+1):
results = results*i
print(results)
@1 break
功能:从循环体当前位置退出。当循环体执行到这个语句时,循环马上退出并终止。
@2 continue
功能:结束当前循环,开始新一轮循环。即当前循环中的剩余语句不再执行,程序跳转到循环体的头部重新开始下一轮
例程,判断一个输入是否是素数:
import os
if os.name == 'nt':
import msvcrt
def getch():
return msvcrt.getch().decode()
else:
import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
def getch():
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
while(1):
a = input('Please enter an integer\n')
if(getch()== 0x1b):
break
elif(a > 0):
flag = 0
for i in range(2,a):
if(a%i == 0):
flag = 1
if(flag == 1):
print('{} is not sushuo' .format(a))
else:
print('{} is sushuo'.format(a))
在这里,值得注意的是以下这段函数,因为在linux中并没有getch(),所以def定义一个getch函数,并且由于termios的使用,下面这段程序在Linux中只能通过terminal进行使用
import os
if os.name == 'nt':
import msvcrt
def getch():
return msvcrt.getch().decode()
else:
import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
def getch():
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
(1)else在while循环语法中的使用
[初始化语法块]
while(循环条件):
语句块
[迭代语句]
else:
语句块
注意:循环条件为False时跳入else中
(2)else在for循环中的使用
for <变量> in <序列>:
循环体语句块
else:
语句块
注意:else部分只在for循环正常终止时执行(而不是遇到break语句)
例程输出素数,输出100-200之间的素数:
#output the sushuo from 100 to 200
flag = 0
for i in range(100,200):
for j in range(2,i):
if(i%j == 0):
break
if(j == i-1):
print('{}' .format(i))
(1)字符串列表
for <变量> in ['string1','string2',....'stringn']
循环体语句块
else:
语句块
(2)单个字符串
for <变量> in 字符串:
循环体语句块
else:
语句块
循环结构中,for或者while语句中至少包含一条语句的缩进语句块,若需要一个没有循环体语句块的循环结构,此时至少可以使用pass语句,pass是什么也不做的一个占位符
列表是Python中最基本的数据结构,也是最常用的Python数据类型。列表的数据相不需要具有相同的类型。列表中为每一个元素分配一个数字,表示它的位置与索引。第一个索引是0,第二个索引是1,以此类推。
列表的特点是通过一个变量存储多个数据值,且数据类型可以不同。另外,列表可以修改、如添加或者删除列表中的元素。
Python中内置了很多函数或方法来操作列表,主要包括索引、分片、列表操作符加或乘,以及其他一些函数和方法,如计算列表长度、最大值、最小值等函数以及添加、修改或者列表元素的方法
@1列表的创建
列表的创建是用方括号括起来所有元素,并且元素之间用逗号分隔。
例:对于mylist = ['100', 'apple',4.5,'山东','2019-6-11',100]
(1)in操作符遍历
for item in mylist:
print(item, end = ' ')
(2)借由range()函数来遍历
for i in range(len(mylist)):
print('{}'.format(mylist[i]), end = ' ')
(3)借由iter()函数(这部分仍然存在疑惑???)
for item in iter(mylist):
print('{}'.format(item))
(4)借由enumerate可生成索引及数值
for list_id,list_value in enumerate(mylist):
print('{} {}\n'.format(list_id, list_value))
@2列表元素的访问及列表的切片
切片语法格式:
a:b且a
@3更新列表
a =[1,2,4,3,4,5]
a[3] =3 #把索引号3的位置的元素的数值修改为3
a.append(8)#尾部增加一个8
@4删除列表
list=[1,2,4,3,2,6,7,4]
del list[1] #删除索引号为1的
del list[2:4]#删除2、3两个索引号的元素
del list#删除整个列表
list.pop(2) #删除索引号为2的元素
list.pop() #m默认删除尾部的元素
@5列表操作符
list1 = [1,2,3,'',2019]
list2 =[4,5,6,'ee',2018]
Python语句 结果
len(list1) 5
list1 + list2 [1,2,3,'',2019,4,5,6,'ee',2018]
list1 * 2 [1,2,3,'',2019,1,2,3,'',2019]
[3] in list1 True
[3] not in list1 False
for x in list1:print(x) 1,2,3, ,2019
@6列表操作的函数及方法
函数操作中,列表对象作为函数的参数;而方法操作中,通过列表对象名.方法名(参数表)的形式调用方法。关于方法的定义和使用,见高级篇中面向对象的单元
列表中的常见函数:
例:
list1 = [1,2,'11','asda']
list2 = [1,2,2,5,6]
函数名 实例 结果 描述
len(list1) print(len(list1)) 4 长度
max(list2) print(max(list2)) 6 所针对列表的元素只能为数据类型(int float)
min(list2) print(min(list2)) 1 同上
sum(list2) print(sum(list2)) 16 同上
list(seq) print(list('a','b')) ['a','b'] 将元组转换为列表
列表中的常见方法如下:此部分需要时自行百度即可
函数名 实例 结果 描述
append(obj) t=['a','b']
t.append(1) ['a','b',1] 增加一个元素,或者是嵌套一个列表
count(obj)
extend(obj) 合并列表
index(obj)
insert(obj)
pop(obj)
remove(obj)
reverse(obj)
sort(obj)
@7嵌套列表
Python支持嵌套列表,即列表中的元素也是列表,也称多维列表。最好不要超过三层
例程:
mylist[['1001','a',1,2222,4.5],
['10','1011',1,22,1.5],
['1','2019',1,21,0.5]]
for each in mylist:
for item in each:
print(item,end = ' ')
4.1.2 列表解析
Python的强大特性之一是对list的解析。通过对list中的每个元素应用一个函数进行计算,讲一个列表映射为另一个列表。
<表达式> for <变量> in <列表>
或
<表达式> for <变量> in <列表> if<条件>
1、简单的列表解析
t = [x for x in range(1,5)]
print(t) #结果为[1,2,3,4]
t = [x**2 for x in range(1,5)]
print(t) #结果为[1,4,9,16]
2、两次循环
t = [x for x in range(1,5)]
s = [y for y in range(5,8)]
print([x*y for x in t for y in s])
3、还有其他一些列表解析方法,如遍历对角线、乘法、等等,
这方面其实可以去使用一些Python的库,如numpy等等,这些库都对于解决矩阵问题是更好的选择
栈是一种特殊的线性表,它限定插入和删除数据元素的操作只能在线性表的一端进行。栈的这种特性是“后进先出”。在栈中,插入操作称为入栈,删除操作称为出栈。
1、使用insert()和pop()的方法模拟堆栈
s =[]
s.insert(0,'a')
s.insert(0,'b')
s.insert(0,'c')
print(s)
print(s.pop(0)) #删除列表第一个元素
print(s.pop(0)) #继续删除列表第一个元素
2、用append()和pop()方法模拟堆栈
s=[]
s.append('a')
s.append('b')
s.append('c')
print(s)
print(s.pop(), end = ' ')
print(s.pop(), end = ' ')
队列也是一种特殊的线性表,它限定插入和删除数据元素的操作分别在线性表的两端进行。其中,插入元素的一端称为队头,删除元素的一端称为队尾。队列的操作特性是先进先出,在队列中,插入操作称为入队,删除操作称为出队。
元组与列表类似,也是元素的有序序列,元组与列表的区别:元组存储的值不能被修改,即这些数据值是不可改变的。元组中没有append()、extend()、insert()
元组的定义通常是由逗号分隔,或者由圆柱括号括住的一个序列。列表是用方括号括住
例如:
t1 = ('Months','Years',1997,2000) #圆括号包围多个用逗号分隔的元素
t2 = (1,2,3,4,5)
t3 = 'a','b','c' #多个用逗号分隔的元素,输出时自动带上圆括号
注意:
(1)元组中数据类型可以不同
(2)t=()表示创建一个空元组,而不是表达式
(3)创建只有一个元素的元组时,语句的末尾要加逗号
(4)可以使用tuple()函数把一个列表转换为元组
@2元组的访问和切片
同列表,可以单个索引。得到索引位置的元素,但是只能只读不可修改
@3元组操作符
+、-、in、 not in等等
@4删除整个元组
元素不可修改,但可以del删除整个元组
@5元组的函数与方法
对象是一个可以存储数据并且具有数据操作方法的实体
4.3字典
Python中的字典是另一种可变容器,且可存储任意类型的对象,如字符串、数字、元组等其他对象。字典是Python最强大的数据类型结构之一。
字典中的每个数据称为相,由两个部分构成:一部分称作值,存储有效数据;另一部分称作键,可以对数据进行索引,并且仅能被关联到一个特定的值,因此字典也被称为健/值对。
字典是Python语言中唯一的映射类型。映射关系中,哈希值(键,key)和指向的对象(值,value)是一对一的关系
4.3.1创建和使用字典
@1创建字典
字典名={健1:值1,健2:值2,...,健n:值n}
字典是用大括号括住的键值对的集合。字典的数据类型为dict
键与值均可为任意类型数据类型
注意:
(1)键与值之间用冒号隔开,项与项之间用逗号隔开
(2)键必须唯一,值可以不唯一
(3)键必须是一个不可变对象,即键可以是字符串、数值、元组,但不能是列表
(4)如果字典中的值为数字,最好使用字符串数字形式,例如,使用'no':'0040'而不是'no':0040
例:
d1 = {1:'Monday',2:'tuesday',3:'wednesday',4:'Thursday',5:'Friday',6:'Saturday',7:'Sunday'}
@2字典的访问
<格式1>字典对象名[键]
注意:
(1)用一个不存的键进行索引,会产生KeyError异常
(2)注意大小写
(3)只能通过键来访问字典,不能通过数字索引,因为字典中的存储是无序的
例:
d1 = {'Name':'John', 'Age':17, 'Class':'A01'}
print('d1[\'Name\'] :{}'.format(d1['Name']))
<格式2>为避免出现因键不存在而产生的异常,使用get()方法来访问
语法如下:
字典对象名.get(键,[键不存在时的提示信息])
d1 = {'Name':'John','Age':17,'Class':'A01'}
print(d1.get('Age'))
print(d1.get('Idno')) #输出结果为:None
@3添加字典元素
通过赋值语句添加一个新的键值对
语法格式为:
字典对象名[新键] = 新值
例:
d1 = {'Name':'John', 'Age':17, 'Class':'A01'}
d1['School'] = 'First Middle School'
print(d1)
@4修改字典元素
通过赋值语句修改已有的键值对
例如:
d1 = {'Name':'John', 'Age':17, 'Class':'A01'}
d1['Age'] = 18
print(d1) #输出结果中年龄变为18
@5删除字典元素或字典
使用del语句来删除字典中的一个元素或者整个字典
语法格式1:
del 字典对象名[键] #键所在的项
语法格式2:
del 字典名 #删除整个字典
语法格式3:
字典对象名.clear()
@6检测字典中是否存在键
用 in 或者 not in 可以检测某个键中是否在字典中
语法格式1:
键 in 字典对象名 #输出结果是True或者False
语法格式2:
键 not in 字典对象名 #输出结果是True或者False
例:
d1 = {'Name':'John', 'Age':17, 'Class':'A01'}
print('Name' in d1)
print('Name' not in d1)
集合是Python的一种数据类型。集合是一个无序不重复元素集,其基本功能包括关系测试和消除重复元素。集合对象还支持并、交、差、对称等操作。
@1创建集合
由于集合没有自己的语法格式,只能通过集合的工厂方法set()和frozenset()创建。
(1)s1 = set('chocolate')
print(s1) #结果是{'c', 't', 'h', 'l', 'e', 'a', 'o'}
(2)s1 = {'yohoo','hihi'}
print(s1) #结果是{'yohoo','hihi'}
(3)用字典创建一个集合,集合的元素是字典的键
d1 = {'1':'one','2':'two','3':'three'}
print(set(d1)) #输出{'2','3','1'},不过,其中键的顺序是随机的
(4)用列表创建一个集合,集合的元素是列表中不重复的元素
l1 = [1,3,4,2,4,2,1,,6,7]
print(set(l1)) #输出{1,2,3,4,6,7} 从小到大排序,且不重复
@2访问集合
@3集合中添加元素
(1)add()
集合对象名.add(元素)
(2)update()
集合对象名.update()
@4删除集合元素
(1)renmove()
集合对象名.remove([要删除的集合元素])
(2)discard()
集合对象名.discard([要删除的集合元素])
(3)pop()
集合对象名.pop()
随机删除一个元素,并返回该元素
4.4.2集合运算
例程如下:
s1 = set([1, 2, 3, 4, 5])
s2 = set([1,3])
Python的集合运算符
集合运算符 操作 实例
- 差 s1-s2
& 交 s1&s2
| 并 s1|s2
!=
==
in
not in