一、運算
1.1、算數運算

1.2、比較運算:

1.3、賦值運算:

1.4、邏輯運算:

1.5、成員運算:

針對邏輯運算的進一步研究:
1、在沒有()的情況下not 優先級高於 and,and優先級高於or,即優先級關系為( )>not>and>or,同一優先級從左往右計算。
2、 x or y , x為真,值就是x,x為假,值是y;
x and y, x為真,值是y,x為假,值是x。
3、Python運算符優先級,以下表格列出了從最高到最低優先級的所有運算符:
| 運算符 | 描述 |
|---|---|
| ** | 指數 (最高優先級) |
| ~ + - | 按位翻轉, 一元加號和減號 (最后兩個的方法名為 +@ 和 -@) |
| * / % // | 乘,除,取模和取整除 |
| + - | 加法減法 |
| >> << | 右移,左移運算符 |
| & | 位 'AND' |
| ^ | | 位運算符 |
| <= < > >= | 比較運算符 |
| <> == != | 等於運算符 |
| = %= /= //= -= += *= **= | 賦值運算符 |
| is is not | 身份運算符 |
| in not in | 成員運算符 |
| not and or | 邏輯運算符 |
二、基本數據類型
2.1、數字,int(整型)
在64位系統上,整數的位數為64位,取值范圍為-2**63~2**63-1,即-9223372036854775808~9223372036854775807
"hello world"
在Python中,加了引號的字符都被認為是字符串
2.3.1、索引:
a = 'ABCDEFGHIJK' print(a[1]) print(a[3]) print(a[5]) print(a[7])
執行結果:

2.3.2、切片,切片就是通過索引(索引:索引:步長)截取字符串的一段,形成新的字符串
a = 'ABCDEFGHIJK' print(a[1:3]) print(a[0:5]) print(a[0:]) #默認從開始到最后 print(a[0:-1]) # -1 是列表中最后一個元素的索引,但是取不到 print(a[0:5:2]) #加步長 print(a[5:0:-2]) #反向加步長
執行結果:

2.3.3、字符串常用方法:
最常用的為:join(字符串拼接)\spilt(切割)\find(查找)\strip(去空格)\upper、lower(大小寫轉換)\encode、decode(編碼、解碼)
a="abcABC"
#公共方法len(a),type(a)
a.capitalize() #首字母大寫
a.upper() #轉換大寫
a.lower() #轉換小寫
a.swapcase() #大小寫轉換
a.casefold() #轉換小寫
a.title() #轉換成標題
a.center(20,"*")#設置寬度,並居中,20為總長度,*為空白處填充
a.ljust(20,"*") #左邊
a.rjust(20,"*") #右邊
a.zfill(20) #默認使用0填充,長度20
a.expandtabs() #補tab鍵
a.count("xx",star,end) #計數出現次數,star開始位置,end結束位置
a.strip() #去全部空格、換行
a.lstrip("xx") #去除左邊 xx
a.lstrip() #去左邊空格
a.rstrip() #去右邊空格
a.partition("s") #字符串按照第一個s進行分割,分三份 (包含分割元素s)
a.split("s") #a.split("s",2) 按照s進行分割 ,2為分割次數 (不包含分割元素s)
a.splitlens() #按換行符分割
a.find("ex",start=None, end=None) #找到第一個對應字符串的索引,默認是找整體,也可單獨指定判斷位置 (找不到返回-1)
(a.index()與find相同,但找不到報錯 )
a.endswith("x") #以判斷x結尾
a.startswith("x",start=None, end=None)#判斷以x開頭,默認是找整體,也可單獨指定判斷位置
a.isalnum() #判斷字符串中包含數字或字符
a.isalpha()#判斷是否是字符
a.isdeciml() #判斷是否是數字 (10進制數字)
a.isdigit()#判斷是否是數字,支持特殊形式
a.isdentifier() #判斷字母、數字、下划線
a.islower()#判斷是否小寫
a.isupper()#判斷是否是大寫
a.isnumeric()#判斷是否是數字 支持特殊字符(中文)
a.isprintable() #判斷是否包含不可顯示的字符如:\t \n
a.isspace() #判斷是否全部 是空格
a.istitle() #判斷是否是標題
a.replace("xx","oo") #xx替換oo
a.join(xxx) #字符串拼接,a作為拼接符,重新拼接xxx (" ".join(xx) "xx".join(dd))
a.format(name="xxxx") #替換name
a.format_map
a.encode() #編碼 str轉換bytes
a.decode() #解碼 獲得字符串類型對象
a=["name","age","job","addr"]
2.4.2、增加
li = ["a","b","c"]
li.append("d") #增加到末尾
print(li)
li.insert(0,"aa") #按索引位置增加
print(li)
li.extend(['q,w,e']) #迭代增加
print(li)
li.extend('w')
li.extend('p,l,m')
print(li)
執行結果:

2.4.3、刪除
li = ["a","b","c"]
l1 = li.pop(1) #按照位置去刪除,有返回值,默認刪除最后一個值
print(l1)
print(li)
del li[1:3] #按照位置去刪除,也可切片刪除沒有返回值。
print(li)
li.remove('a') #按照元素去刪除
print(li)
執行結果:

2.4.4、改
li = ["a","b","c","d"] li[1] = 'dfasdfas' print(li) li[1:3] = ['b1','c1'] print(li)
執行結果:

2.4.5、查
切片去查,或者循環去查,與str的切片、索引相同
2.4.6 其他補充:
li = [] li.reverse() #將當前列表反轉 li.sort() #排序 默認從小到大 li.sort(reverse=True) #從大到小 li.copy() #淺拷貝 li.count(xxx) #計算元素xxx出現的次數 li.index(xx) #根據元素值獲取其索引位置 li.clear() #清空列表
dict = {"k1":"v1","k2":"v2"}
2.5.1、增加
dic = {"k1":"v1","k2":"v2"}
dic['li'] = ["a","b","c"]
dic.setdefault('k','v') #在字典中添加鍵值對,如果只有鍵那對應的值是none,但是如果原字典中存在設置的鍵值對,則他不會更改或者覆蓋。
print(dic)
2.5.2 、刪除
dic = {"name":"crazyjump","age":18,"job":"民工"}
dic_pop = dic.pop("a",'無key默認返回值') # pop根據key刪除鍵值對,並返回對應的值,如果沒有key則返回默認返回值
print(dic_pop)
print(dic)
del dic["name"] # 沒有返回值。
print(dic)
dic_pop1 = dic.popitem() # 隨機刪除字典中的某個鍵值對,將刪除的鍵值對以元祖的形式返回
print(dic_pop1)
print(dic)
dic_clear = dic.clear() # 清空字典
print(dic,dic_clear) # {} None
執行結果:

2.5.3、改
dic = {"name":"crazyjump","age":18,"job":"民工"}
dic1 = {"age":20,"k":"v"}
dic.update(dic1) # 將dic1所有的鍵值對覆蓋添加(相同的覆蓋,沒有的添加)到dic中
print(dic)
執行結果:

2.5.4、查
dic = {"name":"crazyjump","age":18,"job":"民工"}
value = dic["name"]
print(value)
print(dic.get("n")) #key值不存在返回None
print(dic.get("s",12 )) #值不存在,返回定義的12
dic.setdefault("x","z") #不存在就新增,存在獲取當前值
print(dic.setdefault("name","z"))
print(dic)
執行結果:

2.5.5、字典的循環
dic = {"name": "crazyjump", "age": 18, "job": "民工"}
for k, v in dic.items():
print(k, v)
for k in dic.items():
print(k)
for k in dic.keys():
print(k)
for v in dic.values():
print(v)
for k in dic:
print(k)
執行結果:

2.5.6、補充(可迭代對象)
dic = {"name":"crazyjump","age":18,"job":"民工"}
l = dic.items()
print(l)
k = dic.keys()
print(k)
v = dic.values()
print(v)
執行結果:

tu=(11,22,33,"aaa")
集合是無序的,不重復的數據集合,它里面的元素是可哈希的(不可變類型),但是集合本身是不可哈希(所以集合做不了字典的鍵)的。以下是集合最重要的兩點:
去重,把一個列表變成集合,就自動去重了。
關系測試,測試兩組數據之前的交集、差集、並集等關系。
2.7.1、創建集合:
set1 = set({1,2,'xxx'})
set2 = {1,2,'xxx'}
2.7.2、增加
set1={"a","b",12,"c"}
set1.add("d") #增加
set1.update('A') #迭代增加
print(set1)
set1.update('哈哈')
print(set1)
set1.update([1,2,3])
print(set1)
2.7.3、刪
set1={"a","b",12,"c"}
set1.pop() #刪除任意一個
set1.remove(12) #刪除指定xx,指定的元素不存在會報錯
set1.discard("xx") #刪除指定xx ,指定的元素不存在不會報錯
print(set1)
set1.clear() #清空集合
print(set1)
執行結果:

補充:集合查詢使用循環即可
2.7.4、集合的其他操作
2.7.4.1、交集 (& 或者 intersection)
set1 = {1,7,8,4,5}
set2 = {4,5,6,7,8}
print(set1 & set2)
print(set1.intersection(set2))
執行結果:

2.7.4.2、並集(| 或者 union)
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 | set2)
print(set2.union(set1))
執行結果:

2.7.4.3、差集。(- 或者 difference)
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 - set2)
print(set1.difference(set2)) #set獨有的
執行結果:

2.7.4.4、反交集。 (^ 或者 symmetric_difference)
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 ^ set2)
print(set1.symmetric_difference(set2))
執行結果:

2.7.4.5、子集與超集
set1 = {1,2,3}
set2 = {1,2,3,4,5,6}
print(set1 < set2)
print(set1.issubset(set2)) # 這兩個相同,都是說明set1是set2子集。
print(set2 > set1)
print(set2.issuperset(set1)) # 這兩個相同,都是說明set2是set1超集。
2.7.4.6、frozenset不可變集合,讓集合變成不可變類型。
s = frozenset('barry')
print(s,type(s)) # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>
三、數據類型總結
3.1、數字:不可變,直接訪問
3.2、字符串:不可變,順序訪問
3.3、列表:可變、有序、順序訪問
3.4、字典:可變、無序、key值訪問
3.5、元組:不可變、有序、順序訪問
3.6、布爾值:不可變
3.7、集合:無序、不重復
補充
一、格式化輸出:
1.1、%s
name = input('你的姓名:')
age = input('你的年齡:')
job = input('你的工作:')
info = "歡迎 %s,你的年齡是:%s ,你的工作是:%s "%(name,age,job)
print(info)
執行結果:

%s就是代表字符串占位符,除此之外,還有%d是數字占位符,%f是浮點數, 如果把上面的age后面的換成%d,就代表你必須只能輸入數字,否則就會報錯 (另%3==3%%)
1.2、srt.format()
a = "{},{}".format("hello","world")
# 默認順序
b = "{1},{0},{1}".format("hello","world")
#指定順序
c = "{name},{age}".format(name="crazyjump",age=12)
print("a:",a)
print("b:",b)
print("c:",c)
執行結果:

二、for 循環(用戶按照順序循環可迭代對象的內容):
msg = "crazyjump"
for item in msg:
print(item)
data = [1,2,3,4]
for item in msg:
print(iterm)
三、enumrate為可迭代的對象添加序號
li = ['a','b','c','d','e']
for i in enumerate(li):
print(i)
for index,name in enumerate(li,1): #索引默認從0開始,可改成1開始
print(index,name)
執行結果:

四、range 指定范圍,生成指定數字。
for i in range(1,10):
print(i)
for i in range(1,10,2): # 步長
print(i)
for i in range(10,1,-2): # 反向步長
print(i)
五、深淺拷貝
5.1、淺拷貝 (id() 對象的內存地址)
li = ["a", "b", ['crazy', 'jump']] l1 = li.copy() print(li, id(li)) print(l1, id(l1)) li[1] = "c" print(l1, id(l1)) print(li, id(li)) li[2][0] = 'DB' print(l1, id(l1[2])) print(li, id(li[2]))
執行結果:

對於淺copy來說,第一層創建的是新的內存地址,而從第二層開始,指向的都是同一個內存地址,所以,對於第二層以及更深的層數來說,保持一致性。
5.2、深拷貝
import copy l1 = ["a",['crazy','jump']] l2 = copy.deepcopy(l1) print(l1,id(l1)) print(l2,id(l2)) l1[0] = 222 print(l1,id(l1)) print(l2,id(l2)) l1[1][0]="db" print(l1,id(l1[1])) print(l2,id(l2[1]))
執行結果:

對於深copy來說,兩個是完全獨立的,改變任意一個的任何元素(無論多少層),另一個絕對不改變
