大資料學習記錄,Python基礎(3)

灵敏的迅捷蟹發表於2024-11-29

算術運算子

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)

相關文章