本系列Python算法学习博文,基于《Python算法详解-张玲玲》一书,编译环境为IDLE(Python 3.7 64-bit)。
博主系统计学方向,在学习Python算法之前,已经掌握了Python编程基础、Python数据挖掘与分析等知识。
一、算法简介
1.1、算法含义
算法是程序的灵魂,只有掌握了算法,才能轻松地驾驭程序开发。算法能够引导开发者在面对一个项目功能时用什么思路去实现,有了这个思路后,编程工作只需要遵循这个思路去实现即可。
算法是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
1.2、算法的特征
算法特征包括有:有穷性、确切性、输入、输出、可行性。
- 有穷性:保证执行有限步骤之后结束。
- 确切性:每一步都有确切的定义。
- 输入:每个算法有0个或者多个输入,以用来刻画运算对象的初始情况。0个输入是指算法本身舍弃了初始条件。
- 输出:每一个算法有一个或者多个输出,显示对输入数据加工后的结果,没有输出的算法是无意义的。
- 可行性:原则上算法能够精确地运行,进行有限次运算后即可完成一种运算。
1.3、算法的表现形式
算法的表现形式有:流程图、N-S图、计算机语言。
- 流程图
流程图包含有五种标识、三种结构。五种标识分别为:起/止、输入/输出、判断、处理、流程,如图1。三种结构为:顺寻结构、选择结构、循环结构,如图2。
- N-S图
N-S图相对于传统流程图,省略了流程线,把整个程序写在一个大框图内,如图3。
- 计算机语言
例如
#项目:计算数组元素与均值离差
list_1 = [1,3,8,11,32]
mean = sum(list_1)/len(list_1)
list_2 = list()
for i in list_1:
s = i - mean
list_2.append(s)
print(list_2)
#输出结果:[-10.0, -8.0, -3.0, 0.0, 21.0]
编程是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。作为一名统计方向的学习者,编程是一项增益技能,借助编程能有助于统计研究。
二、数据结构
数据结构主要介绍:列表、元组、字典。
数据结构的学习有利于在编程过程中存储、转换使用数据。数据结构属于Python程序设计基础知识,在本文中只做简单介绍。
2.1、列表的基本使用方法
#列表的基本使用方法
list_1 = list() #定义一个名为list_1的空列表
print(list_1)
#输出:[]
print(type(list_1))#查看list_1的变量类型
#输出:<class 'list'>
list_2 = [] #定义一个空列表的另一种方法
print(list_2)
#输出:[]
list_3 = list([100,200,300,400,500]) #定义一个包含元素的列表
print(list_3) #打印list_3的结果
#输出:[1, 2, 3, 4, 5]
print(list_3[2])#打印list_3中的第三个元素
#输出:300
'''
列表的索引
list_3[0]表示list_3列表中的第一个元素
list_3[1]表示list_3中的第二元素
依此类推,若超出范围则会报错
list_3[-1]表示list_3列表中的最后一个元素
依次类推,超出范围则报错
也由此可见,列表中的元素是一个有序的数组
'''
print(list_3[1:4])#打印以list_3[1]开始的4-1=3个元素
#输出:[200, 300, 400]
此外还可以删除列表中重复的元素并保持顺序不变、找到列表中最多的元素、使用列表推导式、命名切片等等。
2.2、元组的简单使用方法
Python编程中,可以将元组看作一种特殊的列表,其与列表不同的是元组内的元素不能发生变化,不能添加和删除元素 。
#元组的简单使用方法
tup_1 = tuple() #定义一个名为tup_1的空元组
tup_2 = ('baidu','中国','123','---') #定义一个元组
tup_3 = (1.1,2,3,4.3,5)#注意与tup_2定义的元素不同
'''
tup_1也可以定义为:tup_1 = ()
tup_2中的元素为字符串
tup_3中的元素为整数、浮点型
'''
print("这是空元组:",tup_1)
print('这是包括字符串的元组:',tup_2)
print("这是包含数字型元素的元组:",tup_3)
print(type(tup_1)) #查看变量类型
'''
输出:
这是空元组: ()
这是包括字符串的元组: ('baidu', '中国', '123', '---')
这是包含数字型元素的元组: (1.1, 2, 3, 4.3, 5)
<class 'tuple'>
'''
print(tup_2[1])#查看tup_2中的第2个元素,序号从0开始
print(tup_3[1:4])#切片,同列表原理一致
'''
输出:
中国
(2, 3, 4.3)
'''
tup_4 = tup_2 + tup_3 #元组拼接为一个新的元组
print(tup_4)
#输出:('baidu', '中国', '123', '---', 1.1, 2, 3, 4.3, 5)
del tup_4 #删除元组tup_4,其后无法再将tup_4打印出来
此外还可以使用内置方法操作元组、将序列分解为单独的变量、实现优先级队列等。
2.3、字典的基本使用方法
字典是一种比较特别的数据类型,字典中的每个成员以"键:值"对的形式成对出现。字典以大括号{}包围,并以“键:值”对的方式声明存在的数据集合。字典与列表相比,最大的不同在于字典是无序的,其成员(元素)的位置是象征性的,在字典中通过键来访问成员,而不能通过位置来访问,也不能通过值来访问。这就好比我们设置QQ号,QQ号和密码是一一对应的,不同用户的QQ号不能相同,但密码可以相同,并且我们可以通过账号找回密码。
#字典的基本使用方法
dic_1 = dict() #定义空列表方式1
dic_2 = {} #定义空字典方式2
print(dic_1,dic_2)
#输出:{} {}
print(type(dic_1)) #查看dic_1的类型
#输出:<class 'dict'>
dic_3 = {'苹果':'apple','张三':'78分','博主':'帅哥'}#定义一个包含键值对的字典
print(dic_3['苹果'])#查找‘苹果’这个键对应的值
#输出:apple
dic_3['abcd'] = 'ABCD'#在字典dic_3中添加{"abcd":"ABCD"}键值对
print(dic_3)
#输出:{'苹果': 'apple', '张三': '78分', '博主': '帅哥', 'abcd': 'ABCD'}
dic_3['张三'] = '100' #键‘张三’原本已经存在字典中,重新赋值100,修改键值
print(dic_3)
#输出:{'苹果': 'apple', '张三': '100', '博主': '帅哥', 'abcd': 'ABCD'}
del dic_3['博主']#删除字典中{“博主”:“帅哥”}这一对键值对
print(dic_3)
#输出:{'苹果': 'apple', '张三': '100', 'abcd': 'ABCD'}
此外还可以用字典映射多个值、使用OrderedDict创建有序字典、获取字典中最大值最小值、获取两个字典中相同的键值对、使用itemgetter()对字典排序、使用字典推导式等。
三、小结
最后,本文简单介绍了算法的含义以及数据结构的三种类型,并用代码进行演示。算法是一系列解决问题的清晰指示,数据结构的作用是保存项目中的数据信息。Python 内置了许多数据结构,需要对每一种数据结构一一学习,这对后续学习十分重要。