2.2 计算机记性好
P42
3. 序列
序列是有顺序的数据集合。序列包含的一个数据被称为序列的一个元素(element)。序列可以包含一个或多个元素,也可以是完全没有任何元素的空序列。
-
元祖(Tuple)
一旦建立,元祖的各个元素不可再改变。元祖看起来就像一种特殊的表,有固定的数据。元祖也被翻译为“定值表”。
example_tuple = (2, 1.3, "love", 5.6, 9, 12, False) # 一个元祖 type(example_tuple) # 结果为tuple
-
列表(List)
建立后,列表的元素可以变更。
example_list = [True, 5, "smile"] # 一个列表 type(example_list) # 结果为'list'
同一个序列可以包含不同类型的元素
序列的元素不仅可以是基本类型的数据,还可以是另外一个序列。
nest_list = [1, [3, 4, 5]] # 列表中嵌套另一个列表
由于元祖不能改变数据,使用很少会建立一个空的元祖。而列表可以增加和修改元素,所以Python程序中经常会建立空表:
empty_list = []
元祖一旦建立就不能改变,所以不能对元祖进行赋值操作
序列名[下限:上限:步长]
引用的多个元素将成为一个新的序列
example_tuple[:5] # 从下标0到下标4,不包括下标5的元素
example_tuple[2:] # 从下标2到最后一个元素
exampe_tuple[0:5:2] # 下标为0, 2, 4的元素
sliced = example_tuple[2:0:-1] # 从下标2到下标1
type(sliced) # 范围引用的结果还是一个元祖
在范围引用的时候,如果写明上限,那么这个上限下标指向的元素将不包括在结果中。
引用序列尾部的元素:
example_tuple[-1] # 序列最后一个元素
example_tuple[-3] # 序列倒数第三个元素
example_tuple[1:-1] # 序列的第二个到倒数第二个元素
example_tuple[1:-1]这个例子,如果是范围引用,那么上限元素将不包含在结果中。
序列可以有序地存储一组数据。
interest_tuple = (0.01, 0.02, 0.03, 0.035, 0.05)
4. 词典
词典不是以位置作为索引。词典允许用自定义的方式来建立数据的索引:
example_dict = {"tom":11, "sam":57, "lily":100}
type(example_dict)
词典包含多个元素,每个元素以逗号分隔。词典的元素包含两部分,键(Key)和值(Value)。键是数据的索引,值是数据本身。键和值一一对应。比如上面的例子,"tom"对应11,"sam"对应57,"lily"对应100。由于键值之间一一对应关系,所有词典的元素可以通过键来引用。
example_dit["tom"]
在词典中修改或增添一个元素的值:
example_dit["tom"] = 30
example_dit["lilei"] = 99
example_dit # 结果为
构建一个新的空的词典:
example_dict = {}
example_dict # 结果为{}
词典不具备序列那样的连续和有序性,所以适合存储结构松散的一组数据。比如首付比例和税率可以存在同一词典中:
rate = {"premium": 0.2, "tax": 0.15}
在大部分应用场景中,我们都使用字符串来作为词典的键。但其他类型的数据,如数字和布尔值,也可以作为词典的键值。
计算机能循环
1. for循环
for a in [3,4.4,"life"]:
print(a) # 依次打印列表中的各个元素
这个循环就是每次从列表[3, 4.4, “life”]中取出一个元素,然后将这个元素赋值给a,之后执行隶属于for的程序,也就是调用print()函数,把这个元素打印出来。可以看到for的一个基本用法是在in后面跟一个序列:
for 元素 in 序列:
statement
序列中的元素个数决定了循环重复的次数。实例中有3个元素,所以print()会执行3次。也就是说,for循环的重复次数是确定的。for循环会依次从序列中取出元素,赋予给紧跟在for后面的变量,也就是上面实例中的a。因此,尽管执行的语句都相同,但由于数据发生了变化,所以相同的语句在三次执行后的效果也会发生变化。
从序列中取出元素,再赋予给一个变量并在隶属程序中使用,是for循环的一个便利之处。
但是有的时候,我们只是想简单地重复特定的次数,不想建立序列,那么我们可以使用Python提供的range()函数:
for i in range(5):
print("Hello World!") # 打印5次“Hello World!”
程序中的5向range()函数说明了需要重复的次数。因此,隶属于for的程序执行了5次。这里,for循环后面依然有一个变量i,它为每次循环起到了计数的功能:
for i in range(5):
print(i, "Hello World!") # 打印序号和"Hello World!"
range()提供的计数也是从0开始的,和表的下标一样。print()的新用法,就是在括号中说明多个变量,用逗号分开。函数print()会把它们都打印出来。
2. while循环
i = 0
while i < 10:
print(i)
i = i + 1 # 从0打印到9
while后面紧跟着一个条件。如果条件为真,则while会不停地循环隶属于它的语句。只有条件为假时,程序才会停止。在while的隶属程序中,我们不断改变参与条件判断的变量i,直到它变成10,以至于不满足条件而终止循环。这是while循环常见的做法。否则,如果while的条件始终为真,则会变成无限循环。
很多图形程序中就有无限循环,用于检查页面的状态等。
while True:
print("Hello World!")
3. 跳过或终止
循环结构还提供了两个有用的语句,可以在循环结构内部使用,用于跳过或终止循环。
continue # 跳过循环的这一次执行,进行下一次的循环操作
break # 停止执行整个循环
for i in range(10):
if i == 2
continue
print(i)
当循环执行到i为2的时候,if条件成立,触发continue,不打印此时的i,程序直接进行下一次循环,把3赋值给i,继续执行for的隶属语句。
continue只是跳过某次循环,而break会中止整个循环。
for i in range(10):
if i == 2:
break
print(i)
当循环执行到i=2的时候,if条件成立,触发break,整个循环停止。程序不再执行for循环内部的语句。
假设我可以全额贷款买房。房子的总价为50 万。为了吸引购房者,房贷前四年利率有折扣,分别1% 、2% 、3%、3.5% 。其余的年份里,房贷的年利率都是5% 。我逐年还款,每次最多偿还3 万元。那么,完全还清房款最少需要多少年?
i = 0
residual = 500000
interest_tuple = (0.01, 0.02, 0.03, 0.035)
repay = 30000
while residual > 0:
i = i + 1
print("第", i, "年还是要还钱")
if i <= 4:
interest = interest_tuple[i - 1]
else:
interest = 0.05
residual = residual * (interest + 1) - repay
print("第", i+1, "年终于还完了")
附录B 代码规范
-
在下列运算符的前后各保留一个空格:
= + - > == >= < <= and or not
-
下列运算符的前后不用保留空格:
* / **
-
如果有多行赋值,那么将上下的赋值号=对齐,比如:
num = 1 secNum = 2
-
变量的所有字母小写,单词之间用下划线连接
example_number = 10