1. 序列
序列:成员有序排列,可以通过下标偏移量访问到它的一个或者几个成员,这类类型统称为序列。 序列数据包括:字符串、列表和元组类型。 特点:都支持索引和切片操作符;成员关系操作符(in,not in);连接符(+)&重复操作符(*)
2. 列表
数组array:存储同种数据类型的数据结构。[1,2,3],[1.1,2.2,3.1] 列表list:打了激素的数组,可以存储不同数据类型的数据结构。[1,2.2,‘hello’]
列表的创建:
li = []
print(li, type(li))
li1 = [1]
print(li1, type(li1))
2.1 列表的特性
2.1.1 列表的连接操作符和重复操作符
print([1,2] + [2,3]) #[1,2,2,3]
print([1,2] *3) #[1,2,1,2,1,2]
2.1.2 列表的成员操作符(in,not in)
print(1 in [1,2,3])
"""#返回的数据类型为bool型
布尔类型:
True: 1
False: 0
"""
print(1 in ["a", True, [1,2]])
print(1 in ["a", False, [1,2]])
2.1.3 列表的索引
根据索引来返回索引到的值;
li = [1,2,3,[1,2,3]]
print(li[0])
print(li[-1])
li1 = [1,2,3,[1,"b",3]]
print(li1[-1])
print(li1[-1][0])
print(li1[3][-1])
2.1.4 列表的切片
li = ['172','25','254','100']
print(li[:2])
print(li[1:])
print(li[::-1])
如已知一个列表信息为 [‘172’,‘25’,‘254’,‘100’],现在需要输出’100-254-25“;
print('-'.join(li[3:0:-1]))
print('-'.join(li[:0:-1]))
print('-'.join(li[1:][::-1]))
2.1.5 列表的循环(for)
names = ['小张','张哥','张师']
for name in names:
print(f"zxk的别名是:{name}")
2.2 列表的基本操作(增删改查)
2.2.1 列表的增加
- 追加
追加默认是在列表的最后添加;
li = [1,2,3]
li.append(4)
print(li) #[1, 2, 3, 4]
- 在列表开头添加
li = [1,2,3]
li.insert(0,'cat')
print(li)
li = [1,2,3]
li.insert(2,'cat')
print(li)
- 一次追加多个元素
li = [1,2,3]
li.append([4,5,6])
print(li)
li.extend([4,5,6])
print(li)
2.2.2 列表的修改
通过索引和切片重新赋值的方式去修改;
li = [1,2,3]
li[0] = 'cat'
print(li)
li[-1] = 'westos'
print(li)
li = [1,2,3]
li[:2] = ['cat','westos']
print(li)
2.2.3 查看
通过索引和切片查看元素,查看索引值和出现次数;
li = [1,2,3,4,3,2,3]
print(li.count(1))
print(li.index(3))
2.2.4 列表的删除
- 根据索引删除
li = [1,2,3]
delete_num = li.pop(-1)
print(li)
print("删除的元素是:",delete_num)
- 根据value值删除
li = [1,2,3]
li.remove(3)
print(li)
- 全部清空
li =[1,2,3]
li.clear()
print(li)
2.2.5 其他操作
除了上面的之外还有反转,排序,复制等操作;
li =[5,4,13,20]
li.reverse()
print(li)
li.sort()
print(li)
li.sort(reverse=True)
print(li)
li1 = li.copy()
print(id(li),id(li1))
print(li,li1)
3. 元组
元组tuple:带了紧箍咒的列表,和列表的唯一区别是不能增删改。
3.1 元组的创建
元组中只有一个元素时一定要添加逗号,不然会将其试做对应的信息,
t1 = ()
print(t1,type(t1))
t2 = (1)
print(t2,type(t2))
t3 = (1,2.2,True,[1,2,3,])
print(t3,type(t3))
3.2 元组的特性
由于元组是带了紧箍咒的列表,所以没有增删改的特性;
1. 连接符和重复操作符
print((1,2,3)+(3,))
print((1,2,3) *2)
2. 成员操作符
print(1 in (1,2,3))
3. 切片和索引
t = (1,2,3)
print(t[0])
print(t[-1])
print(t[:2])
print(t[1:])
print(t[::-1])
查看:通过索引和切片查看元素,查看索引值和出现次数;
t = (1,4,5,2,3,4)
print(t.count(4))
print(t.index(2))
3.3 元组的命名
Tuple还有一个兄弟,叫namedtuple。虽然都是tuple,但是功能更为强大。
collections.namedtuple(typename, field_names)
typename:类名称
field_names: 元组中元素的名称
- 实例化命名元组
tuple = ('name','age','city')
print(tuple[0],tuple[1],tuple[2])
- 可以从
collections 模块中导入namedtuple 工具:
from collections import namedtuple
User = namedtuple('User',('name','age','city'))
user1 = User("zxk",24,"西安")
print(user1)
print(user1.name)
print(user1.age)
print(user1.city)
4. 深拷贝和浅拷贝
问题: 深拷贝和浅拷贝的区别? python中如何拷贝一个对象? 赋值: 创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。(=) 浅拷贝: 对另外一个变量的内存地址的拷贝,这两个变量指向同一个内存地址的变量值。(li.copy(), copy.copy())
公用一个值;
这两个变量的内存地址一样;
对其中一个变量的值改变,另外一个变量的值也会改变;
深拷贝: 一个变量对另外一个变量的值拷贝。(copy.deepcopy())
两个变量的内存地址不同;
两个变量各有自己的值,且互不影响;
对其任意一个变量的值的改变不会影响另外一个;
4.1 值的引用
nums1 = [1,2,3]
nums2 = nums1
nums1.append(4)
print(nums2)
因为num1和num2指向同一个内存空间,所以当nums1添加值时,相当于nums2也添加了值。
4.2 浅拷贝
n1 = [1,2,3]
n2 = n1.copy()
print(id(n1),id(n2))
n1.append(4)
print(n2)
加粗样式
4.3 深拷贝
有列表嵌套时,或者说列表中包含可变数据类型时,一定要选择深拷贝.
可变数据类型(可增删改的):列表(list) 不可变数据类型:数值,字符串(str),元组(tuple) namedtuple;变量指向内存空间的值不会改变。
n1 = [1,2,[1,2]]
n2 = n1.copy()
print(id(n1),id(n2))
print(id(n1[-1]),id(n2[-1]))
n1[-1].append(4)
print(n1) #[1, 2, [1, 2, 4]]
print(n2) #[1, 2, [1, 2, 4]]
深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
假设B复制了A,在修改A的时候,看B是否发生变化:
如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)
如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)
如何实现深拷贝 copy.deepcopy
import copy
n1 = [1,2,[1,2]]
n2 = copy.deepcopy(n1)
print(id(n1),id(n2))
print(id(n1[-1]),id(n2[-1]))
n1[-1].append(4)
print(n2)
5. is 和 ==的对比
在 python 语言中 : ==:判断类型和值是否相等 is: 类型和值是否相等,内存地址是否相等
== is和==两种运算符在应用上的本质区别是 :
1). Python中对象的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。
2). is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。
3). ==用来比较判断两个对象的value(值)是否相等;(type和value) is也被叫做同一性运算符, 会判断id是否相同;(id, type 和value)
print(1 == '1')
li = [1,2,3]
li1 = li.copy()
print(li == li1)
print(id(li),id(li1))
print(li is li1)
快速注释代码的快捷键:ctrl+/
快速缩进的快捷键:选中需要缩进的代码+tab
快速取消缩进的快捷键:选中需要缩进的代码 ,按shift+tab
练习:云主机管理系统
编写一个云主机管理系统: - 创建云主机(IP,hostname,IDC) - 搜索云主机(顺序查找) - 删除云主机 -查看所有云主机信息
from collections import namedtuple
menu = """
云主机管理系统
1).添加云主机
2).搜索云主机(IP搜索)
3).删除云主机
4).云主机列表
5). 退出系统
请输入您的选择:"""
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 host in hosts:
ipv4 = input("please input ipv4:")
if ipv4 == host.ip:
print(f'{ipv4}对应的主机为{host.hostname}')
else:
break
elif choice == '3':
print("删除云主机".center(50,"*"))
for host in hosts:
delete_hostname = input("please input delete hostname:")
if delete_hostname == host.hostname:
hosts.remove(host)
print(f'对应的主机{delete_hostname}已经删除')
else:
break
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(f'云主机总个数为:{count}')
elif choice == '5':
print("系统正在退出,欢迎下次使用......")
exit()
else:
print("请输入正确的选项!")
|