算術運算子
a = 3
b = 4
print(a + b) # 7
print(a - b) # -1
print(a * b) # 12
print(a / b) # 0.75
print(a % b) # 3
print(a ** b) # 81
print(a // b) # 0 整除
比較(關係)運算子
注意:
- =是賦值運算子,==是比較運算子
- 比較運算子的結果一定是bool型別的
擴充套件知識:比較兩個非基本資料型別的變數
list1 = [11, 22, 33] list2 = [11, 22, 33] # 在python中==比較列表,元組,字典比較的是內容值 print(list1 == list2) # True # 比較兩個非基本資料型別: # 方式1:使用is關鍵字 print(list1 is list2) # False # 方式2:使用python內建函式id() print(id(list1)) print(id(list2)) print(id(list1) == id(list2)) # False
賦值運算子
邏輯運算子
- and 且 有False則False
a = 3
b = 4
print(a > 3 and b > 4) # False and False = False
print(a == 3 and b > 4) # True and False = False
print(a > 3 and b == 4) # False and True = False
print(a == 3 and b == 4) # True and True = True
- or 或 有True則True
a = 3
b = 4
print(a > 3 or b > 4) # False or False = False
print(a == 3 or b > 4) # True or False = True
print(a > 3 or b == 4) # False or True = True
print(a == 3 or b == 4) # True or True = True
- not 將True變成False, 將False變成True
a = 3
b = 4
print(not a > b) # True
位運算子
進位制
將整數分了幾種進製表示法: 二進位制:由0,1構成,逢2進1,以0b開頭 八進位制:由0,1,2,3,4,5,6,7構成,逢8進1,以0開頭 十進位制:由0,1,2,3,4,5,6,7,8,9構成,逢10進1,預設就是10進位制 十六進位制:由0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,逢16進1,以0x開頭
- 如何從其他進位制轉10進位制
十進位制轉十進位制 十進位制:12345 十進位制:12345 12345 = 10000 + 2000 + 300 + 40 + 5 = 1*10^4 + 2*10^3 + 3*10^2 + 4*10^1 + 5*10^0 = 10000 + 2000 + 300 + 40 + 5 = 12345 規律口訣:係數*進位制的冪次方之和 例如: 二進位制:0b10011 10011 => 1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 16 + 2 + 1 = 19
- 如何從10進位制轉其他進位制
除基取餘,直到商為0,餘數反轉
十進位制:108 二進位制:0b1101100 108/2 = 54 ......0 54/2 = 27 ......0 27/2 = 13 ......1 13/2 = 6 ......1 6/2 = 3 ......0 3/2 = 1 ......1 1/2 = 0 ......1
如何從其他進位制轉其他進位制
- 拆分組合法【只適合二進位制轉八進位制或者16進位制】
- 二進位制轉八進位制 從右向左,每3位一組合,每個組合算自己的10進位制結果,拼接
- 二進位制轉十六進位制 從右向左,每4位一組合,每個組合算自己的10進位制結果,拼接
二進位制:0b1101100 八進位制:0154 100->4 101->5 001->1 二進位制:0b1101100 十六進位制:0x6c 1100->12 0110->6
先轉10進位制,再轉其他進位制
原碼 反碼 補碼
- 在計算機所有資料的運算採用的是補碼進行的
- 原碼 反碼 補碼均都是資料的二進位制的形式
原碼: 正數:數值位就是二進位制的表現形式,最高位符號位就是0 負數:數值位和正數保持一致,但是最高符號位為1 舉例: 3的原碼: 1. 3的二進位制:11 2. 3的原碼: 00000011 -4的原碼: 1. 4的二進位制:100 2. -4的原碼: 10000100 反碼: 正數:和原碼保持一致 負數:符號位原碼保持一致,數值位按位取反 舉例: 3的反碼: 00000011 -4的反碼:11111011 補碼: 正數:和原碼保持一致 負數:是反碼的基礎之上末尾+1 舉例: 3的補碼: 00000011 -4的補碼:11111100 舉例:-4+3 = -1 -4的補碼+3的補碼: 00000011 + 11111100 ----------- 補碼:11111111 我們最終看到的結果是轉原碼再轉10進位制之後的結果 -1 已知補碼求原碼: 符號位 數值位 補碼: 1 1111111 反碼: 1 1111110 原碼: 1 0000001 -------------------------- 數值位轉10進位制:1,又因為最高位是1,所以是負數,索引最終的結果是 -1
3的補碼: 00000011
-4的補碼:11111100
a = 3
b = -4
print(a & b) # 0 有0則0
00000011
& 11111100
------------------
00000000
print(a | b) # -1 有1則1
00000011
| 11111100
-----------------
補碼:11111111
已知補碼求原碼
補碼: 11111111
反碼: 11111110
原碼: 10000001
----------------
結果: -1
print(a ^ b) # -1 相同則0,不同則1
00000011
& 11111100
-----------------
補碼:11111111
已知補碼求原碼
補碼: 11111111
反碼: 11111110
原碼: 10000001
----------------
結果: -1
print(~ b) # 3
~ 11111100
-------------
00000011
12的補碼: 00001100
-12的補碼:11110100
print(12<<2) 左移,左邊多的位丟棄,右邊用0補齊,左移n位相當於*2^n
00001100
左移2位 (00)00110000
--------------------
00110000 -> 32+16 = 48
print(-12<<2) # -48
print(12>>2) 右移,右邊多的位丟棄,左邊若最高位是0就用0補齊,若最高位是1就用1補齊,右移相當於除以2^n次方
00001100
右移2位 00000011(00)
---------------------------
結果:3
print(-12>>2) # -3
檔案操作
常見的編碼表
- ASCII碼錶 採用一個位元組儲存鍵盤上任意一個字元
需要記憶的符號對應的ASCII碼值:
'0' - 十進位制:48 - 二進位制:00110000
'A' - 十進位制:65 - 二進位制:01000001
'a' - 十進位制:97 - 二進位制:01100001
- GB2312 | GBK 中國簡體漢字字元表示,一個漢字字元佔用2個位元組
- BIG-5 大5碼 用於表示中國臺灣香港繁體字
- unicode 萬國碼,表示一個字元佔用4個位元組 python****預設的編碼
- utf-8 是unicode編碼的壓縮格式,表示一個字元佔用3個位元組
體驗編碼-解碼的過程
- 編碼【正常->亂碼】
# 編碼
str1 = '今天晚上我們一起去爬大蜀山吧'
b1 = str1.encode('UTF-8')
print(b1)
- 解碼【亂碼->正常】
# 解碼
s2 = b1.decode('UTF-8')
print(s2)
檔案操作的步驟:
- 開啟檔案【建立與系統資源的連線】
- 操作檔案【寫 讀】
- 關閉檔案【釋放|關閉系統資源的連線】
寫操作open()
- 方式1:以位元組的方式覆蓋寫資料到檔案中 wb模式
f = open('test1.txt', mode='wb') # 若寫資料目標檔案不存在,則自動建立
# 寫資料到檔案中
f.write('我今天學習了很多!'.encode('UTF-8')) # 以指定編碼變成位元組
f.close()
路徑分類:
- 相對路徑:以專案作為根路徑進行查詢
- 絕對路徑:[完整路徑|帶磁碟機代號的路徑]
f = open('E:\\Projects\\PycharmProjects\\bigdata33\\day04\\data\\test1.txt', mode='wb') # 寫資料到檔案中 f.write('我今天學習了很多!'.encode('UTF-8')) f.close()
- 方式2:以位元組的方式追加寫資料到檔案中 ab模式
f = open('E:\\Projects\\PycharmProjects\\bigdata33\\day04\\data\\test1.txt',
mode='ab')
# 寫資料到檔案中
f.write('我今天學習了很多!\r\n'.encode('UTF-8'))
f.close()
- 方式3:以字元的方式以指定的編碼覆蓋寫入 w模式
f = open('E:\\Projects\\PycharmProjects\\bigdata33\\day04\\data\\test2.txt',
mode='w', encoding='UTF-8')
# 寫資料到檔案中
f.write('python666!\r\n')
f.close()
- 方式4:以字元的方式以指定的編碼追加寫入 a模式
f = open('E:\\Projects\\PycharmProjects\\bigdata33\\day04\\data\\test2.txt',
mode='a', encoding='UTF-8')
# 寫資料到檔案中
f.write('python666!\n')
f.close()
讀取操作open()
- 方式1:以位元組的形式讀取檔案資料
f = open('E:\\Projects\\PycharmProjects\\bigdata33\\day04\\data\\test2.txt',
mode='rb')
s1 = f.read().decode('GBK')
f.close()
print(s1)
- 方式2:以字元的形式讀取檔案資料
f = open('E:\\Projects\\PycharmProjects\\bigdata33\\day04\\data\\test2.txt',
mode='r', encoding='GBK')
# s1 = f.read()
res1 = f.readlines()
f.close()
# print(res1)
for i in res1:
if '\n' in i:
str1 = i[:-1]
else:
str1 = i
print(str1)
print("-" * 50)
檔案操作的應用場景
程式碼中的資料儲存到檔案中【使用者註冊】
while True:
name = input("請輸入您的姓名:")
if name.upper() == 'Q':
break
pwd = input("請輸入您的密碼:")
email = input("請輸入您的郵箱:")
infos = f"{name},{pwd},{email}\n"
f = open('data/users.csv',mode='a',encoding='UTF-8')
f.write(infos)
f.close()
f = open('data/users.csv',mode='a',encoding='UTF-8')
while True:
name = input("請輸入您的姓名:")
if name.upper() == 'Q':
break
pwd = input("請輸入您的密碼:")
email = input("請輸入您的郵箱:")
infos = f"{name},{pwd},{email}\n"
f.write(infos) # 這裡的寫實際上是往記憶體中寫的
f.flush()
f.close() # 原則上是在關閉連線之前將記憶體的資料刷到磁碟中
程式碼邏輯中的資料寫到檔案中
f = open('data/jj.txt','a',encoding='UTF-8')
for i in range(1, 10):
for j in range(1, i + 1):
f.write(f"{j}*{i}={i * j}\t")
f.write('\n')
f.flush()
f.close()
將網格中的資源寫到檔案中【爬蟲】
json
本質上是一個大的字串,裡面的格式類似於python中的字典,字串是由雙引號括起來的。
可以將這樣的一個大字串轉成json的格式。
import requests
import json
url = 'https://car-web-api.autohome.com.cn/car/price/getrecommendseries?
appid=8a1aebddbaab9cd59eec077d7563bca0&cityid=340100&type=pccookie&id=E7CA393F-
8482-4658-84A8-8152D7798995'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0'
}
response = requests.get(url=url, headers=headers)
text = response.content.decode('UTF-8')
text = text.replace(' ', '').replace('\n', '').replace('\r\n', '')
j = json.loads(text)
car_list = j['result']['serieslist']
f = open('data/cars.csv', mode='a', encoding='UTF-8')
f.write(f"品牌,車型,運作方式,最低售價,最高售價\n")
f.flush()
for car in car_list:
seriesname = car['seriesname']
levelname = car['levelname']
fueltypedetailname = car['fueltypedetailname']
minprice = car['minprice']
maxprice = car['maxprice']
infos = f"{seriesname},{levelname},{fueltypedetailname},{minprice},{maxprice}\n"
f.write(infos)
f.flush()
f.close()
開啟檔案的另一種方式
# 第一種
f = open('data/cars.csv', mode='r', encoding='UTF-8')
text = f.read()
print(text)
f.close()
#第二種
text = ''
with open('data/cars.csv', mode='r', encoding='UTF-8') as f:
text = f.read()
# text = f.read() # f出了with就會被close掉
print(text)