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模組