首页 > 代码库 > 计算机科学及编程导论(7)数组及可变性、字典、伪代码,代码运行效率简介
计算机科学及编程导论(7)数组及可变性、字典、伪代码,代码运行效率简介
1. 数组及可变性
当创建一个数组的时候,它将与一个对象进行绑定
L1 = [1, 2, 3]
L2 = L1
L1[0] = 4
print(L2)#=》[4, 2, 3]
L2 = L1 意味着L2与L1指向同一个对象,而L1[0]=4则改变了对象的值,所以最终L2的值也会改变,可以与下面这个例子进行比较
a = 1 #a指向对象1
b = a #b指向对象a
a = 4 #此时a指向了对象4
print(b) #=》1,由于b依旧指向对象1,所以没有发生变化
2.字典
字典包括了以下几个基本特性:
字典:
- 可变的(与数组一样)
- 字典里的元素是无序的(数组的元素是有序的),所以无法通过下标来获取元素
- 通过索引来获取元素 <key,value>
也就是说,只能通过key值来获取元素:
# 字典元素的获取
EtoF = {‘one‘: ‘un‘, ‘soccer‘: ‘football‘}
EtoF[‘soccer‘] #=》‘football‘
EtoF[0] #=>wrong
EtoF #=> {‘one‘: ‘un‘, ‘soccer‘: ‘football‘}
一次性获取所有的key值
# 获取key值
NtoS = {1: ‘one‘, 2: ‘two‘, ‘one‘: 1, ‘two‘: 2}
NtoS.keys() #=》dict_keys([‘two‘, 1, 2, ‘one‘])
#删除key值为one的成员
del NtoS[‘one‘]
NtoS #=》{‘two‘: 2, 1: ‘one‘, 2: ‘two‘}
字典的效率很高,因为使用了散列法的算法,使得我们可以在线性时间内检索成员。也就是说,即使字典的元素变得很多,也不会影响效率。
3. 伪代码
伪代码用于描述解题步骤
用伪代码来描述求直接三角形斜边长度的步骤:
- 输入底的值 -> b(浮点型)
- 输入高的值 -> h(浮点型)
- 求(b*b + h*h)的平方根 -> hyp(浮点型)
- 打印hyp的值
从上面的例子,可以得出伪代码的一些特点:
模块化。
需要的值的基本信息。比如b和h都为浮点型
控制流。上面的代码具有先后顺序
抽象。上面没有特地去提如何求平方根
代码实现
import math
#Get base
inputOK = False
while not inputOK: #if inputOk == False
base = input(‘Enter base: ‘)
if type(base) == type(1.0):
inputOK = True
else:
print(‘Error. Base must be floating point number.‘)
#Get Height
inputOK = False
while not inputOK:
height = input(‘Enter height: ‘)
if type(height) == type(1.0):
inputOK = True
else:
print(‘Error. Height must be floating point number.‘)
hyp = math.sqrt(base*base + height*height)
print(‘Base: ‘+str(base)+‘,height: ‘+str(height)+‘, hyp: ‘+
str(hyp))
这里要说明的是,最新版的python的input会将用户的输入转化为字符串类型,而2.X版本则会保持用户输入时的类型,所以上述算法不适用于最新版。
当然,可以讲上述判断输入是否合法的代码重新用函数编写
#判断输入数据是否合法
def getFloat(requestMsg, errorMsg):
inputOK = False
while not inputOK:
val = input(requestMsg)
if type(val) == type(1.0): inputOK = True
else: print(errorMsg)
return val
base = getFloat(‘Enter base: ‘, ‘Error: base must be a float‘)
height = getFloat(‘Enter height: ‘, ‘Error: height must be a
float‘)
将功能和具体实现分离开来。
要养成下面的习惯:
先使用伪代码去解决问题。
4.代码运行效率
尽管现在的计算机性能提升了很多,但是问题的复杂度提升的更快。所以需要提高代码的运行效率,学习目标有两个:
- 学会选择不同的算法
- 学会讲碰到的问题归类到某一类算法中
首先,来认识效率,主要通过两个维度来认识:时间和空间
空间:占用多少内存
时间:程序的运行时间
判断时间的最简单方式,就是直接运行程序,不过这也是最愚蠢的方式。因为时间不仅取决与算法的好坏,而且还取决于问题输入规模的大小以及机器的性能,并且和编程语言本身也有关系。
我们将在下一讲继续讨论这个话题。