python教程字典类型_06. 详解数据类型:字典与布尔类型|简明python教程|python入门|python教程...

1. 字典

字典(Map 类型),是由若干个 key:value 这样的键值对映射组合在一起的数据结构。

它是哈希表的一个实现,这就要求它的每个映射里的key,都是唯一的,可以使用 == 和 != 来进行判等操作,换句话说就是key必须是可哈希的。

什么叫可哈希的?简单来说,一个不可变对象,都可以用一个哈希值来唯一表示,这样的不可变对象,比如字符串类型的对象(可以说除了切片、 字典,函数之外的其他内建类型都算)。

意思就是,你的 key 不能是切片,不能是字典,不能是函数。

字典由key和value组成,它们各自有各自的类型。

在声明字典时,必须指定好你的key和value是什么类型的,然后使用 map 关键字来告诉Go这是一个字典。

map[KEY_TYPE]VALUE_TYPE

声明初始化字典

三种声明并初始化字典的方法

// 第一种方法

var scores map[string]int = map[string]int{"english": 80, "chinese": 85}

// 第二种方法

scores := map[string]int{"english": 80, "chinese": 85}

// 第三种方法

scores := make(map[string]int)

scores["english"] = 80

scores["chinese"] = 85

要注意的是,第一种方法如果拆分成多步(声明、初始化、再赋值),和其他两种有很大的不一样了,相对会比较麻烦(具体请看注释)。

import "fmt"

func main() {

// 声明一个名为 score 的字典

var scores map[string]int

// 未初始化的 score 的零值为nil,无法直接进行赋值

if scores == nil {

// 需要使用 make 函数先对其初始化

scores = make(map[string]int)

}

// 经过初始化后,就可以直接赋值

scores["chinese"] = 90

fmt.Println(scores)

}

字典的相关操作

添加元素

scores["math"] = 95

更新元素,若key已存在,则直接更新value

scores["math"] = 100

读取元素,直接使用 [key] 即可 ,如果 key 不存在,也不报错,会返回其value-type 的零值。

fmt.Println(scores["math"])

删除元素,使用 delete 函数,如果 key 不存在,delete 函数会静默处理,不会报错。

delete(scores, "math")

当访问一个不存在的key时,并不会直接报错,而是会返回这个 value 的零值,如果 value的类型是int,就返回0。

package main

import "fmt"

func main() {

scores := make(map[string]int)

fmt.Println(scores["english"]) // 输出 0

}

判断 key 是否存在

当key不存在,会返回value-type的零值 ,所以你不能通过返回的结果是否是零值来判断对应的 key 是否存在,因为 key 对应的 value 值可能恰好就是零值。

其实字典的下标读取可以返回两个值,使用第二个返回值都表示对应的 key 是否存在,若存在ok为true,若不存在,则ok为false

import "fmt"

func main() {

scores := map[string]int{"english": 80, "chinese": 85}

math, ok := scores["math"]

if ok {

fmt.Printf("math 的值是: %d", math)

} else {

fmt.Println("math 不存在")

}

}

我们将上面的代码再优化一下

import "fmt"

func main() {

scores := map[string]int{"english": 80, "chinese": 85}

if math, ok := scores["math"]; ok {

fmt.Printf("math 的值是: %d", math)

} else {

fmt.Println("math 不存在")

}

}

如何对字典进行循环

Go 语言中没有提供类似 Python 的  keys() 和 values() 这样方便的函数,想要获取,你得自己循环。

循环还分三种

获取 key 和 value

import "fmt"

func main() {

scores := map[string]int{"english": 80, "chinese": 85}

for subject, score := range scores {

fmt.Printf("key: %s, value: %d\n", subject, scores)

}

}

只获取key,这里注意不用占用符。

import "fmt"

func main() {

scores := map[string]int{"english": 80, "chinese": 85}

for subject := range scores {

fmt.Printf("key: %s\n", subject)

}

}

只获取 value,用一个占位符替代。

import "fmt"

func main() {

scores := map[string]int{"english": 80, "chinese": 85}

for _, score := range scores {

fmt.Printf("value: %d\n", score)

}

}

2. 布尔类型

关于布尔值,无非就两个值:true 和 false。只是这两个值,在不同的语言里可能不同。

在 Python 中,真值用 True 表示,与 1 相等,假值用 False 表示,与 0 相等

>>> True == 1

True

>>> False == 0

True

>>>

而在 Go 中,真值用 true 表示,不但不与 1 相等,并且更加严格,不同类型无法进行比较,而假值用 false 表示,同样与 0 无法比较。

如下图所示,Goland 直接波浪线提示类型不匹配,不能比较。

f3ea211530df74a77d60bc85e17c3887.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值