1 python数据结构
list,tuple,set,dict
tuple:有序列表,但初始化后数据便不可修改(没有提供增删查改的方法)
dict:哈希表,数据存储的格式是一种键值对(key-value)的形式。根据key的值能直接找到对应的内存地址,进而找到数据,所以查找速度比list快
set:set的实现跟dict类似,只不过少了key,且数据不可重复
2 有序和无序,可变和不可变
有序:list,tuple
无序:dict,set(哈希表)
可变和不可变
不可变:tuple(元祖),数值型,字符串型string
不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中只有一个对象(一个地址)
a=1
b=1
print("第一次打印")
print(id(a))
print(id(b))
a=2
b=1
print("第二次打印")
print(id(a))
print(id(b))
第一次打印
1753050128
1753050128
第二次打印
1753050160
1753050128
可变:列表(list)和字典
允许变量的值发生变化,即如果对变量进行append,+=等操作以后,只是改变了变量的值,而不会新建一个对象,变量的引用的对象的地址也不会发生变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份
a = [1,2]
b = [1,2]
print("第一次打印")
print(id(a))
print(id(b))
print("第二次打印")
a.append(3)
print(id(a))
print(id(b))
C:\Users\xiaoyu\PycharmProjects\python_100\venv\Scripts\python.exe C:/Users/xiaoyu/PycharmProjects/python_100/python_3.py
第一次打印
2638827043080
2638826183304
第二次打印
2638827043080
2638826183304
3 适用场景
list VS tuple:
1.list和tuple都是有序列表
2.list内的数据是可增删查改的,而tuple内的数据一旦初始化后便不可修改
list VS dict:
list是有序的,dict是无序的;
两者都是可增删查改的;
list的插入查找速度没有比dict快,且随着数据的增大差距更明显;
虽然list的速度较慢,但是占用内存较小(不用存储key)
set:set的数据也是无序的,适合于数据不重复的场景
4 对列表可进行的操作(增删改查)
列表是可变的,这是他区别于字符串和元组最重要的特点,列表可以修改,而字符串和元组不能。
(1)创建
通过下面的方式创建
list=['hello,world']
print(list)
list_number=[1,2,3]
print(list_number)
输出:
C:\Users\xiaoyu\PycharmProjects\python_100\venv\Scripts\python.exe C:/Users/xiaoyu/PycharmProjects/python_100/python_3.py
['hello,world']
[1, 2, 3]
或者通过list()创建
list=list('hello world')
print(list)
输出:
C:\Users\xiaoyu\PycharmProjects\python_100\venv\Scripts\python.exe C:/Users/xiaoyu/PycharmProjects/python_100/python_3.py
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
(2)访问
使用下标索引来访问列表中的值,同样你也可以使用方括号的形式截取字符
list = ['physics', 'chemistry', 1997, 2000]
list_next = [1, 2, 3, 4, 5, 6, 7 ]
print ("list[0]:%s "% list[0])
print ("list_next[1:5]:%s " % list_next[1:5])
输出:
C:\Users\xiaoyu\PycharmProjects\python_100\venv\Scripts\python.exe C:/Users/xiaoyu/PycharmProjects/python_100/python_3.py
list[0]:physics
list_next[1:5]:[2, 3, 4, 5]
(3)更新
你可以对列表的数据项进行修改或更新,你也可以使用append()方法来添加列表项
list = [] ## 空列表
list.append('Google') ## 使用 append() 添加元素
list.append('Runoob')
print (list)
输出:
C:\Users\xiaoyu\PycharmProjects\python_100\venv\Scripts\python.exe C:/Users/xiaoyu/PycharmProjects/python_100/python_3.py
['Google', 'Runoob']
(4)删除
list = ['physics', 'chemistry', 1997, 2000]
print (list)
del list[2]
print ("After deleting value at index 2 : ")
print (list)
输出:
C:\Users\xiaoyu\PycharmProjects\python_100\venv\Scripts\python.exe C:/Users/xiaoyu/PycharmProjects/python_100/python_3.py
['physics', 'chemistry', 1997, 2000]
After deleting value at index 2 :
['physics', 'chemistry', 2000]
方法:
1 list.append(obj) 在列表末尾添加新的对象
2 list.count(obj) 统计某个元素在列表中出现的次数
list = ['physics', 'chemistry', 1997, 2000]
print(list.count("physics"))
1
3 list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4 list.index(obj) 从列表中找出某个值第一个匹配项的索引位置
5 list.insert(index, obj) 将对象插入列表
6 list.pop(obj=list[-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
7 list.remove(obj) 移除列表中某个值的第一个匹配项
8 list.reverse() 反向列表中元素
9 list.sort([func]) 对原列表进行排序
5 对元祖的操作
元组与列表一样,也是一种序列,唯一不同的是元组不能被修改(字符串其实也有这种特点)。
(1)创建
a = 1, 2, 3
print(a)
b = 'hello', 'world'
print(b)
c = (1, 2, 3, 4)
print(c)
d = ()
print(d)
e = (1,)
print(e)
输出:
C:\Users\xiaoyu\PycharmProjects\python_100\venv\Scripts\python.exe C:/Users/xiaoyu/PycharmProjects/python_100/python_3.py
(1, 2, 3)
('hello', 'world')
(1, 2, 3, 4)
()
(1,)
逗号分隔值,元组自动创建完成
元组大部分用圆括号括起来
空元组可以用没有包含内容的圆括号表示
只含一个值的元组,必须加个逗号(,)
6对字符串的操作
字符串
(1)创建
my_str = 'Hello world'
print (my_str)
print (my_str[0])
for c in my_str:
print (c)
print (type(my_str))
输出
Hello world
H
H
e
l
l
o
w
o
r
l
d
<class 'str'>
字符串的格式化
my_str='Hello,%s' % 'world.'
print (my_str)
输出:
字符串的格式化,特别是在数据库语句中还是用的挺多,用法也多样性。这个会单拎出来做专题讲
对数字进行格式化处理,通常需要控制输出的宽度和精度:
from math import pi
my_str = ‘%.2f’ % pi # 精度2
print my_str
my_str = ‘%10f’ % pi # 字段宽10
print my_str
my_str = ‘%10.2f’ % pi # 字段宽10,精度2
print my_str
输出:
通用序列操作(方法)
从列表、元组以及字符串可以“抽象”出序列的一些公共通用方法(不是你想像中的CRUD),这些操作包括:索引(indexing)、分片(sliceing)、加(adding)、乘(multiplying)以及检查某个元素是否属于序列的成员。除此之外,还有计算序列长度、最大最小元素等内置函数
(1)索引
str1 = ‘Hello’
nums = [1, 2, 3, 4]
t1 = (123, 234, 345)
print str1[0]
print nums[1]
print t1[2]
H
2
345
索引从0(从左向右)开始,所有序列可通过这种方式进行索引。神奇的是,索引可以从最后一个位置(从右向左)开始,编号是-1:
str1=‘Hello’
nums=[1,2,3,4]
t1=(123,234,345)
print str1[-1]
print nums[-2]
print t1[-3]
o
3
123
分片
分片操作用来访问一定范围内的元素。分片通过冒号相隔的两个索引来实现:
nums=range(10)
print nums
print nums[1:5]
print nums[6:10]
print nums[1:]
print nums[-3:-1]
print nums[-3:] #包括序列结尾的元素,置空最后一个索引
print nums[:] #复制整个序列
输出
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4]
[6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[7, 8]
[7, 8, 9]
序列相加
str1=‘Hello’
str2=’ world’
print str1+str2
num1=[1,2,3]
num2=[2,3,4]
print num1+num2
print str1+num1
输出
Hello world
[1, 2, 3, 2, 3, 4]
乘法
print [None]10
str1=‘Hello’
print str12
num1=[1,2]
print num12
print str1num1
输出
[None, None, None, None, None, None, None, None, None, None]
HelloHello
[1, 2, 1, 2]
Traceback (most recent call last):
print str1*num1
TypeError: can’t multiply sequence by non-int of type ‘list’
成员资格
in运算符会用来检查一个对象是否为某个序列(或者其他类型)的成员(即元素):
str1=‘Hello’
print ‘h’ in str1
print ‘H’ in str1
num1=[1,2]
print 1 in num1
False
True
True
长度、最大最小值
通过内建函数len、max和min可以返回序列中所包含元素的数量、最大和最小元素。
str1=‘Hello’
print len(str1)
print max(str1)
print min(str1)
num1=[1,2,1,4,123]
print len(num1)
print max(num1)
print min(num1)