# Author By Mikigo
# Time 2021/9/30
一、Python基礎
(一)輸入輸出
1. print
(1)print("hello world") 括號表示調用函數print,括號內的字符串用引號引起來。
(2)print("hello","world","mikigo") 可接受多個參數。
(3)print(name)不加引號表示調用變量。
(4)print(100+200) 不加引號,表示直接運算。
2. input
(1)input() 輸入,光標會等待鍵盤輸入。
(2)input("請輸入內容") 括號內建議輸入提示信息。
(3)input輸入的值都會被當成字符串,包括數字。
(二)數據類型
1. 整數 int 沒有小數點。
2. 浮點數 float :有小數點。
3. 布爾值 bool :True 或 False 。注意首字母大寫。
4. 空值 None :空值,但和0有區別。
5. type() 查看數據類型(isinstance)。
(三)變量、表達式
1. 變量賦值
(1)name="mikigo" 表示將mikigo這個字符串賦值給變量name,注意要加引號,不加引號會被認為是一個變量
(2)a,b,c=7,8,9 多元賦值,表示將值一一對應的復制到等號前面的變量,但位置的個數一定要一致。
(3)數據類型的轉換
- str(age) 表示將變量age轉換成字符型
- int(1.5)表示將float轉換成int(取整為1)
- float(6) 表示將int轉換成float
2. 表達式
(1)+ - * /
(2)% 表示取余數
(3)// 表示取商數
(4)** 表示次冪 ,比如10**5 表示10的5次冪
(四)字符串string
1.格式化字符串
(1)%d(data) 表示數字站位
(2)%s(string) 表示對字符串站位
(3)%r 任何類型都可以接收,但字符串最終打印出來有引號。
(4)格式:print("%s = %d" % (age,19))
(5)"mikigo{}".format(("good",))
(6)f"mikigo{good}"
2.字符串操作
(1)字符串相加 比如:"mi"+ "ki" >miki
(2)* 比如:2*"mi"> mimi
(3)[ ] 表示通過索引截取字符,第1個字符索引是0
(4)[ : ] 表示截取字符串 比如:[2:4]表示從索引2開始,截取到索引3(不包含4)
(5)in 表示in后面字符串中是否包含in前面的字符,比如 "i" in "miki" >>True
(6)not in 用法與in類似但是取反
(7)r/R 表示所有字符都按照字面意思來使用。比如:print(r"hello\nmikigo") 換行字符\n不起作用,直接輸入引號內的字符串。
3.字符串的常見函數方法
(1)len(str) 返回字符串的長度
(2)count計數
- "mikigo".count("mi") 直接跟字符或字符串,則返回字符出現的次數
- "mikigo".count("i",2,10) 表示在索引2到10之間(不包含10),返回字符出現的次數
(3)startswith或endswith 以什么開始或以什么結束
- "mikigo".startswith("m") 表示判斷是否以字符m開始,>true
- "mikigo".endswith("m") 表示判斷是否以字符m結束,>False
(4)find 查找字符或字符串,返回索引位置,如果找不到會返回-1
- "mikigo".find("i") 表示找出字符i在字符串中第一次出現的索引位置,>1
- "mikigo".rfind("i") 表示從右開始找出字符i在字符串中第一次出現的索引位置,>3
(5)index 用法同find,區別在於,找不到時會報錯
(6)strip 刪除或截掉
- " mikigo ".strip() 刪除前后的空格
- " mikigo ".rstrip("o") 刪除右邊的字符o
- " mikigo ".lstrip("m") 刪除左邊的字符m
(7)replace 替換
- "mikigo".replace("i","oo") 表示將字符串中的所有字符i替換稱字符串oo
- "mikigo".replace("i","oo",1) 表示將字符串中的字符i替換為oo,只替換一次
(8)join 加入:"miki".join("ab") >> "amikib" 每個字符拆開,加入某個字符或字符串。
(9)split 以分隔符截取
- "mikigo".split("i") 表示以字符i作為分隔符,將字符串進行分隔。
- "mikigo".split("i",1) 表示以字符i作為分隔符,以第1個i作為字符串的分隔符 進行分隔。
- "mikigo\nhello".splitlines() 或 "mikigo\nhello".splitlines(keepends=False) 表示按行("\r","\n","\r\n")分隔(不包含換行符)。
- "mikigo\nhello".splitlines(keepends=True) 表示以\n換行,且包含換行符。
- 擴展: 多種方式分割字符串 re.split('a|b', 'fdasfweqgasfewaq')
(五)列表(list)
1.list基本操作
(1)列表(list)用[ ]表示,是有序,可變,可指定位置取值的。
(2)列表里面的元素,可以是任意數據類型,包括列表、None、bool
(3)同一列表中可存放不同的數據類型
2.切片
(1)lst[index ]取單個元素,直接跟索引。比如lst[2],表示取索引2的元素
(2)lst[0:2] 取一個區間。表示取索引0到1的元素
(3)lst[0:5:2] 表示按步長2去取索引0到4之間的元素。
(4)lst[-1] 表示取最后一個
(5)lst[::-1] 表示將一個列表反向排序
3.list常見的函數和方法
(1)函數
1)len(list) 列表的長度,即列表中元素的個數
2)max(list) 相同的數據類型取最大值。
(2)方法
1)list.append(obj) 在列表末尾添加新的對象。list.append("ab"),表示在末尾加入字符串"ab",但append一次只能增加一個元素。
2)list.count(obj) 統計某個元素在列表中出現的次數。
3)list.extend(seq) 在末尾追加另一個序列。追加的是一個列表,不能是單個元素。比如list.extend([123])
4)list.index(obj) 找出某個元素的第一個索引位置。
5)list.insert(index,obj) 將對象插入到列表(位置,元素)
6)list.pop(index) 刪除某個位置的元素(默認刪除最后一個)。比如list.pop(1)表示刪除索引1的元素,且返回元素的值。
7)list.remove(obj) 刪除列表中的某個元素的第一個,修改列表本身。
8)list.reverse() 反向排序
9)list.sort() 重新排序
10)list.clear() 清空列表
11)list.copy() 復制列表
(六)元組(tuple)
1.定義:以小括號括起來的有序列表,但不能修改。
2.eg. a=(2,3,4,5)
(七)字典(dict)
1.定義:字典是用大括號括起來,由鍵值對(key:value)組成的,且是無序的。
2.key是唯一的,一般賦值為string,value可以是任意數據類型
3.常用操作
(1)dt["key"] 根據鍵讀取值
(2)dt["old_key"]="new_value" 根據鍵修改值
(3)dt["new_key"]="new_value" 新增鍵值對
(4)len(dt) 返回元素的量(鍵值對)
4.dict常用方法
(1)key in dict 判斷鍵是否在字典中
(2)dict.items() 返回列表,列表由元組組成,每個元組由一個鍵值對將鍵和值拆分為兩個字符串組成。
(3)dict.keys() 將所有的鍵組成一個列表。
(4)dict.values() 將所有的值組成一個列表。
(5)dict1.update(dict2) 將字典2中的鍵值對添加到字典1中
(6)dict.get(key,default=None) 返回指定鍵的值,如果值不存在,返回default值。比如:dict.get("name","peter") 如果字典中有name這個鍵,則直接返回其對應的值,如果沒有這個鍵,則返回"peter"
(7)dict.setdefault(key,default=None) 和get一樣會返回指定鍵的值,但若鍵不在字典中,會添加成為新的鍵值對。比如:dict.setdefault("name","peter"),如果字典中有name這個鍵,則返回其對應的值,如果沒有,則會將定義的值,添加到字典中。
(8)dict.pop(key,default=None) 刪除鍵對應的值,key不存在返回default值。
(9)dict.copy() 淺復制
(10)dict.clear() 清除所有元素
二、過程控制
(一)條件語句
if 條件判斷:(縮進和冒號)
print("字符串")
else:
print("字符串")
2.else 可以不要,語法上沒有問題
3.運算符
1)< , <= , > , >= , == , !=
2)and , or , not , in , not in, is
(二)循環語句
1.while
while 判斷條件:
語句
else :
語句
②break 終止循環語句
③continue 結束本次循環,繼續進行下一輪循環。
2.for語句(遍歷序列的元素)
for i in [1,2,3,4]:
print(i)
-
in 后面可以跟元組、列表、字符串,但跟字典時只能取到字典中的鍵(key)。
-
range(函數)
- range(3) 表示從索引0,取到索引2(開區間)
- range(1,4) 表示從索引1,取到索引3
- range(1,10,2) 表示從索引1,取到索引10,步長為2
三、函數
(一)定義
函數是可重復使用的,具有一定功能的代碼段。
1)def 函數名(參數1,參數2,····)
def add(a,b):
c = a + b
print(c)
(二)返回值
調用函數后,將執行結果返回給調用者。
def add(a,b):
c = a + b
return c
>>x=add(1,2) #返回一個c的值賦給x,如果返回值有多個,而變量只有1個,則會生成一個元組。也可以用多個變量對應多個返回值,即多元賦值。
(三)參數
1、位置參數(形參)
def func(name,age):
print(name,age)
位置參數時根據位置順序傳入函數,調用函數時必須與定義時的參數數量一致。
2、默認參數
-
def func(name,age=18): print("a未被定義") # 參數在定義的時候就賦值的
-
默認參數在調用的時候如果不傳入,則會使用默認參數,如果給傳遞了參數,則值會被覆蓋。
3、可變參數
def func(*args):
sum = 0
for n in args:
sum = sum +n
return sum
>>func(1,2,3,···) #傳入的參數數量可變,會自動組裝稱一個元組,如果傳入0個參數,結果時返回一個空元組。
-
如果傳入的參數是一個元組,調用的時候在函數括號內加*號(參數解構)
tp=(1,2,3,4)
resule = add(*tp)
4、關鍵字參數(鍵和值)
def func(**kwargs):
print(kwargs)
>>func(name="peter") # 結果是打印一個字典{"name":"peter"}
-
如果傳入的參數是一個字典,調用的時候在函數括號內加**
>>dct = {"eat1":"酸辣粉","eat2":"螺獅粉"}
>>func(**dct)
5、組合參數
順序為位置參數,可變參數,默認參數,關鍵字參數
def func(name,age,*args,gender=’男’,**kwargs)
四、類(class)
(一)類的實例
1.類的實例是對象,一個實例包含屬性(有什么)和方法(能做什么)。
2.類的聲明:class 類名(): #類名單詞首字母大寫,如果是多個單詞,單詞與單詞之間不空格,直接挨着寫,但每個單詞首字母需要大寫。
3.定義類的屬性和方法
class Person():
def __init__ (self,name,age): # __init__是固定格式,`self`也是固定格式。
self.name = name
self.age = age #定義了兩個屬性。
def run(self,food):
print("%s都%d歲了,天天吃%s" % (self.name,self.age,food)) #定義了一個方法。(外部變量不加self)
(2)方法調方法或方法調屬性等,內部調用都要加self。 ②
(3)調用外部變量時,不加self。
(4)調用
① 實例化:x = Person("peter",18)
② print(x.name) 調用類的屬性
③ print(x.run("肉"))
(二)繼承
1.子類繼承父類的屬性和方法
class Student(Person): #繼承時括號內直接寫父類的類名
pass #完全繼承父類的屬性和方法。
class Student(Person):
def __init__(self,name,age,cno)
Person.__init__(self,name,age)
self.cno = cno #在父類的基礎上新增屬性,需要先將父類指定進來。否則新增屬性會將父類的屬性覆蓋。
def run(self):
r = Person.run(self)
return r # 在父類的基礎上新增方法,需要先指定父類的方法。
方法重新定義后,調用的時候,默認先去調用子類的方法,然后再去調用父類的方法。
(三)訪問限制
1.訪問限制可以使,類內部的屬性和方法,不能外部隨便訪問。用法是在屬性或方法前面加雙下划線,表示私有屬性。
2.訪問限制,不能被外部隨便訪問,但可以被內部調用,私有屬性可以用方法調用,私有方法,可以定義其他方法調用。
class Person():
def __init__(self,name):
self.__name = name
def __eat(self,food):
return "%s愛上吃%s"% (self.__name,food)
(四)編碼規范
1.縮進,4個空格的縮進,空格和tab不能混用(tab僅在編輯器中可使用)。
2.類名的單詞以大寫字母開頭。
3.函數和類的屬性命名以小寫,用下划線連接
4.所有的命名都應采用有意義的英文單詞,多單詞由下划線連接。
五、模塊
(一)引入模塊
(1)import 后面直接跟模塊名或類或函數. eg1. import time
(2)from 路徑 import 類或函數 #路徑最好用絕對路徑 eg2. from model.A import add
(二)安裝三方庫
(1)sudo pip3 install pymysql(三方庫名) #在命令行直接輸入即可(命令行安裝時注意)。
(2)在pycharm里面,點擊file,選擇setting,選擇Project,選擇Project Interpreter,在右上角點+號,輸入庫名即可安裝。
(3)如果是需要下載的三方庫,下載后查看文件包里面的readme文件,根據描述進行安裝。
六、異常處理
(一)try語句
(1)try ... except...except 表示當程序運行錯誤后,被except捕捉到,返回一個可定義的信息,且不會影響后續語句的執行。每個except后面跟不同的返回信息。
try:
print(a)
10/0
except NameError:
print("a未被定義")
except ....
(2)try ...except...finally 同(1)一樣,但finally后的語句,無論是否發生異常,都會執行。
(3)try...except...else 同(1)一樣,但else后的語句,是在沒有發生異常的情況才會執行。
(二)拋出異常
①>> raise NameError("這是一個名稱錯誤")
(三)常見的異常分類
① AssertionError assert(斷言)語句失敗。
② AttributeError 試圖訪問一個對象沒有的屬性,比如foo.x,但是foo沒有x這個屬性。
③ IOError 輸入/輸出異常,基本上是無法打開文件。
④ ImportError 無法引入模塊或者包,基本上是路徑問題。
⑤ IndentationError 語法錯誤,代碼沒有正確對齊。
⑥ IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]。
⑦ KeyError 試圖訪問字典里不存在的鍵。
⑧ Kerboardinterrupt Ctrl+C被按下,主要針對無限循環。
⑨ NameError 使用一個還未被賦值予對象的變量。
⑩ SyntaxError 代碼非法,代碼不能解釋。
⑪ TypeError 傳入對象類型與要求的不符。
⑫ UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是由於另一個同名的全局變量,導致你以為正在訪問它。
⑬ ValueError 傳入一個調用者不期望的值,即使值的類型是正確的。
⑭ FileNotFoundError 試圖打開一個不存在的文件或目錄。
七、文件讀寫
(一)以讀的形式打開,並能寫(r+)
1) >> f = open("test.txt","r+")
>> f.write("xxx")
>> f.flush()
>> f.close()
2)光標會放在文件開頭,輸入的輸入會覆蓋開頭
(二)以寫的形式打開,並能讀(w+)
1) >> f = open("test.txt","w+")
>> data = f.read()
>> print(date)
2)若文件已存在會將其覆蓋,若文件不存在,會新建文件。
(三)追加模式(a+)
1) >> f = open("test.txt","a+")
2)光標在文件的末尾,寫入會追加到末尾,若文件不存在,會新建文件。
with open("test.txt","r+",encoding="utf-8") as f:
f.write("我是中文")
f.flush()