天天看点

Python程序设计 | 复合数据类型(实践练习)

作者:醒不来的胡博士

4.1 列表

4.1.1 列表的创建

lis = [1, 3, 5, 2, 2]

print(lis)

输出结果如下:

[1, 3, 5, 2, 2]

4.1.2 基本操作

  1. 索引

lis = [1, 3, 2, 2, 5]

print('lis[0]的值为:', lis[0])

print('lis[-1]的值为:', lis[-1])

索引0,也就是第0个元素的值为1,索引-1,也就是最后一个元素的值为5:

lis[0]的值为: 1

lis[-1]的值为: 5

  1. 切片

lis = [1, 3, 2, 4, 5]

lis2 = lis[1:3]

lis3 = lis[0:4:2]

print('lis2的值为:', lis2)

print('lis2的值为:', lis3)

结果:

lis2的值为: [3, 2]

lis2的值为: [1, 2]

  1. 加法和乘法

lis2 = [1, 3, 2, 4, 5]

lis3 = [7, 8, 9]

lis4 = lis2 + lis3

print(lis4)

print(lis3 * 2)

结果:

[1, 3, 2, 4, 5, 7, 8, 9]

[7, 8, 9, 7, 8, 9]

  1. 修改或删除某个元素 del

lis2 = [1, 3, 2, 4, 5]

lis2[0] = 9

print(lis2)

del lis2[1]

print(lis2)

结果:

[9, 3, 2, 4, 5]

[9, 2, 4, 5]

  1. 删除整个列表

lis2 = [1, 3, 2, 4, 5]

del lis2

print(lis2)

删除列表后再用print打印这个列表,就会报错,因为删除后就不存在了

Traceback (most recent call last):

File "E:/python_project/main.py", line 3, in <module>

print(lis2)

NameError: name 'lis2' is not defined

  1. append() 追加元素

lis2 = [1, 3, 2, 4, 5]

print(lis2)

lis2.append(8)

print(lis2)

结果:

[1, 3, 2, 4, 5]

[1, 3, 2, 4, 5, 8]

  1. insert() 插入元素

lis2 = [1, 3, 2, 4, 5]

print(lis2)

lis2.insert(4, "2")

print(lis2)

结果:

[1, 3, 2, 4, 5]

[1, 3, 2, 4, '2', 5]

  1. extend() 扩展元素

lis2 = [1, 3, 2, 4, 5]

print(lis2)

lis3 = [7, 8]

lis2.extend(lis3)

print(lis2)

[1, 3, 2, 4, 5]

[1, 3, 2, 4, 5, 7, 8]

4.1.3 多维列表

  1. 多维列表

a = ['a', 1]

n = ['b', 2]

x = [a, n]

print(x)

print(x[0])

print(x[0][1])

结果:

[['a', 1], ['b', 2]]

['a', 1]

1

  1. 直接创建多维列表

lis = [[1, 2, 3], [4, 5, 6]]

print(lis)

结果:

[[1, 2, 3], [4, 5, 6]]

  1. 列表解析方式创建

cols = 3

rows = 2

list_2d = [[col + 1 for col in range(cols)] for row in range(rows)]

print(list_2d)

print([col + 1 for col in range(cols)])

print([row for row in range(rows)])

[[1, 2, 3], [1, 2, 3]]

[1, 2, 3]

[0, 1]

4.1.4 迭代器

  1. 迭代器

lst = [1, 2, 3, 4, 5]

lstiter = iter(lst)

for i in range(len(lst)):

print(lstiter.__next__())

1

2

3

4

5

创建列表的方法:

# 方法1

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

print('list3:', list3)

# 方法2

list2 = []

for n in range(1, 11):

list2.append(n)

print('list2:', list3)

# 方法3

lis4 = list(range(1, 11))

print('lis4:', lis4)

结果:

list3: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

list2: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

lis4: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

4.1.5 列表解析

lis1 = [x * x for x in range(1, 11)]

print(lis1)

lis2 = [m + n for m in 'ABC' for n in 'XYZ']

print(lis2)

这里需要注意和二位列表推导式的区别:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

4.1.6 列表函数和方法

  1. 列表函数
  2. 列表方法

4.2元组

4.2.1 元组的创建

tup1 = (1, 2, 3, 2, 4)

print(tup1)

print(type(tup1))

结果:

(1, 2, 3, 2, 4)

<class 'tuple'>

4.2.2 元组的基本操作

  1. 访问

tup1 = (1, 2, 3)

tup2 = (4, 5, 6)

print("tup1[0]:", tup1[0])

print("tup1[-1]:", tup1[-1])

print("tup2[1:2]:", tup2[1:2])

结果:

tup1[0]: 1

tup1[-1]: 3

tup2[1:2]: (5,)

  1. 修改

tup1 = (1, 2, 3)

tup2 = (4, 5, 6)

tup3 = tup1 + tup2

print(tup3)

结果:

(1, 2, 3, 4, 5, 6)

  1. 删除

tup1 = (1, 2, 3)

print(tup1)

del tup1;

print("删除后的元组tup1:")

print(tup1)

打印删除后的元组,就会报错,如下所示:

Traceback (most recent call last):

File "E:/python_project/main.py", line 5, in <module>

print(tup1)

NameError: name 'tup1' is not defined

  1. 统计

tup1 = (1, 2, 3, 2, 4)

print(tup1)

tup1.count(2)

结果:

(1, 2, 3, 2, 4)

2

  1. 查找

tup1 = (1, 2, 3, 2, 4)

tup1.index(4)

结果:

4

4.2.3 元组函数和方法

  1. 函数

tup2 = (1, 2, 3, 2, 4)

tup3 = (2, 2, 4, 5, 8)

print(tup3 > tup2)

print(len(tup2), len(tup3))

print(max(tup2), max(tup3))

print(min(tup2), min(tup3))

lis2 = [1, 2, 4, 7]

tup4 = tuple(lis2)

print(type(lis2), type(tup4))

结果:

True

5 5

4 8

1 2

<class 'list'> <class 'tuple'>

  1. 方法

tup3 = (2, 2, 4, 5, 8, 3, 2)

print(tup3.count(2))

print(tup3.index(8))

结果:

3

4

4.2.4 元组的优势

  1. 可以使函数返回多个值

def func():

tup2 = (2, 3, 4)

tup3 = (5, 6, 7)

return tup2, tup3

result = func()

print(type(result))

print(result)

结果:

<class 'tuple'>

((2, 3, 4), (5, 6, 7))

  1. 可以使程序运行性能提升,一般来说,创建元组类型tuple的变量比列表类型list要快,而且占用更小的存储空间。

import time

def func2():

tup2 = (2, 3, 4)

tup3 = (5, 6, 7)

return tup2, tup3

def func3():

lis2 = [2, 3, 4]

lis3 = [5, 6, 7]

return lis2, lis3

# -------元组

start = time.time()

result = func2()

for i in range(8000):

result = func2()

print(type(result))

print(result)

end = time.time()

print(end-start)

print('----------------------')

# -------列表

start = time.time()

result = func3()

for i in range(8000):

result = func3()

print(type(result))

print(result)

end = time.time()

print(end-start)

结果可以看出,元组创建的时间比列表短:

<class 'tuple'>

((2, 3, 4), (5, 6, 7))

0.00099945068359375

----------------------

<class 'tuple'>

([2, 3, 4], [5, 6, 7])

0.001998424530029297

  1. 使用元组是线程安全的,元组类型变量的元素不可更改性,可保证多线程读写时的安全问题。

4.3字典

4.3.1 字典的创建

dict2 = {'a': '2', 'b': '3'}

dict3 = {'a': '2'}

dict4 = {'a': 2, 'b': 3}

dict5 = {2: '2', 3: '2'}

dict6 = {(1, 2): '2', 'b': [1, 2, 4]}

print(dict2)

print(dict3)

print(dict4)

print(dict5)

print(dict6)

结果:

{'a': '2', 'b': '3'}

{'a': '2'}

{'a': 2, 'b': 3}

{2: '2', 3: '2'}

{(1, 2): '2', 'b': [1, 2, 4]}

4.3.2 字典的基本操作

  1. 访问

dict2 = {'a': '2', 'b': '3'}

dict3 = {(1, 2): [3, 4]}

print(dict2['a'])

print(dict3[(1, 2)])

结果:

2

[3, 4]

例子:修改

dict2 = {'name': 'poge', 'age': 18}

print(dict2)

dict2['age'] = 19

print(dict2)

结果:

{'name': 'poge', 'age': 18}

{'name': 'poge', 'age': 19}

例子:删除

dict2 = {'name': 'poge', 'age': 18}

print(dict2)

del dict2['age']

print(dict2)

结果:

{'name': 'poge', 'age': 18}

{'name': 'poge'}

4.3.3 字典的嵌套

dict2 = {'a': {'book': '3', 'age': 20}, 'age': 18}

print(dict2)

dict3 = {'a': [1, 2, 3], 'b': [4, 5, 6]}

print(dict3)

结果:

{'a': {'book': '3', 'age': 20}, 'age': 18}

{'a': [1, 2, 3], 'b': [4, 5, 6]}

4.3.4 字典的遍历

username = {'full_name': 'ZhangWei', 'surname': 'Zhang', 'name': 'Wei'}

# 遍历所有的键值对

print('--------遍历所有的键值对--------')

for k, v in username.items():

print('key:', k)

print('value:', v, '\n')

# 遍历所有键

print('--------遍历所有键--------')

for k in username.keys():

print(k)

print('key:', k, '-value:' + username[k])

# 遍历所有的值

print('--------遍历所有的值--------')

for v in username.values():

print(v)

结果:

--------遍历所有的键值对--------

key: full_name

value: ZhangWei

key: surname

value: Zhang

key: name

value: Wei

--------遍历所有键--------

full_name

key: full_name -value:ZhangWei

surname

key: surname -value:Zhang

name

key: name -value:Wei

--------遍历所有的值--------

ZhangWei

Zhang

Wei

4.3.5 字典的函数和方法

  1. 函数

dict2 = {'a': '1', 'b': '2'}

dict3 = {'c': '3', 'd': '4'}

print(len(dict2))

str_dict3 = str(dict3)

print(str_dict3)

print(type(str_dict3))

结果:

2

{'c': '3', 'd': '4'}

<class 'str'>

  1. 方法

dict2 = {'a': '1', 'b': '2'}

dict3 = {'c': '3', 'd': '4'}

print(dict2)

print(dict3)

dict2.clear()

print(dict2)

print('-----------')

dict2 = dict3.copy()

print(dict2)

print('-----------')

print(dict2.get('c'))

print(dict2.fromkeys([1, 2, 3], ['a', 'b', 'c']))

print('-----------')

print(dict2.items())

print(dict2.keys())

print(dict2.values())

dict2.clear()

print(dict2)

dict2.update(dict3)

print(dict2)

print(dict2.setdefault('d'))

dict2.setdefault('f')

print(dict2)

结果:

{'a': '1', 'b': '2'}

{'c': '3', 'd': '4'}

{}

-----------

{'c': '3', 'd': '4'}

-----------

3

{1: ['a', 'b', 'c'], 2: ['a', 'b', 'c'], 3: ['a', 'b', 'c']}

-----------

dict_items([('c', '3'), ('d', '4')])

dict_keys(['c', 'd'])

dict_values(['3', '4'])

{}

{'c': '3', 'd': '4'}

4

{'c': '3', 'd': '4', 'f': None}

4.4 集合

4.4.1 集合的创建

set2 = {'a', '1', 'b', '2'}

print(set2)

print(type(set2))

结果:

{'1', '2', 'b', 'a'}

<class 'set'>

4.4.2 集合的数学运算

set2 = {'a', '1', 'b', '2'}

set3 = {'3', '2', 'd', 'd'}

print(set2 | set3)

print(set2 & set3)

print(set2 - set3)

print(set2 ^ set3)

结果:

{'2', '1', 'b', 'a', 'd', '3'}

{'2'}

{'1', 'b', 'a'}

{'b', 'd', '1', 'a', '3'}

4.4.3 集合的基本操作

set2 = {1, 4, 6, 7}

print(set2)

set2.add(9)

print(set2)

set2.update((3, 5, 8))

print(set2)

set2.remove(3)

print(set2)

set2.discard(5)

print(set2)

结果:

{1, 4, 6, 7}

{1, 4, 6, 7, 9}

{1, 3, 4, 5, 6, 7, 8, 9}

{1, 4, 5, 6, 7, 8, 9}

{1, 4, 6, 7, 8, 9}

4.4.4 不可变集合

集合分为不可变集合和可变集合

一般集合创建默认可变集合,如果创建不可变集合,使用frozenset()方法

s = frozenset('abcd')

print(s)

print(type(s))

结果:

frozenset({'d', 'c', 'a', 'b'})

<class 'frozenset'>

4.4.5 集合函数和方法

set2 = (2, 6, 3, 4)

print(all(set2))

print(any(set2))

print(enumerate(set2))

print(len(set2))

print(max(set2))

print(min(set2))

print(sorted(set2))

print(sum(set2))

结果:

True

True

<enumerate object at 0x000001A5F1A15AC0>

4

6

2

[2, 3, 4, 6]

15

4.5 类型转换和格式化输出

可变数据类型有:列表、字典

可变数据类型,其值可变,但在发生变化时,内存中的地址并不会发生改变

举例:

a = [1, 2, 3]

print(id(a))

a.append(3)

print(id(a))

结果:

1420693794304

1420693794304

不可变对象有:

整形、浮点型、字符型、元组等

不可变对象,在内存中不管有多少个引用,相同的对象只占用一块内存,当改变变量值时,必须创建新的对象。

a = (1, 2, 3)

print(id(a))

a = a + (2, 3)

print(id(a))

结果:

1989404705664

1989403579792

4.5.1 类型转换

print(int('2'))

print(float('0.25'))

print(complex(2, 4))

print(str(8))

print(type(repr(2)))

print(eval('2+4'))

print(tuple([1, 4, 5]))

print(list((2, 4, 5)))

a = set([1, 3, 4, 4, 4, 5, 8])

print(a)

print(chr(87))

print(ord('a'))

print(hex(16))

print(oct(17))

结果:

2

0.25

(2+4j)

8

<class 'str'>

6

(1, 4, 5)

[2, 4, 5]

{1, 3, 4, 5, 8}

W

97

0x10

0o21

4.5.2 格式化输出

print("%d", 4)

print("%s", "adddd")

print("%x", 0x11)

print("%f", 4.2)

结果:

%d 4

%s adddd

%x 17

%f 4.2

a = 2

b = 3

print("{},{}".format(a, b))

print("{0},{1}".format(a, b))

print("{1},{0}".format(b, a))

print("{c},{d}".format(c=a, d=b))

print("{d},{c}".format(c=b, d=a))

结果:

2,3

2,3

2,3

2,3

2,3

4.6 每日分享

守正笃实、久久为功!