Python基础之——5_内置数据结构列表与元组

目录

一、序列

 二、列表: 打了激素的数组

列表的添加

列表的修改

列表的查看

列表的删除

列表知识点总结

三、元组:带了紧箍咒的列表

元组的创建,删除及特性

元组的方法

元组赋值应用

多元赋值机制

变量交换

四、命名元组

五、is和==的区别

六、深拷贝和浅拷贝

七、实验操作

7.1 字符串回顾

7.2 列表的创建

7.3 列表的基本特性

7.4 列表的常用方法

7.5 元组的操作

7.6 命名元组的操作

7.7 is和==的区别

7.8 列表的练习题

7.9 地址引用和深拷贝和浅拷贝


一、序列

 二、列表: 打了激素的数组

数组: 存储同一种数据类型的集和。scores=[12,95.5]

列表(打了激素的数组): 可以存储任意数据类型的集和。 

    创建一个空列表

  list = []

•    创建一个包含元素的列表,元素可以是任意类型,

     包括数值类型,列表,字符串等均可, 也可以嵌套列表

  list = ["fentiao", 4, 'gender']

  list = [['粉条', 100], ["粉丝", 90], ["粉带", 98]]

列表的添加

列表可通过append追加一个元素到列表中;

   列表可通过extend方法拉伸, 实现追加多个元素到列表中

 在指定位置添加元素使用insert方法; L.insert(index, object)

列表的修改

修改列表的元素:直接重新赋值;

列表的查看

   查看某个列表元素的下表用index方法;

   查看某个列表元素出现的次数用count方法;

列表的删除

  list.remove()删除列表中的指定元素。

  list.pop()根据元素的索引值进行删除指定元素。

  list.clear: 清空列表里面的所有元素。

列表知识点总结

三、元组:带了紧箍咒的列表

元组的创建,删除及特性

1).  定义空元组		tuple = ()

2).  定义单个值的元组	tuple = (fentiao,)

3).  一般的元组		tuple = (fentiao, 8, male)

特性:   连接&重复操作符、成员操作符、索引&切片

注意:    元组是不可变数据类型,不能对元组的值任意更改;

元组的方法

t.count(value)-->int  返回value在元组中出现的次数;

t.index(value)  返回value在元组中的偏移量(即索引值)

元组赋值应用

特性1:  对元组分别赋值,引申对多个变量也可通过元组方式分别赋值

   

多元赋值机制

x, y, z = 1, 2, 'westos' 等价于 (x, y, z) = (1, 2, 'westos') , 等号两边的对象都是元组并且元组的小括号是可选的。

变量交换

x=2; y=10;x, y = y, 2; print(x,y)

这种交换方式无需中间变量即可交换两个变量的值。那么具体实现机制是怎样的呢?

四、命名元组

Tuple还有一个兄弟,叫namedtuple。虽然都是tuple,但是功能更为强大。

collections.namedtuple(typename, field_names) 
	typename:类名称
	field_names: 元组中元素的名称

定义命名元组类与应用

命名元组是一个类,有两种方式来定义命名元组:

实例化命名元组,获得类的一个实例:

访问命名元组: 通过逗号运算符和属性名来访问元组字段的值

user.name; user.age, user.id

命名元组的属性

类属性 _fields:包含这个类所有字段名的元组

类方法 _make(iterable):接受一个可迭代对象来生产这个类的实例

实例方法_replace():用于修改实例的属性 

五、is和==的区别

问题: is==两种运算符在应用上的本质区别是什么?

1). Python中对象的三个基本要素,分别是:id(身份标识)type(数据类型)value()

2). is==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。

3). ==用来比较判断两个对象的value()是否相等;(typevalue)

     is也被叫做同一性运算符, 会判断id是否相同;(id, type value)

六、深拷贝和浅拷贝

问题深拷贝和浅拷贝的区别?

 问题深拷贝和浅拷贝的区别?/python中如何拷贝一个对象?

赋值: 创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。(=)

浅拷贝: 对另外一个变量的内存地址的拷贝,这两个变量指向同一个内存地址的变量值。(li.copy(), copy.copy())

公用一个值;
这两个变量的内存地址一样;
对其中一个变量的值改变,另外一个变量的值也会改变;

深拷贝: 一个变量对另外一个变量的值拷贝。(copy.deepcopy())

两个变量的内存地址不同;
两个变量各有自己的值,且互不影响;
对其任意一个变量的值的改变不会影响另外一个;

七、实验操作

7.1 字符串回顾

# 创建
- 单引号引起来: `name = 'westos'`
- 双引号引起来: `name = "westos"`
- 三引号引起来:
  注意点: 三引号代表字符串, 也可以作为代码的块注释

# 基本特性
- 连接(+)重复(*)
- 成员(in, not in)
- 索引: 正向索引和反向索引
- 切片:s[start:end:step]
```python
s = '012345'
print(s[:3])    # s[:n]获取前n个字符
print(s[2:])    # s[n:]获取除了qiann个字符的字符串信息
print(s[::-1])  # 字符串倒序
```

# 常用方法
- 判断类型(isdigit, isupper, islower, isalpha, isalnum)
- 转换类型:(lower, upper, title)
- 开头和结尾的判断(startswith, endswith)
- 数据清洗(strip, lstrip, rstrip, replace)
- 分割和拼接(split, `'172.25.254.100'.split(".")`, join)
- 位置调整(center)

7.2 列表的创建

li = []
print(li, type(li))
li1 = [1]
print(li1, type(li1))

7.3 列表的基本特性

# 1. 连接操作符和重复操作符
print([1, 2] + [2, 3]) # [1, 2, 2, 3]
print([1, 2] * 3) # [1, 2, 1, 2, 1, 2]

# 2. 成员操作符(in, not in)
print(1 in [1, 2, 3]) # True
"""
布尔类型:
    True: 1
    False:0
"""
print(1 in ["a", False, [1, 2]])  # False

# 3. 索引
li = [1, 2, 3, [1, 'b', 3]]
print(li[0])  # 1
print(li[-1]) # [1, 'b', 3]
print(li[-1][0])  # 1
print(li[3][-1])  # 3

# 4. 切片
li = ['172', '25', '254', '100']
print(li[:2])
print(li[1:])
print(li[::-1])
# 需求: 已知['172', '25', '254', '100'], 输出: "100-254-25"
li = ['172', '25', '254', '100']
print("-".join(li[1:][::-1]))

# 5. for循环
names = ["粉丝", '粉条', '粉带']
for name in names:
    print(f"西部开源猫大佬的姓名是:{name}")

7.4 列表的常用方法

# 1. 增加
# 1-1). 追加
li = [1, 2, 3]
li.append(4)
print(li)
# 1-2). 在列表开头添加
li = [1, 2, 3]
li.insert(0, 'cat')
print(li)
# 1-2). 在索引2前面添加元素cat
li = [1, 2, 3]
li.insert(2, 'cat')
print(li)
# 1-3). 一次追加多个元素
li = [1, 2, 3]  # 添加4, 5, 6
li.extend([4, 5, 6])
print(li)

# 2. 修改: 通过索引和切片重新赋值的方式。
li = [1, 2, 3]
li[0] = 'cat'
li[-1] = 'westos'
print(li)
li = [1, 2, 3]
li[:2] = ['cat', 'westos']
print(li)

# 3. 查看: 通过索引和切片查看元素。 查看索引值和出现次数。
li = [1, 2, 3, 1, 1, 3]
print(li.count(1))   # 3
print(li.index(3))   # 2

# 4. 删除
# 4-1). 根据索引删除
li = [1, 2, 3]
# 将pop方法的结果存储到delete_num变量中。
delete_num = li.pop(-1)
print(li)
print("删除的元素是:", delete_num)

# 4-2). 根据value值删除
li = [1, 2, 3]
li.remove(1)
print(li)

# 4-3). 全部清空
li = [1, 2, 3]
li.clear()
print(li)


# 5. 其他操作
li = [18, 6, 99, 56]
li.reverse()  # 类似于li[::-1]
print(li)

# sort排序默认由小到大。 如果想由大到小排序,设置reverse=True
li.sort(reverse=True)
print(li)

li1 = li.copy()
print(id(li), id(li1))
print(li, li1)

7.5 元组的操作

# 元组tuple(戴了紧箍咒的列表, 不能修改元素)
# 1. 元组的创建
t1 = ()    # 空元组
print(t1, type(t1))
t2 = (1,)   # 重要(易错点):元组只有一个元素时一定要加逗号
print(t2, type(t2))
t3 = (1, 1.2, True, [1, 2, 3])
print(t3, type(t3))

# 2. 特性
print((1, 2, 3) + (3,))
print((1, 2, 3) * 2)
print(1 in (1, 2, 3))
t = (1, 2, 3)
print(t[0])
print(t[-1])
print(t[:2])
print(t[1:])
print(t[::-1])

# 3. 常用方法: 元组是不可变数据类型(不能增删改)
# 查看: 通过索引和切片查看元素。 查看索引值和出现次数。
t = (1, 2, 3, 1, 1, 3)
print(t.count(1))   # 3
print(t.index(3))   # 2

7.6 命名元组的操作

tuple = ("westos", 18, "西安")
print(tuple[0], tuple[1], tuple[2])

# 从collections模块中导入namedtuple工具。
from collections import  namedtuple
# 1. 创建命名元组对象User
User = namedtuple('zzh', ('name', 'age', 'city'))
# 2. 给命名元组传值
user1 = User("westos", 18, "西安")
# 3. 打印命名元组
print(user1)
# 4. 获取命名元组指定的信息
print(user1.name)
print(user1.age)
print(user1.city)

7.7 is和==的区别

"""
python语言:
    ==: 类型和值是否相等
    is: 类型和值是否相等, 内存地址是否相等

"""
print(1 == '1')   # False
li = [1, 2, 3]
li1 = li.copy()
print(li == li1)  # True

# 查看内存地址
print(id(li), id(li1))
print(li is li1)  # False

7.8 列表的练习题

"""
编写一个云主机管理系统:
    - 添加云主机(IP, hostname,IDC)
    - 搜索云主机(顺序查找)
    - 删除云主机
    - 查看所有的云主机信息
"""
from collections import  namedtuple
menu = """
                云主机管理系统
        1). 添加云主机
        2). 搜索云主机(IP搜索)
        3). 删除云主机
        4). 云主机列表
        5). 退出系统
        
请输入你的选择: """

# 思考1. 所有的云主机信息如何存储?选择哪种数据类型存储呢?  选择列表
# 思考2: 每个云主机信息该如何存储?IP, hostname,IDC   选择命名元组
hosts = []
Host = namedtuple('Host', ('ip', 'hostname', 'idc'))
while True:
    choice = input(menu)
    if choice == '1':
        print('添加云主机'.center(50, '*'))
        ip = input("ip:")
        hostname = input("hostname:")
        idc = input('idc(eg:ali,huawei..):')
        host1 = Host(ip, hostname, idc)
        hosts.append(host1)
        print(f"添加{idc}的云主机成功.IP地址为{ip}")
    elif choice == '2':
        print('搜索云主机'.center(50, '*'))
        # 今天的作业: for循环(for...else),判断, break
    elif choice == '3':
        print('删除云主机'.center(50, '*'))
        # 今天的作业:(选做)
    elif choice == '4':
        print('云主机列表'.center(50, '*'))
        print("IP\t\t\thostname\tidc")
        count = 0
        for host in hosts:
            count += 1
            print(f'{host.ip}\t{host.hostname}\t{host.idc}')
        print('云主机总个数为', count)
    elif choice == '5':
        print("系统正在退出,欢迎下次使用......")
        exit()
    else:
        print("请输入正确的选项")

7.9 地址引用和深拷贝和浅拷贝

# 1. 值的引用
nums1 = [1, 2, 3]
nums2 = nums1
nums1.append(4)
print(nums2)   # 1, 2, 3, 4






# 2. 拷贝:浅拷贝和深拷贝
# 2-1). 浅拷贝
n1 = [1, 2, 3]
n2 = n1.copy()   # n1.copy和n1[:]都可以实现拷贝。
print(id(n1), id(n2))
n1.append(4)
print(n2)


# 2-2). 深拷贝
"""
可变数据类型(可增删改的): list
不可变数据类型:数值,str, tuple, namedtuple
"""
n1 = [1, 2, [1, 2]]
n2 = n1.copy()
# n1和n2的内存地址:的确拷贝了
print(id(n1), id(n2))
# n1[-1]和n2[-1]的内存地址:
print(id(n1[-1]), id(n2[-1]))
n1[-1].append(4)
print(n2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值