首页 > 代码库 > 计算机科学及编程导论(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. 伪代码

伪代码用于描述解题步骤

用伪代码来描述求直接三角形斜边长度的步骤:

  1. 输入底的值 -> b(浮点型)
  2. 输入高的值 -> h(浮点型)
  3. 求(b*b + h*h)的平方根 -> hyp(浮点型)
  4. 打印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.代码运行效率

 尽管现在的计算机性能提升了很多,但是问题的复杂度提升的更快。所以需要提高代码的运行效率,学习目标有两个:

  1. 学会选择不同的算法
  2. 学会讲碰到的问题归类到某一类算法中

首先,来认识效率,主要通过两个维度来认识:时间和空间

空间:占用多少内存

时间:程序的运行时间

判断时间的最简单方式,就是直接运行程序,不过这也是最愚蠢的方式。因为时间不仅取决与算法的好坏,而且还取决于问题输入规模的大小以及机器的性能,并且和编程语言本身也有关系。

我们将在下一讲继续讨论这个话题。