序列 —— 元组与字典

Python 学习笔记


一、元组(tuple)


1.1、元组的简介

元组就是一个不可变的序列。(操作方式基本与列表相似,但是想给索引、切片赋值,想调用列表的方法来改变对象是不行的。)
一般情况,如果希望数据不改变时,就使用元组,其余情况都使用列表。


1.2、元组的基本操作

# 创建元组, 使用 () 创建的

my_tuple = () 								# 创建一个空的元组
print(my_tuple,type(my_tuple))



# 添加元素

my_tuple = (1,2,3,4,5)
print(my_tuple[3],type(my_tuple))

my_tuple[3] = 10							# 改变索引的值, 会报错



# 如果一个元组不是空的元组,那么它里面至少需要一个 ,

my_tuple = 10 								# my_tuple 是一个整数(int)
print(my_tuple,type(my_tuple))
my_tuple = 10, 								# my_tuple 是一个元组(tuple)
print(my_tuple,type(my_tuple))
my_tuple = 10, 20, 30, 40 					# 还是一个元组, 元组也可不加括号
print(my_tuple,type(my_tuple))

1.3、元组的解包

元组的解包: 指的是将元组当中的每一个元素都赋值给一个变量,变量的数量必须和元组中的元素要一一对应。

my_tuple = 10,20,30,40,50

a,b,c,d = my_tuple

print('a =',a)
print('b =',b)
print('c =',c)
print('d =',d)
print(my_tuple,type(my_tuple))

如果量和元素的数量不相等,则可以在变量前面加一个 *。(只能有一个 * )
这样变量就会将获取元组中所有剩余(除对应位)的元素以 列表 的形式返回。

my_tuple = 10,20,30,40,50

*a,b,c = my_tuple 							# [10, 20, 30] 40 50
a,*b,c = my_tuple						    # 10 [20, 30, 40] 50
a,b,*c = my_tuple 							# 10 20 [30, 40, 50]
a,*b,c = [1,2,3,4,5,6,7]  					# 1 [2, 3, 4, 5, 6] 7
a,b,*c = 'python java'  					# p y ['t', 'h', 'o', 'n', ' ', 'j', 'a', 'v', 'a']
*a = my_tuple								# 报错, 语法有错误, 要先有变量存了值剩下存不了才用 *

有什么用呢?

a = 6
b = 8

b,a = a,b
print('a =',a,'b = ',b)

# 例如:交换变量的值时, 对比其他方法, 它更简洁

temp = a
a = b
b = temp
print('a =',a,'b = ',b)



二、可变对象


2.1、对象 与 变量的修改
在这里插入图片描述

a = [1,2,3]
print('修改前:',a,id(a))

# 通过索引来改变列表
a[0] = 10
print('修改后:',a,id(a))

# 为变量赋值
a = [4,5,6]
print('修改后:',a,id(a))

2.2、修改索引 与 变量赋值

一般的,对变量的赋值就是对变量的修改,其余的都是对对象的修改。
在这里插入图片描述

a = [1,2,3]
b = a

b[0] = 10
print('a',a,id(a))
print('b',b,id(b))

b = [10,2,3]
print('a',a,id(a))
print('b',b,id(b))



三、==、!=、is 和 is not


3.1、== 与 != 比较的是 对象的值 是否相等。

a = [1,2,3]
b = [1,2,3]

print(a,b)
print(id(a),id(b))

print(a == b)
print(a != b)

3.2、is 与 is not 比较的是 对象的id 是否相等(比较两个对象是否是同一个对象)

a = [1,2,3]
b = [1,2,3]

print(a,b)
print(id(a),id(b))

print(a is b)
print(a is not b)



四、字典


4.1、字典的简介

  • 字典属于一个新的数据结构,称之为 “ 映射 ”
  • 字典的作用,和列表差不多,都是用来存储对象的 容器
  • 每一个元素都有一个 “ 名字(key)” ,通过 key 可以快速查找指定 元素值(value)
    所以,字典也称之为 “ 键值对(key — value)结构 ” 。每个字典有多个键值对,每个键值对称之为 “ 一项(item)” 。
  • 语法: { key:value, key:value, key:value }

4.2、字典的基本操作

# 字典的键可以是任意不可变对象(int str bool tuple...)
# 字典的值可以是任意对象

d = {'name':'钢铁侠','age':30,'sex':'男'}
print(d,type(d))


# 字典当中的键是不可以重复的,如果重复后边的会替换前边的(如, 下面的 'name')

d = {'name':'钢铁侠','age':30,'sex':'男','name':'葫芦娃'}
print(d,type(d))


# 可以根据键来获取值

print(d['name'],d['age'],d['sex'])

4.3、字典的使用

  • 1、使用 dict()函数来创建字典
d = dict(name='钢铁侠',age=30,sex='男')
print(d,type(d))

  • 2、包含双值子序列的序列 转换为 字典
    双值序列: 指序列当中只有2个值,例如:列表 [1,2] ,元组 (‘b’,6) ,字符串 ‘de’
    子序列: 指如果序列当中的 元素也是序列 ,那么我们就称这个元素为 “ 子序列 ” 。 例如:[(2,3),(7,8)]
    (做爬虫时常见): 比如,爬了一个小说网站,通过正则表达式匹配得出一个(书名,url)
d = dict([('name','钢铁侠'),('age',18)])
print(d,type(d))

  • 3、获取字典中的长度 len()
d = dict(name='钢铁侠',age=30,sex='男')
print(len(d))

  • 4、in 与 not in 检查字典当中是否包含指定的键
d = dict(name='钢铁侠',age=30,sex='男')

print('name' in d)
print('name' not in d)

  • 5、获取字典当中的值, 根据键 (key) 来获取
# 语法  字典名[key]

d = dict(name='钢铁侠',age=30,sex='男')

print(d['name'])

w = 'name'
print(d[w])

# print(d['aa'])       						# 若 key 不存在, 则会报错
print(d.get('aa'))      					# 使用 get 方法, 则不会报错, 默认返回 None
print(d.get('aa','自定义返回值'))      		# 使用 get 方法, 则不会报错, 默认返回 None

  • 6、修改字典 —— d [key] = value
d = dict(name='钢铁侠',age=30,sex='男')

d['name'] = '葫芦娃'
print(d)

d['Python'] = '葫芦娃'						# 如果 Key 值存在覆盖, 不存在就添加
print(d)

  • 7、修改字典 —— setdefault ( key [ , default ] )
# 就是向字典中添加 key-value

d = dict(name='钢铁侠',age=30,sex='男')

result = d.setdefault('name','葫芦娃')		# 如果 Key 已经存在字典中, 则返回 key的值, 不会对字典做任何操作
print(result, d)

result = d.setdefault('python','葫芦娃')	# 如果 Key 不存在, 则向字典中添加这个 Key, 并设置 value
print(result, d)

  • 8、修改字典 —— update()
# 将其他字典中的 key-value 添加到当前字典中

d = {'a':1,'b':2,'c':3}
d2 = {'d':4,'e':5,'f':6}
d3 = {'d':4,'e':5,'f':6,'a':8}				# 如果有重复的 key, 则后边的会替换掉前面的

d.update(d2)
print(d)

d.update(d3)
print(d)

  • 9、del d [key] 指定删除键值对
d = {'a':1,'b':2,'c':3}

del d['a']
print(d)

  • 10、popitem() 随机删除键值对
# 随机删除, 一般都会删除最后一个键值对
d = {'a':1,'b':2,'c':3,'d':4,'e':5}

d.popitem() 								# {'a': 1, 'b': 2, 'c': 3, 'd': 4}
print(d)

result = d.popitem() 						# {'a': 1, 'b': 2, 'c': 3}
print(result)								# 删除之后会将删除的 key-value 作为 "元组(key, value)" 返回
print(d)

  • 11、clear() 清空字典
d = {'a':1,'b':2,'c':3,'d':4,'e':5}

d.clear()
print(d)


4.4、字典的浅复制 copy()

# 复制以后的对象 和 原对象就是相互独立的, 修改一个不会影响另一个

d = {'a':1,'b':2,'c':3}

d2 = d										# 输出结果一样, 但是其指向同一个对象(id 一样), 不是复制
d3 =d.copy()								# 输出结果一样, 其指向不同对象(id 不一样), 是复制

d['b'] = 10									# 故, 改变 d, d2 也改变, d3 不变

print('d = ',d,id(d))
print('d2 = ',d2,id(d2))
print('d3 = ',d3,id(d3))

为什么说是 “浅复制” ?

# 只会简单复制对象内部的值,如果这个值也是一个可变对象,则这个可变对象是不会被复制的

d = {'a':{'name':'葫芦娃','age':20},'b':2,'c':3}
d2 = d.copy()

d2['b'] = 10 
d2['a']['name'] = '钢铁侠'					# 内部值是一个可变对象(字典), 一个改变另一个也跟着改变

print('d = ',d,id(d))
print('d2 =',d2,id(d2))

											# 说明这两个对象 d, d2 的内部可变对象, 实际指向的是同一个对象
c = d['a']
c2 = d2['a']

print('c = ',c,id(c))
print('c2 =',c2,id(c2))

4.5、字典的遍历

  • 1、通过 key() 来遍历
d = {'name':'钢铁侠','age':30,'sex':'男'}

for k in d.keys():							# 通过遍历keys()来获取所有的键
    print(k,d[k])

  • 2、通过 values() 来遍历
d = {'name':'钢铁侠','age':30,'sex':'男'}

for v in d.values():
    print(v)			# 只能看到 '值', 看不到 '键', 所以一般不用

  • 3、通过 itemss() 来遍历
# 该方法会返回字典中所有的项
# 它会返回一个序列,序列包含有双值子序列
# 双值分别是 字典中的 key 和 value

d = {'name':'钢铁侠','age':30,'sex':'男'}

print(d.items())

for k,v in d.items():
    print(k,'=',v)



五、练习


# 字典练习

a = {"name":"123","data":{"result":[{"src":"python1"},{"src":"python2"},{"src":"python3"}]}}

b = a['data'] # {"result":[{"src":"python1"},{"src":"python2"},{"src":"python3"}]}

c = b['result'] # [{"src":"python1"},{"src":"python2"},{"src":"python3"}]

for i in c:
    print(i['src'])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值