Python學(xue)習筆(bi)記
一、經典HelloWord開啟Python大門:
# 文件名: Demo01.py # 經典HelloWord開啟Python大門: # if __name__ == '__main__': # print("Hello World!") print("Hello World!")
二、指(zhi)定(ding)編碼:
# 文件名: Demo01.py # 指定編碼: utf-8(默認) # -*- coding:utf-8 -*-
三、注釋(shi):
# 文件名: Demo01.py # 注釋 # 1、單行注(zhu)釋(shi) """ 2、三個(ge)雙引號多行注(zhu)釋 """ ''' 3、三個單引(yin)號(hao)多汗(han)注釋 '''
四(si)、變量賦值(zhi):
# 文(wen)件名: Demo01.py # 變量賦(fu)值 a, b, c = 1, 2, "字符(fu)串(chuan)" print(a, b, c) a = b = c = 3 print(a, b, c) # 內部賦值并返回 print(d := 10)
五、數(shu)據類型(xing):
| 數據類型 | 描述 | 示例 |
|---|---|---|
int |
整數類型,用于表示整數 | 5, -42, 1000 |
float |
浮點數類型,用于表示帶小數的數值 | 3.14, -0.001, 2.0 |
bool |
布爾類型,用于表示邏輯值,只有 True 和 False |
True, False |
str |
字符串類型,用于表示文本 | "hello", 'world' |
list |
列表類型,用于存儲有序的可修改元素集合 | [1, 2, 3], ["a", 4] |
tuple |
元組類型,用于存儲有序的不可修改元素集合 | (1, 2, 3), ("x", "y") |
set |
集合類型,用于存儲無序且唯一的元素集合 | {1, 2, 3}, {"apple"} |
dict |
字典類型,用于存儲鍵值對 | {"name": "Alice"} |
# 文(wen)件名: Demo01.py # 數(shu)(shu)據(ju)類型(xing) # 整型(xing)、浮點型(xing)、字(zi)(zi)(zi)符(fu)(fu)串、布爾(er)型(xing)、列表、字(zi)(zi)(zi)典、元組、集(ji)合 # 不可(ke)變(bian)數(shu)(shu)據(ju):Number(數(shu)(shu)字(zi)(zi)(zi))、String(字(zi)(zi)(zi)符(fu)(fu)串)、Tuple(元組) # 可(ke)變(bian)數(shu)(shu)據(ju):List(列表)、Dictionary(字(zi)(zi)(zi)典)、Set(集(ji)合) print(type(1)) # 整數類型 print(type(1.1)) # 浮(fu)點(dian)類型(xing) print(type("字符串(chuan)")) # 字符串類(lei)型(xing) print(type(True or False)) # 布爾類(lei)型(xing) print(type([])) # 列(lie)表(biao)類(lei)型(xing) print(type({})) # 字典類(lei)型(xing) print(type((1, 2, 3))) # 元組類(lei)型 print(type({1, 2, 3})) # 集合(he)類(lei)(lei)型 # type()不會認(ren)為(wei)子類(lei)(lei)是一種父類(lei)(lei)類(lei)(lei)型 # isinstance()會認(ren)為(wei)子類(lei)(lei)是一種父類(lei)(lei)類(lei)(lei)型 print(isinstance(1, int)) # 判斷數據類型
六、字(zi)符串:
# 文(wen)件名: Demo01.py # 字符串 # 1、字符串拼接 print("Hello World" + str(10)) # 2、引號轉義 print("\'" + str(10)) # 3、字符(fu)串換行成段:三個單(dan)引(yin)號或者三個雙(shuang)引(yin)號 print("""這是一個(ge)段落, 可以由多行組成""") # 4、數據操作(zuo) st = "Hello" print(st) print(len(st)) # 字(zi)符串(chuan)長度 print(st[-2]) # 字符串索引:從左往右以 0 開始,從右往左以 -1 開始 print(st[0:-1]) # 字符串切片str[start:end],其中 start(包含)是切片開始的索(suo)引(yin),end(不包含)是切片結束的索(suo)引(yin) print(st[2:]) # 輸出從第三(san)個開始后的(de)所有字符 print(st[1:5:3])# 字(zi)符(fu)串(chuan)的(de)切片(pian)選(xuan)擇(ze)步(bu)長(chang)str[start:end:step],正步(bu)長(chang)表示從(cong)(cong)左到(dao)右選(xuan)擇(ze)指定字(zi)符(fu),負步(bu)長(chang)表示從(cong)(cong)右到(dao)左選(xuan)擇(ze)指定字(zi)符(fu) print(st * 2) # 輸出字(zi)符串兩次 print(type(st)) # 數據(ju)類型(xing) # 5、字符串format格式化 print("{2} {0} {1}".format("a", "b", "c")) # 按索引位置輸出 print("{value3} {value1} {value2}".format(value1="a", value2="b", value3="c")) # 按關鍵字指定輸出 print("{2:.2f} {0} {1}".format("a", "b", 2.11111)) # @.2f保留兩位小數
七、用戶(hu)輸入(ru):
# 文件名: Demo01.py # 用戶輸入 info1 = int(input("請輸入(ru)信息1:")) # 默認int info2 = input("請(qing)輸入信息2:") # 默(mo)認str print(str(info1) + info2)
八、邏輯(ji)運(yun)算(suan)符:
# 文件名: Demo01.py # 邏輯運算符 # and:與 or:或 not:非(fei) boAnd = 1 > 0 and 1 < 0 boNot = not 1 > 0 print(str(boAnd) + str(boNot))
九、成員運(yun)算符:
# 文(wen)件名: Demo01.py # 成員運算符 # in:判斷(duan)是否在指定(ding)的序列中(zhong)存在 # not in:判(pan)斷是(shi)否(fou)不(bu)在指定的序列(lie)中(zhong)存在 print(1 in [1, 2, 3]) print(1 not in [1, 2, 3])
十、身份運算符:
# 文件名(ming): Demo01.py # 身(shen)份運算符(fu) # is/is not 用于判斷兩個(ge)變量引用對象(xiang)是否為同一個(ge) # == 用(yong)于判斷引用(yong)變量的值(zhi)是否相(xiang)等(deng) newA = [1, 2, 3] newB = newA print(newA is newB) # True print(newA is [1, 2, 3]) # False print(newA == [1, 2, 3]) # True
十一、條(tiao)件語句:
# 文(wen)件(jian)名(ming): Demo01.py # 條件(jian)語句 ifInfo = 1 # 1、單條件 if ifInfo > 1: print("大于1") else: print("小于或等(deng)于1") # 2、嵌套條(tiao)件 if ifInfo > 2: print("大(da)于2") elif 1 < ifInfo <= 2: print("大(da)于(yu)1或小于(yu)等于(yu)2") else: print("小(xiao)于(yu)或等于(yu)1") # 3、match...case語句(ju) # 自動終止,無(wu)需 break:由于每個 case 塊是獨立的,因此不需要使用 break 來終(zhong)止當(dang)前(qian)塊 status = 400 match status: case 400: print("Bad request") case 401 | 403 | 404: print("Not found") case 418: print("I'm a teapot") case _: # 未找到(dao)默(mo)認輸出(chu) print("Something's wrong with the internet")
十二、列(lie)表List:
# 文件(jian)名: Demo01.py # 列表 # 語(yu)法:List[value] # 有序的集合,可重復,可修(xiu)改(gai) listInfo = [5, 2, 2, 1, 4, 3] print(listInfo) # 查(cha)看整個列(lie)表 print(listInfo[1]) # 查看列表索(suo)引位為0值 print(listInfo[1:3])# 查(cha)看列表索引位為1到3的元(yuan)素(左閉右開) listInfo.append(6) # 添加(jia) print("添加:", listInfo) # 查看整個列表 listInfo.remove(3) # 移(yi)除列表中(zhong)某個值(zhi)的第(di)一個匹(pi)配項 print("移除第一個匹配的指定值:", listInfo) del listInfo[1] # 刪除(chu)索引位為1的元素 print("刪(shan)除指定(ding)索引(yin)位元素:", listInfo) listInfo[1] = 5 # 修(xiu)改(gai) print("修改:", listInfo) # len長度, max最大值,min最小值,sorted從小到大排序(xu) print(len(listInfo)) print(sorted(listInfo)) # 列表比較 import operator listA = [2, 3] listB = [2, 3] print("operator.eq(a,b): ", operator.eq(listA, listB))
十三(san)、元組(zu)tuple:
# 文件名: Demo01.py # 元組(zu) # 語(yu)法:tuple(value) # 有序的集(ji)合(he),可重(zhong)復,不可修改 # 元組(zu)的不可變指的是元組(zu)所指向的內(nei)存中的內(nei)容不可變 tupleA = (2, 3, 6, 5, 1) print(tupleA) print(tupleA[1:3]) # 元組切片(左閉右(you)開(kai)) print(tupleA + (1, 2, 3)) # 元組相加 print(3 in tupleA) # 判(pan)斷(duan)元素是否存在 print(list(tupleA)) # 轉(zhuan)換為列表
十四、字典dict:
# 文件名: Demo01.py # 字典 # 語法:dict{key:value} # key鍵唯一 mapInfo = {"name": "ceshi", "age": 18} print(mapInfo) print(mapInfo.keys()) # 返回(hui)key列(lie)表視圖 print(mapInfo.values()) # 返回(hui)value列(lie)表視圖 print(mapInfo.get("type", "不存在則設置默認值")) print(len(mapInfo)) # 長(chang)度 print("name屬性值:", mapInfo.get("name")) mapInfo["name"] = "ceshi2" # 更(geng)新指(zhi)定key的(de)值 print("name更新(xin)后的屬性(xing)值:", mapInfo.get("name")) mapInfo["sex"] = "1" # Key不存(cun)在則(ze)添加,Key存(cun)在則(ze)修改 print(mapInfo) print("sex" in mapInfo) # 判(pan)斷Key是否存在 del mapInfo["sex"] # 刪除 print(mapInfo)
十五、集(ji)合(he)set:
# 文(wen)件(jian)名: Demo01.py # 集合 # 語(yu)法:set{value} # 無序的集合(he),不可重(zhong)復(fu),可修(xiu)改 set1 = {1, 2, 2, 3, 4} print(set1) # 不(bu)重(zhong)復對象(xiang)集合,去重(zhong)功能(neng) print(set("abbds")) # 字(zi)符(fu)串轉(zhuan)set集合 set1.add(5) # 添加元素(su) print(set1) set1.remove(5) # 移除指定(ding)元(yuan)素,如果元(yuan)素不存在,則會發生錯誤 set1.discard(5) # 移除指定元素,如果元素不(bu)存在,不(bu)會發生錯誤 print(set1)
十六、循環(huan)語言:
# 文件名: Demo01.py # 循環語(yu)言 # break語(yu)句(ju):跳(tiao)出 for 和 while 的循環體,任何對應的循環 else 塊(kuai)將不執行 # continue語(yu)句:跳出(chu)當前循(xun)環,繼(ji)續下一次循(xun)環 # 1、for結構: for 變量名 in 可迭代對象: 循環體 [else: 結(jie)束循環執行(xing)語句(ju),可省略] kvInfo = {"name1": "ceshi1", "name2": "ceshi2"} # for key, value in kvInfo.items(): # print(key + ":" + value) for kv in kvInfo.items(): print(kv[0] + ":" + kv[1]) else: print("循(xun)環結束") # 2、while結構:while 條件:循環體 [else: 結束循環執行語句(ju),可(ke)省略] fList = [1, 2, 3, 4, 5] ind = 0 while ind < len(fList): # 關鍵(jian)字(zi)end可以用于(yu)將結(jie)果輸出到同(tong)一行,或者(zhe)在(zai)輸出的末尾添(tian)加不同(tong)的字(zi)符 print(fList[ind], end=",") ind += 1 else: print("循(xun)環結束,ind值", ind)
十七、函數:
# 文件名: Demo02.py # 函數 # 語(yu)法(fa):def 函數名(參數列表): 函數體(ti) def my_fun(a, b): return a + b print("函(han)數my_fun()返回:" + str(my_fun(1, 2)))
十(shi)八(ba)、類(lei)與方法(fa):
1、聲明類、構造函數、實例函數、類方法、靜態方法:
# 文(wen)件名: class_and_method.py # 類、構造(zao)函數、實例函數、類方法(fa)、靜態方法(fa) class MyClass: # 構造函(han)數 def __init__(self, name): self.name = name # 實例(li)函數:通過實例(li)化(hua)后調用 def instance_method(self): self.name = self.name + "實(shi)例方法" print(f"{self.name}") # 類(lei)方法:可以通(tong)過類(lei)名直接調用,也可以通(tong)過實例調用,修(xiu)改類(lei)變(bian)量(liang) # 類(lei)變(bian)量(liang) class_data = "init_data" @classmethod def class_method(cls, name): print(f"類變量初始值:{cls.class_data}") cls.class_data = name print(f"類名:{cls.__name__}") print(f"類變量修(xiu)改值(zhi):{cls.class_data}") # 靜態方法:可(ke)以通過(guo)類名(ming)調用,也可(ke)以通過(guo)實例調用,類似于外(wai)部函數 @staticmethod def static_method(x): print(f"static method, {x}")
2、操作:
# 文件名: Demo02.py # 類與方法 # 構(gou)造(zao)函數、實(shi)例函數、類方法、靜態方法 # 導入模塊(kuai): from 文件(jian)路徑 import 文件(jian)名(ming) # internal: 自定義的文(wen)(wen)件存放路徑,若同一路徑下可以直接 import 文(wen)(wen)件名(ming) from internal import class_and_method # 通(tong)過(guo)類(lei)(lei)名(ming)直接(jie)調用(yong)類(lei)(lei)方法(fa) class_and_method.MyClass.class_method("iven") # 通(tong)過(guo)類名直接調用靜態方(fang)法 class_and_method.MyClass.static_method("靜態方法") # 創建類的實(shi)例 instance = class_and_method.MyClass("Jon") # 訪問構造函(han)數實例(li)屬性 print(f"訪問(wen)構造函數實例屬(shu)性: {instance.name}") # 調用實例方(fang)法 instance.instance_method() # 通過實例調用類(lei)方(fang)法 instance.class_method("new_iven") # 通過實例調用靜(jing)態(tai)方法(fa) instance.static_method("new_靜(jing)態方法")
十九、繼(ji)承:
1、聲明父類,定義父類構造函數與父類方法:
# 文件(jian)名: class_father_method.py # 父類 class Father: # 構造函(han)數(shu) def __init__(self, name): self.name = name # 父類(lei)方法(fa) def father_method(self): print(f"父類(lei)屬(shu)性:{self.name}")
2、子類繼承父類,支持多繼承:
# 文件名: class_son_method.py from internal import class_father_method # 子(zi)類: class Son(Father) # 多繼承: class Son(Father, Mother, ....) class MySon(class_father_method.Father): # 構造函(han)數(shu), super()調(diao)用父類構造函(han)數(shu) def __init__(self, name, age): # 調(diao)用父類的構造方法 super().__init__(name) self.age = age # 子類方法 def son_method(self): print(f"子類屬性name: {self.name}") print(f"子類(lei)屬性(xing)age: {self.age}")
3、操作:
# 文(wen)件名: Demo02.py # 繼(ji)承 # 支持多繼(ji)承 # 子類(派生類 DerivedClassName)會繼(ji)承父類(基類 BaseClassName)的屬性和方法 from internal import class_son_method # 實例化(hua)子類: son = class_son_method.MySon("iven", 18) # 獲(huo)取父類(lei)方(fang)法(fa): son.father_method() # 獲(huo)取子(zi)類(lei)方(fang)法(fa): son.son_method()
二十、異常處理:
# 文件名: Demo02.py # 異常(chang)處理 try: print(1/0) except Exception as e: print(e) finally: print("finally語塊肯定會執行")
二十一(yi)、匿名(ming)函數(shu):
# 文(wen)件(jian)名: Demo02.py # 匿名函數 # 函數名 = lambda 形參:返(fan)回(hui)值 numSum = lambda num1, num2: num1 + num2 print(numSum(10, 20)) # 等(deng)價于(yu) def num_sum(a, b): return a + b print(num_sum(10, 20))
二十(shi)二、高階函數:
函數作為參數傳(chuan)遞給另一個函數
# 文件(jian)名: Demo02.py # 高階函數(shu)(shu) # 函數(shu)(shu)作為參數(shu)(shu)傳遞給另一(yi)個函數(shu)(shu) # 函數(shu)(shu)作為返回值返回 def A(func, a, b): return func(a, b) def B(a, b): return a + b def C(a, b): return a * b def D(a, b): return a - b # 調用A print(A(B, 1, 2)) print(A(C, 1, 2)) print(A(D, 1, 2))
二(er)十三、文件(jian)操(cao)作:
# 文(wen)(wen)件名: Demo02.py # 文(wen)(wen)件操作 # 結構(gou): 文(wen)(wen)件名,文(wen)(wen)件類(lei)型,編碼格式(shi) # 文(wen)(wen)件類(lei)型: r:讀取(qu)文(wen)(wen)件,w:寫文(wen)(wen)件,a:追加文(wen)(wen)件,r+:讀寫文(wen)件(jian)(jian),文(wen)件(jian)(jian)指針位于文(wen)件(jian)(jian)的(de)開(kai)頭(tou),當(dang)你首先寫入內(nei)容后,文(wen)件(jian)(jian)指針仍然在開(kai)頭(tou) # 編碼(ma)格式(shi): utf-8:中文編碼(ma)格(ge)式(shi),gbk:中文編碼(ma)格(ge)式(shi),ascii:英文編碼(ma)格(ge)式(shi) # 方式(shi)一(yi): 需要手動(dong)調用close() # file = open("./file/data.txt", "r", encoding="utf-8") # file.close() # 方(fang)式(shi)二: with 方(fang)式(shi)讀取,不需要(yao)手(shou)動調用close() with open("./file/data.txt", "r", encoding="utf-8") as file1: # print(file.read()) # 讀取文件,一次寫(xie)入內存中(zhong),read(10): 讀(du)取10個字節 lines = file1.readlines() for line in lines: print(line) # 讀取文件,一次讀取一行 with open("./file/data2.txt", "r+", encoding="utf-8") as file2: # 文(wen)件指針位于(yu)文(wen)件的(de)開頭 file2.write("一二三四(si)五 \n") file2.write("六七八九(jiu)十 \n")
二十四、基于MySQL實現(xian)分頁查詢(xun)案例:
1、前置準備:
# 激活虛擬環境 .\venv\Scripts\activate # 查(cha)看當前虛擬環境中安(an)裝的包 pip freeze # 安(an)裝 Flask pip install Flask # 安(an)裝 MySQL Connector/Python pip install mysql-connector-python
2、執行腳本:
# 文(wen)件名: Demo03.py # 前置準備 # .\venv\Scripts\activate # 激活虛擬環(huan)境 # pip freeze # 查看當前虛擬環(huan)境中安裝的包 # pip install Flask # 安裝 Flask # pip install mysql-connector-python # 安裝 MySQL Connector/Python # 訪問:http://127.0.0.1:8080/api/demo?page=1&per_page=10 from flask import Flask, request, jsonify import mysql.connector from mysql.connector import Error app = Flask(__name__) # 配置 MySQL 數據庫連接 db_config = { 'host': 'localhost', 'user': 'root', 'password': '12345', 'database': 'demo_database', 'port': 3306 } # 創建(jian)數(shu)據庫連接 def create_connection(): try: connection = mysql.connector.connect(**db_config) if connection.is_connected(): print("MySQL Database connection successful") return connection except Error as e: print(f"The error '{e}' occurred") return None # 分(fen)頁查詢接口 @app.route('/api/demo', methods=['GET']) def get_items(): # 創建數(shu)據庫(ku)連(lian)接 connection = create_connection() if connection is None: # 返回錯誤響應 return jsonify({"error": "Database connection failed"}), 500 try: page = request.args.get('page', 1, type=int) per_page = request.args.get('per_page', 10, type=int) offset = (page - 1) * per_page cursor = connection.cursor(dictionary=True) query = "SELECT * FROM tb_user LIMIT %s OFFSET %s" cursor.execute(query, (per_page, offset)) # 執(zhi)行查詢 items = cursor.fetchall() # 獲取查詢結果 total_query = "SELECT COUNT(*) as total FROM tb_user" cursor.execute(total_query) total_count = cursor.fetchone()['total'] total_pages = (total_count + per_page - 1) // per_page return jsonify({ 'items': items, 'total': total_count, 'pages': total_pages, 'current_page': page }) except Error as e: print(f"The error '{e}' occurred") return jsonify({"error": str(e)}), 500 finally: if connection.is_connected(): cursor.close() connection.close() if __name__ == '__main__': # 運(yun)行 Flask 應用, 端(duan)口8080 app.run(debug=True, port=8080)