习题1

看代码写结果

v1 = [1, 2, 3, 4, 5]
v2 = [v1, v1, v1]

v1.append(6)
print(v1)
print(v2)

结果:
[1, 2, 3, 4, 5, 6]
[[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6]]

v1是可变类型list,在追加一个数据的同时,v1的地址不变。
只是值变化了。

习题2

看代码写结果

v1 = [1, 2, 3, 4, 5]
v2 = [v1, v1, v1]

v2[1][0] = 111
v2[2][0] = 222
print(v1) 
print(v2)

结果:
[222, 2, 3, 4, 5]
[[222, 2, 3, 4, 5], [222, 2, 3, 4, 5], [222, 2, 3, 4, 5]]

v1是可变类型list,在修改一个元素的同时,v1的地址不变。
只是值变化了。

习题3

看代码写结果,并解释每一步的流程

v1 = {1, 2, 3, 4, 5, 6, 7, 8, 9}
v2 = {}

for item in v1:
    if item < 6:
        continue
    if 'k1' in v2:
        v2['k1'].append(item)
    else:
        v2['k1'] = [item]
print(v2)  # {'k1': [6, 7, 8, 9]}
  1. 首先定义2个变量v1集合,v2字典
  2. 然后通过遍历v1,获取每个元素的值item
  3. 在遍历的时候先判定item值是否 < 6,如果小于6,那么执行continue,那么这个的功能会跳过下面的代码的执行,直接进行下一轮的循环
  4. 在item < 6的判定失败的时候,会执行'k1'是否在v2内的判定,如果在内,那么v2的'k1'键取得的值会追加一个新元素item
  5. 如果执行判定'k1'不在v2的时候,会执行新建键:'k1',值:[item]
  6. 最后打印v2字典
习题4

简述深浅拷贝

浅拷贝:

  1. 拷贝对象分可变和不可变类型,如果对象是可变的类型则内存相同,否则则不同。
  2. 拷贝的对象内部含有的对象,他们的内存是相同的

深拷贝:

  1. 拷贝对象分可变和不可变类型,如果对象是可变的类型则内存相同,否则则不同。
  2. 拷贝的对象内部含有的对象,如果是可变类型数据则内存共用同一个,如果是不可变类型数据则新建一个新的内存
习题5

看代码写结果

import copy

v1 = 'alex'
v2 = copy.copy(v1)
v3 = copy.deepcopy(v1)

print(v1 is v2)
print(v1 is v3)

结果:
True
True

v1是不可变类型str,所以v3、v2内存与v1相同

习题6

看代码写结果

import copy

v1 = [1, 2, 3, 4, 5]
v2 = copy.copy(v1)
v3 = copy.deepcopy(v1)

print(v1 is v2)
print(v1 is v3)

结果:
False
False

v1是可变类型list,所以v2的浅复制,v2内存不与v1相同

同时v3深拷贝的是可变类型list所以也以v1、v2都不同

习题7

看代码写结果

import copy

v1 = [1, 2, 3, 4, 5]
v2 = copy.copy(v1)
v3 = copy.deepcopy(v1)

print(v1[0] is v2[0])
print(v1[0] is v3[0])
print(v2[0] is v3[0])

结果:
True
True
True

虽然3者v1、v2、v3的内存互不相同,但是他们内部的元素都是不可变数据int,所以是共用同一个内存地址

习题8

看代码写结果

import copy

v1 = [1, 2, 3, 4, [11, 22]]
v2 = copy.copy(v1)
v3 = copy.deepcopy(v1)

print(v1[-1] is v2[-1])
print(v1[-1] is v3[-1])
print(v2[-1] is v3[-1])

结果:
True
False
False

首先3者v1、v2、v3的内存互不相同,同时在v1和v2比较的时候,虽然v1、v2内存不同,但是他们内部元素的指向是相同的,所以v1、v2的内部元素是相同的内存。然后在v1、v2分别和v3比较的时候,因为比较的是不可变类型list所以v3和v1、v2内存都不同!

习题9

看代码写结果

import copy

v1 = [1, 2, 3, {'name': '太白', 'numbers': [7, 77, 88]}, 4, 5]
v2 = copy.copy(v1)

print(v1 is v2)
print(v1[0] is v2[0])
print(v1[3] is v2[3])
print(v1[3]['name'] is v2[3]['name'])
print(v1[3]['numbers'] is v2[3]['numbers'])
print(v1[3]['numbers'][1] is v2[3]['numbers'][1])

结果:
False
True
True
True
True
True

浅拷贝,所以内部元素的指向是相同的,所以第二个开始都是True,首个比较因为对象是列表,是可变数据类型所以v1和v2不同

习题10

看代码写结果

import copy

v1 = [1, 2, 3, {'name': '太白', 'numbers': [7, 77, 88]}, 4, 5]
v2 = copy.deepcopy(v1)

print(v1 is v2)
print(v1[0] is v2[0])
print(v1[3] is v2[3])
print(v1[3]['name'] is v2[3]['name'])
print(v1[3]['numbers'] is v2[3]['numbers'])
print(v1[3]['numbers'][1] is v2[3]['numbers'][1])

结果:
False
True
False
True
False
True

  1. 拷贝对象分可变和不可变类型,如果对象是可变的类型则内存相同,否则则不同。
  2. 拷贝的对象内部含有的对象,如果是可变类型数据则内存共用同一个,如果是不可变类型数据则新建一个新的内存
习题11

请写出下面a、b、c三个变量的数据类型

a = ('太白金星')  # str
b = (1,)  # tuple
c = ({'name': 'barry'})  # dict

结果:
a:字符串str
b:元组tuple
c:字典dict

习题12

按照需求为列表排序:

l1 = [1, 3, 6, 7, 9, 8, 5, 4, 2]

  1. 从小到大排序
  2. 从大到小排序
  3. 翻转
l1 = [1, 3, 6, 7, 9, 8, 5, 4, 2]
# 从小到大排序
l1.sort()
# 还可以用方法,该方法只适用于int类型的元素组成的列表
# l1 = list(set(l1))

# 从大到小排序
l1.sort(reverse=True)

# 反转l1列表
l1.reverse()
习题13

利用python代码构建一个这样的列表(升级题)

[['', '', ''], ['', '', ''], ['', '', '_']]

result = [['_'] * 3 for i in range(3)]
print(result)
# [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
习题14

看代码写结果:

l1 = [1, 2]
l1 += [3, 4]
print(l1)

结果:
[1, 2, 3, 4]

习题15

看代码写结果:

dic = dict.fromkeys('abc', [])
dic['a'].append(666)
dic['b'].append(111)
print(dic)

结果:

习题16

l1 = [11, 22, 33, 44, 55],请把索引为奇数对应的元素删除(不能一个一个删除,此l1只是举个例子,里面元素不定)

l1 = [11, 22, 33, 44, 55]
del l1[::2]
# [22, 44]
习题17

请将字典中所有的键带有键'k'元素的键值对删除

dic = {'k1': '太白', 'k2': 'barry', 'k3': '白白', 'age': 18}

dic = {'k1': '太白', 'k2': 'barry', 'k3': '白白', 'age': 18}
for key in list(dic.keys()):
    if 'k' in key:
        del dic[key]
print(dic)  # {'age': 18}
习题18

bytes数据类型是python的基础数据类型,bytes类型的存在意义是什么?

1、定义
bytes类型是指一堆字节的集合, 在python中以b开头的字符串都是bytes类型。
以16进制显示, 两个16进制代表一个字节。 utf-8是3个16进制代表一个中文。

2、作用
计算机只认识二进制, 所以要存储东西到硬盘当中, 那就必须将这些东西编码成二进制后再存。
1、对于文字:可以以gbk、utf-8、ASCII编码
2、对于图片:必须编码成PNG、JPEG等格式
3、对于音乐:必须编码成MP3,WAV等

3、以二进制模式操作文件
wb:以二进制的方式创建
rb:以二进制的方式读
ab:以二进制的方式追加

习题19

列举bytes类型与str类型的三个不同点

1.非ASCII码内容的时候,bytes类型与str类型表现形式不同

例:

str类型:str1 = '世界'

bytes类型:b1 = b'\xe4\xb8\x96\xe7\x95\x8c'

2.bytes类型与str类型的组成单位不同

bytes类型:字节为单位

str类型:字符为单位

3.bytes类型与str类型的编码方式不同

bytes编码方式:非Unicode编码(例:gbk,utf-8等)

str编码方式:Unicode编码

习题20

完成下列需求:

s1 = '太白金星'

将s1转化成utf-8的bytes类型

将s1转化成gbk的bytes类型

b = b'\xe5\xa4\xaa\xe7\x99\xbd\xe9\x87\x91\xe6\x98\x9f'

b为'utf-8'的bytes类型,请转换为gbk的bytes类型

s1 = '太白金星'

b_utf = s1.encode('utf-8')
b1_gbk = s1.encode('gbk')
print(b_utf)  # b'\xe5\xa4\xaa\xe7\x99\xbd\xe9\x87\x91\xe6\x98\x9f'
print(b1_gbk)  # b'\xcc\xab\xb0\xd7\xbd\xf0\xd0\xc7'

b = b'\xe5\xa4\xaa\xe7\x99\xbd\xe9\x87\x91\xe6\x98\x9f'
s = b.decode('utf-8')
b_gbk = s.encode('gbk')
print(b_gbk)  # b'\xcc\xab\xb0\xd7\xbd\xf0\xd0\xc7'
习题21

用户输入一个数字,判断一个数是否是水仙花数

水仙花数:是一个三位数,三位数的每一位的三次方等于这个数,那么这个数即是水仙花数

范例:

153 = 1**3 + 5**3 +3**3
# 方法一:
num = input('输入一个数:')
if int(num[0]) ** 3 + int(num[1]) ** 3 + int(num[2]) ** 3 == int(num):
    print('{}:是一个水仙花数'.format(num))
else:
    print('{}:不是一个水仙花数'.format(num))

# 方法二:
num = int(input('输入一个数:'))
temp = num
s = 0
while True:
    s += (num % 10) ** 3
    num //= 10
    if num == 0:
        break
if s == temp:
    print('{}:是一个水仙花数'.format(temp))
else:
    print('{}:不是一个水仙花数'.format(temp))
# 运行结果:
# 输入一个数:167
# 167:不是一个水仙花数
# 输入一个数:153
# 153:是一个水仙花数
习题22

把列表中所有姓周的人的信息删除

lst = ['周老二', '周星星', '麻花藤', '周扒皮']

结果:lst = ['麻花藤']

lst = ['周老二', '周星星', '麻花藤', '周扒皮']

for name in lst[::]:
    if '周' in name:
        lst.remove(name)

print(lst)
# ['麻花藤']
习题23

车牌区域划分现给出以下车牌.根据车牌的信息,分析出各省的车牌持有量.

cars = ['鲁A32444', '鲁B12333', '京B8989M', '黑C49678', '黑C46555', '泸B25041']
locals_cars = {'泸': '上海', '黑': '黑龙江', '鲁': '山东', '鄂': '湖北', '湘': '湖南', '京': '北京'}

结果:{'山东': 2, '北京': 1, '黑龙江': 2, '上海': 1}

cars = ['鲁A32444', '鲁B12333', '京B8989M', '黑C49678', '黑C46555', '泸B25041']
locals_cars = {'泸': '上海', '黑': '黑龙江', '鲁': '山东', '鄂': '湖北', '湘': '湖南', '京': '北京'}
result = {}
for car in cars:
    if car[0] in locals_cars.keys():
        if locals_cars.get(car[0]) in result.keys():
            result[locals_cars.get(car[0])] += 1
        else:
            result[locals_cars.get(car[0])] = 1
print(result)
# {'山东': 2, '北京': 1, '黑龙江': 2, '上海': 1}