python基础——2.字符串,列表,元组,字典,集合,深浅拷贝
一.字符串
1.字符串的索引和切片
[0::1]
[::-1]
[-1::]
2.字符串的部分方法
s.capitelize() #首字母大写
s.title() #中间用空格或者特殊字符隔开的首字母都大写
s.lower() #a-z全部小写
s.casefold() #非英文也可以小写,python3引入
s.upper() #全大写
s.swapcase() #大小写反转
s.ljust(int,任意字符) #左对齐 rjust右对齐
s.center(int,任意字符) #中间对齐
s.expandtabs() #中间有\t置换成8位空格
len(s) #计算长度
s.count("x") #计算元素次数
s.find("x") #是否有x元素,默认返回第一个的索引,找不到返回-1;有rfind
s.endswith("x") #是否以什么结尾,可("xx",初始下标,结束下标)
s.startswith("x") #遵循顾头不顾尾,否则报错
s.index("x") #通过元素找索引,找不到报错
s.strip() #去掉元素前后的空格,括号里可以加元素.有空格,元素去不掉
s.split() #切割;什么都不加,直接转单一元素表;加空字符串报错
s.splitlines() #按行(\r\rn\n)分割.如果参数keepends为False,不包含换行符
s.replace() #(old,new,count)不写次数默认全替换,替换的元素不能是Int
s.isspace() #是否空格
s.isalnum() #是否数字字母
s.isalpha() #是否字母
s.isdigit() #是否数字
s.isdecimal() #是否十进制字符,只存在于unicode对象.(定义十进制字符串,需在字符串前加'u')
s.isnumeric() #是否数字组成,只针对unicode对象.
3.字符串是不可变数据类型
二.列表
1.列表是可变数据类型
2.列表不仅可存放不同类型数据,还可存放大量数据.32位5亿,64位1152921504606846975
3.创建列表的几种方式
lis = list() # 只能创建空列表
lis = list([])
lis = []
lis = list(range())
lis = list("abcdefg")
4.列表的增删改查
lis.append() # 将元素添加到列表尾部
lis.extend() # 将所有元素迭代追加到列表中
lis.insert(index,object) # 将元素插入指定下标
以上打印返回none;打印元列表有变;append效率高于insert
lis.pop(index) # 删除给定位置元素,返回删掉元素;默认删最后一个
lis.remove(object) # 删除列表中第一次出现的给定元素;不存在默认
lis.clear() # 清空
del lis[index] # 可以切片删
lis[index] = object # 替换元素,可以切片,迭代的替换
lis.index(object) # 返回元素出现第一个下标
lis.count(object) # 元素出现次数
5.列表的切片和排序(列表里同时有str和int不能排序)
lis.reverse() # 将元素中列表倒序
lis.sort() # 升序排序
lis.sort(reverse=True) # 降序排序
lis = sorted(lis, key=object) # 创建排序后的列表
# def func(name):
return len(name)
lis = sorted(lis, key=func)
# lis = sorted(lis, key=lambda name:(len(name)))
# 注意:sort和sorted都可以加参数key
sort和reverse是list自带的方法
sorted和reversed是内建函数
sorted返回的是新列表,reversed返回的是迭代器
sort和reverse是作用在旧列表上
6.列表的三元表达式和列表推导式
lis1 = [1, 2, 3, 4, 5]
for i in lis1:
lis2.append(i)
lis2 = [i for i in lis1]
# 列表直接赋值给新表的结果是修改原列表,新列表也会变
lis = [i for i in range(30) if i % 3 == 0]
lis3 = [j for i in lis for j in i if j.count("e") == 2]
# 列表推导式的结果是一个generator 不加括号报错,加中括号是将转list,加小括号就是generator
# 目前测试生成器generator可以直接加中括号强转,iterator不能加中括号强转
# generator == [] iterator == list()
7.列表的复制
1. lis2 = lis1 + []
2. lis2 = [x for x in lis1]
8.将列表传递给函数时,由于列表是可变数据类型,所以列表的内容可能会在函数调用后改变
三.字典
1.字典是可变数据类型
2.字典是python中唯一映射数据类型
3.字典的特点是查询效率高;存储大量的关系型数据
4.通过Key查找value,内部使用Key来计算一个内存地址
5.key是不可变数据类型 元组、bool、int、str
6.python3.5以前字典是无序的
7.创建字典的几种方式以及zip用法
information_dic = {"name": "wg", "age": 33}
information_dic = dict([("name", "wg"), ("age", 33)])
information_dic = dict("name"=”wg“, age=33)
information_dic = dict(zip(lis1, lis2))
8.字典的增删改查
information_dic["high"] = 185 # 有key修改value,没有增加
information_dic.setdefault("weight", 122) # 有key不修改value,没有增加
information_dic.update(information1) # 有key修改value,没有增加
information_dic = {键: 值,}
information_dic.get(key) # 是否有键,没有返回none;括号中可以设置0,返回0
information_dic.setdefault("键") # 没有返回None
information_dic["键"] # 没有就报错
information_dic.keys() # 查键,返回列表
information_dic.values() # 查值,返回列表
informaiton_dic.items() # 查键值对,返回元组
for i in information (.keys,.values,.items) # 什么都不加返回键
information_dic.pop(key, 设置返回值) # 可以测试是否有键
information_dic.popitem() # 随机删;3.6以后默认删最后一个;返回键值对元组
del information_dic[key]
information.clear() # 清空
9.关于fromkeys的坑
information_dic = dict.fromkeys() # 新字典通过第1个参数迭代做k,第2个参数做值
dict.fromkeys([], "")
# 只改变一个值
information_dic[key] = ""
# 全改变
dict.fromkeys([], [])
information_dic[].append("") # 所有键值对的id一样
# 这里我们说是受是否可变数据类型影响应该
10.解构和解包
a, b = 10, 20 == (10, 20) == [10, 20] # 元组和列表都有这功能
for item in dic.items():
k,v = item
print(k)
print(v)
#json长的就是字典样式
11.字典推导式
dic1 = {dic[k]: k for k in dic}
dic = {"a": 1, "b": 2, "A": 3, "D": 4}
# dic1 = {}
# for k in dic:
# # dic1[k.lower()] = dic.get(k.upper(), 0) + dic.get(k.lower(), 0)
# dic1.setdefault(k.lower(), dic.get(k.upper(), 0) + dic.get(k.lower(), 0))
# print(dic1)
dic2 = {k.lower(): dic.get(k.upper(), 0) + dic.get(k.lower(), 0) for k in dic}
print(dic2)
12.提取单一元素字典key,value的方法
# d = {'name':'haohao'}
# (k, v), = d.items()
# print(k)
#
# d = {'name':'haohao'}
# k = list(d)[0]
# v = list(d.values())[0]
# print(k)
#
# d = {'name':'haohao'}
# k, = d
# v, = d.values()
# print(k)
四.元组
1.元组不可变数据类型;元组的元素可变(孙子),根据数据类型决定;
2.元组是不可变的列表,只读列表,有索引,可查询,可循环,可切片
3.元组只有一个元素的时候要加逗号,否则type不是元组;空元组用tuple()表示
4.元组的增删改查
tup = tup1 + tup2 # 元组不支持修改,可以连接组合方式增加
tup = tup * x
del tup # 元组不支持删除单个元素,可以删整个
tup = tup[0], tup[1] # 元组不能修改元组元素,可以通过拼接构造一个新元组
tup[index]
tup[index1:index2] # 可查询可切片
五.集合
1.集合是可变数据类型;它里边的元素必须是不可变数据类型
2.set就是不存value的字典,只存key
3.set中的元素是不能重复的,无序的,可哈希的;因为无序,所以没有索引
4.哈希的特点就是散列,所以set内部是无序的.
5.s = set() 空集合
6.创建set的几种方式
set = ({})
set = {}
set = set({})
7.set的增删改查
set.add() # 正常增加
set.update() # 迭代添加,如果加的是字符串,则拆分字符串
for i in set # 随机刷数据
set.pop() # 随机删,不要添加元素
set.remove() # 按元素删 如果元素不存在,报错
set.clear() # 清空集合 打印集合得到的结果是set()
8.交集并集反交集...
set1&set2 # 得到交集
set1.intersection(set2) # 同样的到交集
set1^set2 # 得到差集
set1.symmetric_difference(set2) # 同上
set1-set2 # 得到set1独有差集
set.difference(set2) # 同上
set1 < set2 # 说明set1是set2子集
set1.issubset(set2)
9.frozenset冻结集合,它是不可变的,存在哈希值,好处是可以作为字典的Key,也可作为其他集合的元素.缺点是创建不能修改,没有add,remove方法.
s = frozenset("barry")
print(s, type(s))
10.操作小技巧
set1 -= set2("") # 直接删掉字符串拆分后的内容
set("posh") == set("shop")
set1 | set2 # 合并集合
set.discard(obj) # 这个方法删除,如果元素不存在不报错,返回none
11.集合推导式
s = {x**2 for x in [1, -1, 2]}
六.总结
1.不可变数据类型:元组、bool、int、str
可变数据类型:列表、字典、集合
当该数据类型的对应变量值发生改变,那么它对应的内存地址也会改变,不可变数据类型
2.元组是只读列表;集合是不存value的字典;元组的元素是可变的,集合的元素是不可变的;
七.深浅拷贝
浅拷贝就是修改其中一个数据,必然影响另一个数据
深拷贝需要用copy模块