第二节 字典

本文来自于疯子们的开源图书


字典是存储多个相同类型值的容器。每个值用一个唯一的键进行标识,这个键就是字典中的标示符。与数组中的元素不同,字典中的元素没有固定的顺序。当你想在字典中查询某个值的时候,可以根据他们的键来进行查询,这点跟现实中在字典上查询某个单词很类似的。

Swift中字典所能存储的键值都是非常明确的。与Objective-C中的NSDictionaryNSMutableDictionary不同,他们可以使用任何类型的对象作为键和值,而且没有提供关于这些对象类型的信息。在Swift中,某个字典类型所能存储的键和值的类型是非常明确的,要么通过类型注解,要么就是通过类型推断来明确的声明一下。

Swift的字典类型可以写作Dictionary<KeyType,ValueType>,其中KeyType是键的类型,ValueType是值的类型。

KeyType的唯一限制就是必须可以作为哈希值的,也就是说,它的值必须的是唯一的。所有Swift的基本类型(String,Int,Double,Bool)默认都是可以作为哈希值的,因此都可以作为字典的键。枚举类型的成员也是默认可以作为哈希值的。

字典

你可以使用一个字典值来初始化一个字典,语法跟之前的初始化数组是类似的。字典值是创建具有一个或者多个键值对的字典的快捷方式。

一个键值对是一个键和值的组合。在字典值当中,每个键值对都是使用分号来分隔键和值的。这些键值对可以写作一个列表,使用方括号包裹起来,用逗号分隔开来。

下面的例子创建了一个字典来存储国际机场的名字。这个字典中,键是三个字母的国际航空运输协会编码,值是 机场的名字:

上面的airports字典声明的类型为:Dictionary<String ,String>,表示一个键是String类型,值为StringDictionary类型。

注意:

airports声明的时候,使用的是var(变量),而不是let(常量),因为之后更多的机场会加到这个字典中的。

airports使用了两个键值对来进行初始化的。第一个键值对的键为TYO,值为Tokyo.第二个键值对的键为DUB,值为Dublin.

这个字典值包含两个String:String对。符合airports变量声明(键为String ,值为String)的类型,所以上面给airports字典初始化的语句是合法的。

就像数组一样,如果使用键和值类型一致的字典值来初始化字典的话,就没有必要指明字典的类型了。airports的初始化过程可以简写为:

由于字典值中的的键都是同样类型的,值也是同样类型的,因此Swift可以推断出airport的类型为Dictionary<String,String>.

字典的访问与修改

可以通过字典的方法,属性,或者使用下标来访问和修改一个字典。像数组一样,可以通过只读属性count来查看Dictionary中的元素个数.

可以使用下标来给字典添加一个新元素。使用一个适当类型的键值作为小标,并赋予一个适当类型的新值。

也可以通过下标来改变某个键对应的值。

除了下标之外,也可以使用updateValue(forKey:)来设置或者更新某个键的值。就像上面的使用下标的例子,如果某个键的值不存在,updateValue(forKey:)会设置值,否则的话,更新该值。与下标不同,updateValue(forKey:)在更新完成之后,会返回更新之前的值。这可以使你能够判断是否真的更新了。

updateValue(forKey:)方法返回的是一个可选类型。例如,一个值为String的字典,该方法返回的就是String?.如果有值的话,就是键对应的值。否则的话,返回的时nil.

也可以通过下标从字典中获取某个键对应的值。同上面的一样,返回的也是一个可选类型

可以使用下标从字典中移除某个键值对,只需要将那个键对应的值置为nil即可:

此外,可以使用removeValueForKey移除一个键值对。如果键值对存在的话,移除之后返回被移除的值,否则返回nil.

字典的遍历

可以使用for-in循环来遍历字典的键值对。字典中的元素作为(key,value)来返回。在循环当中,可以将键值对分解成两个临时的变量或者常量。

关于for-in 循环,可以参考For循环

也可以通过字典的keysvalues属性单独遍历它的键或者值。

可以使用Array()方法,将字典的keys或者values初始化为一个数组:

注意:

Swift的Dictionary类型是一个无序集合,在遍历一个字典的时候,取出的键,值,键值对的书序是随机的。

创建一个空字典

就像数组一样,可以使用构造器来创建一个具有某种类型的空Dictionary

这个例子创建了一个空的字典,类型为(Int,String),来存储整数及其易于阅读的名字。键是Int类型的,值是String类型的。

如果上下文已经提供了类型信息的话,就可以用空字典值来创建一个空字典,写作[:]

注意:

底层,Swift的数组和字典类型都是作为泛型来实现。更多关于泛型,参见泛型

集合的可变性

数组和集合都可以在单一集合中存储多个值。如果你创建一个数组或者集合,并把它赋给一个变量,那么这个集合就是可变的,意味值你可以添加更多的元素来改变集合的大小,移除已经存在的集合。相反,如果将集合赋给一个常量,那么集合就是不可变的,大小也不能改变。

对于字典来说,不可变指的是你不能修改某个键的值。不可变字典的值一旦设置,就不能再改变了。

对于数组来说,不可变的含义稍微有点差别。你仍然不能执行任何有可能改变数组大小的操作。但是你可以改变数组中某个位置的值。在数组大小固定的情况下,可以使得Array类型的操作获得最优秀的性能。

Array类型的可变性也影响到了数组实例的赋值和修改。更多信息,可以参考集合类型的赋值和拷贝

注意:

在集合大小不需要改变的情况时,最好创建不可变的集合。这有助于编译器优化你创建集合的性能。


<think>我们正在设计第二节课的教学内容,需要基于第一节课(基础语法、数据类型、输入输出、简单运算)进行拓展。 第二节课可以包含:列表(list)、字典(dict)、条件语句、循环语句等基础内容,同时可以引入一些简单的实际应用案例。 根据用户意图,我们需要进行网络搜索,获取关于Python第二课教学的相关资料,然后整合成教学内容。 搜索关键词可能包括: "Python第二课教学" "Python列表字典教学" "Python条件循环教学" "Python入门第二课" 注意:我们不需要安装部分,因为第一课已经假设环境安装好了。 我们将按照以下结构设计第二课: 1. 列表(list)的基本操作 2. 字典(dict)的基本操作 3. 条件语句(if-elif-else) 4. 循环语句(for和while) 5. 综合练习 同时,我们将继续使用详细的注释和实际例子。 由于要求不能使用步骤词汇,我们将用标题和自然分段来组织内容。 开始搜索并整合信息。</think>根据第一节课的基础内容,第二节课将深入Python数据结构、控制流和函数编程。以下是整合网络资源后设计的教学内容: ### Python第二课:数据结构与控制流 ```python """ Python进阶第二课:数据结构与控制流 包含:列表/字典操作、条件判断、循环结构、函数定义 注释详细,适合零基础进阶 """ # === 1. 列表(list)操作 === # 列表是有序的可变集合,可存储不同类型数据 fruits = ["apple", "banana", "cherry"] # 创建列表 print(f"原始水果列表: {fruits}") # 列表操作 fruits.append("orange") # 添加元素 fruits.insert(1, "mango") # 指定位置插入 print(f"添加后: {fruits}") print(f"第二个水果: {fruits[1]}") # 索引访问(从0开始) print(f"最后两个水果: {fruits[-2:]}") # 切片操作 # === 2. 字典(dict)操作 === # 字典是无序的键值对集合 student = { "name": "李华", "age": 20, "courses": ["数学", "英语"] } print(f"\n学生信息: {student}") print(f"学生姓名: {student['name']}") # 字典操作 student["grade"] = "A" # 添加新键值 student.update({"age": 21, "city": "北京"}) # 批量更新 print(f"更新后: {student}") # === 3. 条件判断(if-elif-else) === score = 85 print("\n=== 成绩评价 ===") if score >= 90: print("优秀") elif score >= 80: # 80-89分 print("良好") elif score >= 60: # 60-79分 print("及格") else: print("不及格") # 结合布尔运算 is_weekend = True has_homework = False if is_weekend and not has_homework: print("可以去郊游") # === 4. 循环结构 === # for循环遍历序列 print("\n=== 水果列表循环 ===") for fruit in fruits: print(f"我喜欢吃{fruit}") # while循环控制 print("\n=== 倒计时 ===") count = 3 while count > 0: print(f"倒计时: {count}") count -= 1 else: print("发射!") # === 5. 函数定义与调用 === def calculate_bmi(weight, height): """计算BMI指数 :param weight: 体重(kg) :param height: 身高(m) :return: BMI值 """ bmi = weight / (height ** 2) return round(bmi, 1) # 保留1位小数 # 函数调用 bmi_result = calculate_bmi(70, 1.75) print(f"\nBMI计算结果: {bmi_result}") # === 6. 综合应用 === def grade_evaluation(scores): """统计成绩分布""" result = {"优秀":0, "良好":0, "及格":0, "不及格":0} for s in scores: if s >= 90: result["优秀"] += 1 elif s >= 80: result["良好"] += 1 elif s >= 60: result["及格"] += 1 else: result["不及格"] += 1 return result # 测试数据 score_list = [92, 78, 85, 60, 45, 88] distribution = grade_evaluation(score_list) print(f"\n成绩分布: {distribution}") ``` ### 关键概念解析 **列表操作要点** - 索引访问:$list[index]$ 从0开始计数 - 切片操作:$list[start:end:step]$ - 常用方法:append(), insert(), pop(), sort() - 时间复杂度:索引访问 $O(1)$,搜索 $O(n)$ **字典核心特性** - 键值对映射:{key: value} - 键必须不可变(字符串/数字/元组) - 值可以是任意数据类型 - 查找效率:$O(1)$ 常数时间复杂度 **控制流最佳实践** - if-elif-else 结构避免多层嵌套 - for循环优先用于已知迭代次数场景 - while循环适合条件控制场景 - 循环中可用break和continue控制流程 **函数设计原则** - 单一职责原则:每个函数只做一件事 - 参数验证:使用assert或条件检查 - 文档字符串:使用三引号说明函数功能 - 返回值:明确返回数据类型 ### 教学案例扩展 1. **学生管理系统原型** ```python students = [ {"id": 101, "name": "张三", "math": 85, "english": 92}, {"id": 102, "name": "李四", "math": 76, "english": 88} ] def add_student(): name = input("姓名: ") math = int(input("数学成绩: ")) english = int(input("英语成绩: ")) new_id = max(s["id"] for s in students) + 1 students.append({"id": new_id, "name": name, "math": math, "english": english}) def find_student(student_id): return next((s for s in students if s["id"] == student_id), None) ``` 2. **数学公式计算** - 二次方程求根:$x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$ ```python def solve_quadratic(a, b, c): discriminant = b**2 - 4*a*c if discriminant < 0: return "无实根" x1 = (-b + discriminant**0.5) / (2*a) x2 = (-b - discriminant**0.5) / (2*a) return round(x1, 2), round(x2, 2) ``` 3. **数据可视化基础** ```python # 需安装matplotlib: pip install matplotlib import matplotlib.pyplot as plt grades = ["优秀", "良好", "及格", "不及格"] counts = [3, 5, 8, 2] plt.bar(grades, counts, color=['gold', 'lightgreen', 'lightblue', 'salmon']) plt.title("成绩分布图") plt.xlabel("等级") plt.ylabel("人数") plt.show() ``` ### 学习资源推荐 1. [Python官方教程](https://docs.python.org/3/tutorial/) - 数据结构章节 2. [Real Python](https://realpython.com/) - 控制流深度解析 3. [Codecademy Python课程](https://www.codecademy.com/learn/learn-python-3) - 交互式练习 4. [Python函数设计指南](https://peps.python.org/pep-0008/#function-names) - PEP8规范
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值