编程语言基础
序列
封装一组有序号的数据。
通过本节课,你将理解:
#goal从一组数据中看到变化的趋势
#hook要判断全球气温是否在变暖,单看某一年的读数往往不够,因为变暖是一个趋势,需要连年进行测量,分析其趋势才能得到有意义的结论。
下图是 NASA GISS 给出的全球年平均气温距平(相对 1951–1980 年基准,单位 ℃)。把 2016 到 2025 这十年排成一列,就能从图中得到一些有用的信息:2023之后的气温确实有明显的升高。
在Python中,使用方括号[]和逗号,,可以把若干相关的值收纳在一起成为一个整体,称作列表。
# 使用使用方括号`[]`和逗号`,`来定义列表
temps = [18.2, 19.0, 17.5, 20.1]
print(temps)在上面的代码中18.2、19.0、17.5、20.1 四个值被定义为了一个列表,并赋值给了 temps 变量。
使用len() 可以获取 temps 列表的长度,也就是其中有多少个值。
temps = [18.2, 19.0, 17.5, 20.1]
print(temps)
print(len(temps))类似len()这样的,对数组整体的运算,称作聚合运算,常常用于进行统计分析。
常用的聚合运算还有:
temps = [18.2, 19.0, 17.5, 20.1]
print(max(temps)) # 求最大值
print(min(temps)) # 求最小值
print(sum(temps)) # 求总和组合这些基本运算,还可以进行更复杂的统计,比如下面的代码可以求去平均值:
# 求平均值
temps = [18.2, 19.0, 17.5, 20.1]
avg = sum(temps) / len(temps) # 所有值的总和除以总个数,就是求平均值
print(avg) 除了将列表视为一个整体,我们也可以按需查看列表中的某一个或某一片数据,为此我们需要先了解如何在列表中定位数据。
在列表中,各个数据的位置称为索引,并用一个整数表示。比如:整数 0 就表示左起第一个位置的数据,写作temps[0]。类似的,temps[3]
temps = [18.2, 19.0, 17.5, 20.1]
print(temps[0]) # 左起第一个位置的数据18.2
print(temps[3]) # 左起第四个位置的数据20.1从
0开始计数好,还是从1开始计数好,众说纷纭没有定论,只能说各有优劣,但从0开始计数确实是大部分编程语言所采用的计数习惯。从0开始计数,虽然不符合日常的习惯,但是可以简化某些特殊情况下的运算过程。 比如我们计算楼层之间的距离,从1层到2层算法是2-1=1,但是从1层到-1层,同样的算法1-(-1)=2却无法获得正确的结果。
索引的值也可以是负数,表示从右起第几个数,比如temps[-1],就是表示右起第一个数。
temps = [18.2, 19.0, 17.5, 20.1]
print(temps[-1]) # 右起第一个位置的数据20.1
print(temps[-3]) # 右起第三个位置的数据19.0显然,无法从
-0开始计数,因为-0与0是同一个数。
如果使用的索引大于列表的长度会发生越界异常,意思为请求超过了边界。比如对一个长度为4的列表区,请求第5个数据就会出错。
temps = [18.2, 19.0, 17.5, 20.1]
print(len(temps)) # 列表的长度为4
print(temps[4]) # 获取第5个元素时会报错为了避免在说第n个数据时造成误会或异常,我们在之后将称呼为位于索引n的数据,或者简称索引n,以保证我们所说的与代码中的数字保持一致。
除了获取列表中的单个元素,还可以获取一个范围的片段,称之为切片。
比如 temps[1:3] 表示从索引1到索引3的切片,与range()类似,这是区间时前闭后开的,含1不含3,于是会得到 [19.0, 17.5]
temps = [18.2, 19.0, 17.5, 20.1]
print(temps[1:3]) # 从索引1到索引3的切片当然,在切片时也可以使用负数,这在某些需要进行掐头去尾的操作时候很方便。比如 temps[1:-1] 表示从索引1到索引-1的切片,同样不包含-1,将会得到 [19.0, 17.5]
temps = [18.2, 19.0, 17.5, 20.1]
print(temps[1:-1]) # 从索引1到索引-1的切片如果需要表示从头开始或一直到最后,也可以省略写出具体的索引。比如 temps[:2] 表示从开始到索引2的切片,temps[1:] 表示从索引1直到结束的切片
temps = [18.2, 19.0, 17.5, 20.1]
print(temps[:2]) # 从开始到索引2的切片
print(temps[1:]) # 从索引1直到结束的切片与range()类似,切片时也可以设定步长,让我们可以跳着挑选一些值。比如 temps[0:3:2] 表示从开始到索引3,每2个取一个数的切片。
temps = [18.2, 19.0, 17.5, 20.1]
print(temps[0:3:2]) # 从索引0到索引3,每2个取1个的切片
print(temps[::2]) # 省略0和3,不影响输出进行切片时同样要避免越界异常,不再赘述。
利用索引或切片,还可以对列表中的数据值进行修改。
temps = [18.2, 19.0, 17.5, 20.1]
temps[3] = 19.3 # 将索引3位置的数据改为19.3
temps[0:2] = [18.1, 20.4] # 将切片位置0到2的数据改为18.1和20.4
print(temps)利用列表的remove()、append()和insert()的指令还可以删除特定数值、在列表末尾增加数据或在指定索引处增加一个数据,从而改变列表的长度。
temps = [18.2, 19.0, 17.5, 20.1]
temps.remove(19.0) # 删除从左起遇到的第一个19.0
print(temps)
temps.append(16.3) # 在列表的最后增加一个数字16.3
print(temps)
temps.insert(0, 20.0) # 在列表索引0的位置上插入一个数字20.0,在索引0之后的所有数据向后移动一位
print(temps)元组与列表非常相似,使用圆括号()和逗号,,同样可以把若干相关的值收纳在一起成为一个整体,与列表不同的是它一旦被定义就不能再被修改。
比如在三维坐标系下描述一个位置,有且只有三个分量:x、y、z,且该位置的分量值是不能被修改的,否则就变成另一个位置了。
point = (3.0, 4.0, 5.0)
print(point[1], len(point))
# point[0] = 9.0 # TypeError:元组不允许项赋值
# point.append(1.0) # 元组无法 append相对列表,元组的出场机会确实不多,主要用于一些语法技巧,不再赘述。
不论是列表还是元组,都可以使用for...in...对其进行遍历,即依次的获取其中的每一个数值,从而实现更加复杂的计算。
# 求几何平均数
temps = [18.2, 19.0, 17.5, 20.1]
prod = 1
for i in temps:
prod *= i
avg_geo = prod ** (1/len(temps))
print(avg_geo)# 求与原点的欧氏距离
point = (3.0, 4.0, 5.0)
dist = 0
for i in point:
dist += i**2
print(dist)本节练习:雨量与经纬度
#practice在 在线 IDE 里用列表记下三天雨量 [12.0, 0.0, 8.5](毫米),再 append 第四天 3.2。打印第一天,应为 12.0;打印下标 1 到 3 之前的切片,应为 0.0 与 8.5;追加后的长度应为 4。另用元组 (116.4, 39.9) 表示测站经纬度,拆开打印后尝试把第一项改成 120.0,阅读报错。用一句话注释说明:雨量还会增加,经纬度的两项角色已经固定。
本节要点
#review- 列表把一组值收成整体。
len、max、min、sum是对整列的聚合;平均值是总和除以长度。 - 索引用整数定位:
0是左起第一项,负数从右端数。索引达到长度就会越界。 - 切片前闭后开,端点可以省略,第三个数是步长。
- 列表可按索引或切片改写;
append、insert、remove会改变长度。 - 元组定义之后不能改写,也不能追加。它仍可索引、求长度,并用
for依次遍历。
单选题
对整列做聚合
readings = [2, 4, 6]。sum(readings) / len(readings) 的结果是?
单选题
从右端数的索引
vals = [8, 6, 4, 2]。vals[-1] 与 vals[-3] 分别是?
单选题
切片与步长
data = [10, 20, 30, 40, 50]。data[0:5:2] 取出的是?
单选题
索引越界
nums = [3, 1, 4],长度为 3。执行 print(nums[3]) 会怎样?
单选题
元组还能做什么
point = (1.0, 2.0)。下面哪一项可以执行?
未登录时不会保存学习进度