???????????????????????????????????????????一? python基礎(chǔ)
1.Python 中的字符串有兩種索引方式,從左往右以 0 開始,從右往左以 -1 開始。
? ??Python 沒有單獨的字符類型症歇,一個字符就是長度為 1 的字符串郎笆。
????字符串的截取的語法格式如下:變量[頭下標:尾下標:步長]? 尾下標不可取
? ? str= ' chenrui '
? ? print(str[1:-1])? ? ? 輸出 henru
? ? print(str*2)? ? ? ? ? ? 輸出chenruichenrui
? ? print(str+'你好')? ? 連接字符串 輸出chenrui你好
2.?print 默認輸出是換行的谭梗,如果要實現(xiàn)不換行需要在變量末尾加上?end='':
? ? print('chen', end='')
? ? print('rui')? ??
輸出chenrui
3.
不可變數(shù)據(jù)(3 個):Number(數(shù)字)、String(字符串)宛蚓、Tuple(元組)激捏;
比如str='chen'
? ? ? ? str[1]='m'? ? ?是錯誤的,不能重新復(fù)制
可變數(shù)據(jù)(3 個):List(列表)凄吏、Dictionary(字典)远舅、Set(集合)。
4.list列表 可變元素痕钢,寫在[ ]內(nèi)
可以存放不同類型元素图柏,可以切片,分割任连。與字符串不同的是蚤吹,列表可以更改元素
a=[123 , 'cccc' , 2.7 , 19 , 'a' ]
(1)切片
c=a[1:4:2]? ? ? ? #c=['cccc' , 19]? ?
(2)判斷元素在不在里面
>>> 123 in a
? ? ? ? True
? ? (3)長度
>>>? len(a)
? ? ? ? 5
(4)? ?list.append(x)? 在列表尾部插入x? ??
(5)? list.insert(x,y)? ? ?在list[x]處插入y
(6)? ?list.count(x)? ? ? ? 統(tǒng)計列表中元素x出現(xiàn)次數(shù)
(7)list.remove(x)? ?移除列表中指定值
(8)list.reverse()? ?反轉(zhuǎn)列表
(9)list.extend(b)? ?將列表b添加到尾部
(10)list.sort()? ?列表由小到大排序
(11)del? list[1]? 刪除該元素
(12)棧與隊列
list.pop([index=-1])? pop函數(shù)默認彈出最后一個元素 且list也會減少一個元素
現(xiàn)有列表a[1,2,3,4,5,6]
要實現(xiàn)棧 就一直用 a.pop()? , a.apend(x)
要實現(xiàn)隊列 就一直用 a.pop(0)? ,? a.apend(x)
(13)列表推導(dǎo)式由包含一個表達式的中括號組成随抠,表達式后面跟隨一個 for 子句如蚜,之后可以有零或多個 for 或 if 子句沽翔。結(jié)果是一個列表,由表達式依據(jù)其后面的 for 和 if 子句上下文計算而來的結(jié)果構(gòu)成。
? ? ? ?>>> list?= [x**2 for x in range(10)]? ? #? list =? [0, 1, 4, 9, .....81]
? ? ? ? ?x ** 2就是表達式? 將表達式后面的語句的計算結(jié)果依次帶入表達式毛仪,生成一個列表
? ? ? ??>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
????????????????[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
????????????(x,y)是表達式?
5.tuple? 元組? 不可變元素 寫在()內(nèi) 用逗號分隔
a=(123 , 'chen' , 'aa' )
a[1: ]? ? ?# ('chen' , 'aa')
a=(123)? # type(a)==int
a=(123,)? # type(a) == tuple
6. set 集合? 無序 無重復(fù)元素 {}或set()創(chuàng)建
(1)消除重復(fù)
>>> a = {1,3,4,1,3,2}
>>> print(a)
? ? ? ? {1,3,4,2}? ? 重復(fù)元素被消除
或者用set()函數(shù)創(chuàng)建
>>> a = set('chenrui')? ? ?# a={'c', 'h', 'e', 'n', 'r', 'u', 'i'}
>>> a = set( ['chen', 'rui', 123,789] )? # a={'chen', 'rui', 123,789}
(2)交? 并 差 對稱差集
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a? ? ? ? ? ? # a 去重后的字母{'a', 'r', 'b', 'c', 'd'}
>>> a - b? ?????# 差 {'r', 'd', 'b'}
>>> a | b? ? ? ?# 聯(lián)合? {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b? ? ? #交{'a', 'c'}
>>> a ^ b? ? ? ?# 對稱差集? 存在于 a 或 b 但不同時存在的字母{'r', 'd', 'b', 'm', 'z', 'l'}
(3)集合推導(dǎo)式?
? ?a = { x for x in 'abcdefg' if x not in 'abcd'}
# a = {'e', 'f', 'g'}
(4)各種方法
http://www.runoob.com/python3/python3-set.html
7.字典? 鍵唯一 但一個鍵可以有多個值 (通過列表實現(xiàn))
a = {'chen' : 'rui' , 'asc':' asd', 'cccc':'wqe'}
a= {'chen':['asd', 'asdqwq', '123'], 'rui':'ee', 'man':'bbb'}
(1)用dict()從包含鍵值對的元組中創(chuàng)建
a = dict( ( ('chen', 'rui'), ('asd', 'cx'),('asdqqq','wqezz') ) )
則a = {'chen':'rui', 'asd':'cx', 'asdqqq':'wqezz'}
(2)? del刪除
? del a['chen']
(3)?遍歷一個字典,使用字典的?items()?方法州刽。
? ??>>> data
{'Kushal': 'Fedora', 'Jace': 'Mac', 'kart_': 'Debian', 'parthan': 'Ubuntu'}
>>> for x, y in data.items():
? ? ?????????????print("{} uses {}".format(x, y))
(4)setdefault(key, default)? 與 get(key, default)
a.setdefault('name', 0)? #如果a沒有'name'這個鍵辕狰,則創(chuàng)建該鍵矿酵,并且值為0. 否則返回name鍵的值
a.get('name', 0)? ?#有name鍵 返回對應(yīng)的值。否則返回0
(5)zip() 函數(shù)
zip()?函數(shù)用于將可迭代的對象作為參數(shù)背犯,將對象中對應(yīng)的元素打包成一個個元組坏瘩,然后返回由這些元組組成的對象,這樣做的好處是節(jié)約了不少的內(nèi)存漠魏。
我們可以使用 list() 轉(zhuǎn)換來輸出列表倔矾。
如果各個迭代器的元素個數(shù)不一致,則返回列表長度與最短的對象相同柱锹,利用?*?號操作符哪自,可以將元組解壓為列表。
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)? ? # 返回一個對象
>>> zipped<zip object at 0x103abc288>
>>> list(zipped)????????? # list() 轉(zhuǎn)換為列表[(1, 4), (2, 5), (3, 6)]
>>> list(zip(a,c))? ? ? ? ? ? ? # 元素個數(shù)與最短的列表一致[(1, 4), (2, 5), (3, 6)]
>>> list(zip(a,b,c))? ? #? ? [(1,4,4), (2,5,5), (3,6,6)]
>>> a1, a2 = zip(*zip(a,b))? ? ? ? ? # 與 zip 相反禁熏,zip(*) 可理解為解壓壤巷,返回二維矩陣式
>>> list(a1)
????????[1, 2, 3]
>>> list(a2)
????????[4, 5, 6]
需要同時遍歷兩個序列類型,你可以使用?zip()?函數(shù)瞧毙。
>>>a= ['Pradeepto','Kushal']
>>>b= ['OpenSUSE','Fedora']
>>>for x, y in zip(a, b):
? ? ? ? ? ? ? print("{} uses {}".format(x, y))
輸出 Pradeepto uses OpenSUSE
? ? ?Kushal uses Fedora
8. *用于賦值
利用 * 表達式獲取單個變量中的多個元素胧华,只要它的解釋沒有歧義即可。* 獲取的值默認為 list
>>> a, b, *c =0,1,2,3
>>> a
0
>>> b
1
>>> c
[2,3]
9.? str.format()? ?利用{}和:
數(shù)字格式化
print( ' {:7.2f } '.format(3.141595) )? ? ?#3.14 后面3個空格? 注:小數(shù)點也占一位
print( ' {this is a? {:x>4d}} '.format(10) ')? ? # this is a xx10
print( ' {this is a? {:x<4d}} '.format(10) ' )? ? # this is a 10xx
可以傳入?yún)?shù)
day,name=12,'chen'
print(' today is {} , my name is {} '.format(day,name) )
也可以不格式化
print( ' x=? ' , x)
10.邏輯運算符? and or not
邏輯運算符?and?和?or?也稱作短路運算符:它們的參數(shù)從左向右解析宙彪,一旦結(jié)果可以確定就停止矩动。例如,如果?A?和?C?為真而?B?為假释漆,A and B and C?不會解析?C?悲没。作用于一個普通的非邏輯值時,短路運算符的返回值通常是能夠最先確定結(jié)果的那個操作數(shù)男图。
5 or 4? 返回5
3 and 0 and 1? ?返回0?
not?具有最高的優(yōu)先級示姿,or?優(yōu)先級最低,所以?A and not B or C?等于?(A and (notB)) or C
11.? if? for? while
(1) if
if :
? ? pass
elif:
? ? pass
else:
(2)for 與 range()與for? else
? ? ? ?a=[123 , 'asd' , 456]
? ? ? ? for x in a:
? ? ? ? ? ? ? ?print (x)
range(5)產(chǎn)生一個0-4的對象逊笆,不是列表
>>> a = range(5)
>>>? a
? ? ? ? range(5)
>>> b = list(a)
>>> b
? ? ? ? [0,1,2,3,4]
range(1,5,2)產(chǎn)生一個1-4的數(shù)列且步長為2? ? 即1 , 3
? ? ? ? for? x? in? range(len(a)) :
? ? ? ? ? ? ? ? ????print(a[x])
在循環(huán)后面使用可選的?else?語句栈戳。它將會在循環(huán)完畢后執(zhí)行,除非有?break?語句終止了循環(huán)难裆∽犹矗可以用來檢測for循環(huán)是否正常執(zhí)行完
for i in range(0, 5):?
????????????????print(i)
else:
????????????print("Bye bye")? ? ? ?
0?
1?
2?
3?
4?
Bye Bye?
(3)while? ??
? ? ?while n<10:
? ? ? ? ? ? ? ?pass
? ? ? ? while ...else ...用法與for相同
12.字符串
(1)str.split(str,num)? ?返回字符串被分割后的列表
str --分割依據(jù),默認為空格? ? num --分割次數(shù)
txt = "Google#Runoob#Taobao#Facebook"? ? ? ? ? ? ? ?
x = txt.split("#", 1)?????????????????# 第二個參數(shù)為 1差牛,返回兩個參數(shù)列表??['Google', 'Runoob#Taobao#Facebook']
(2)str.strip(char)? 剝離字符串中的指定字符 默認為首尾的空格和換行符
a = 'abcdefg...'
a.strip('bcd.')? ?#剝離字符串中的 'b', 'c', 'd', '.'字符
a = 'aefg'??
(3)str.find(char)? ? ?找到第一個匹配的子字符串命锄,沒有找到則返回 -1。
s = "faulty for a reason"
?s.find("for")
7
s.find("fora")
-1
(4)%格式化操作符 與c類似 多了括號和%
name = 'chen'
print('my name is %s? and my age is %d' % (name,16))
13.函數(shù)
(1)def函數(shù)名(參數(shù)):
? ? ????????????????語句1? ??
????????????????????語句2
(2)global? 關(guān)鍵字告訴編譯器后面的變量是全局的 即使在內(nèi)部改動也會影響外部的值
def change():
? ? global a
? ? a = 90
? ? print(a)
a = 9
print("Before the function call ", a)? ? #a=9
print("inside change function", end=' ')? ?
change()? ?#? a=90
print("After the function call ", a)? ?# a= 90
如果沒有g(shù)lobal 函數(shù)內(nèi)的a是局部變量偏化,與外面的a沒有關(guān)系
(3)默認參數(shù)值
def? f(a , b=-99):
? ? ? ? ? ? pass
注:1. 具有默認值的參數(shù)后面不能再有普通參數(shù)脐恩,比如?f(a,b=90,c)?就是錯誤的
? ? ? ? 2.?默認值只被賦值一次,因此如果默認值是任何可變對象時會有所不同侦讨,比如列表驶冒、字典或大多數(shù)類的實例苟翻。例如,下面的函數(shù)在后續(xù)調(diào)用過程中會累積(前面)傳給它的參數(shù):
? ??????deff(a, data=[]):? #默認參數(shù)是列表 可變的骗污。
????????????????data.append(a)
????????????????return data
????????print(f(1))
????????[1]
? ? ? ?print(f(2))? ?#此時調(diào)用f(), data的默認值為[1]
? ? ? ?[1, 2]
? ? ? ?print(f(3))
? ? ? ?[1, 2, 3]
要避免這個問題崇猫,你可以像下面這樣:
def f(a, data=None):? ? #None不是可變對象,所以作為默認值時需忿,data的值不會積累诅炉。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#即下次調(diào)用f時,data值還是None屋厘。設(shè)置為data=123也是一樣的效果涕烧。123是字面量,不? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#可變汗洒,值不會積累
? ? ? ? if data is None:? ? ??
????????data = []
? ? ? ? data.append(a)
? ? ? ? return data
print(f(1))? #? ?[1]
print(f(2))? #? ?[2]
(4)關(guān)鍵字參數(shù)
可變參數(shù)允許你傳入0個或任意個參數(shù)议纯,這些可變參數(shù)在函數(shù)調(diào)用時自動組裝為一個tuple,而關(guān)鍵字參數(shù)允許你傳入0個或任意個含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動組裝為一個dict溢谤。請看示例:
def person(name, age, **kw):
????print('name:', name,'age:', age,'other:', kw)
函數(shù)person除了必選參數(shù)name和age外瞻凤,還接受關(guān)鍵字參數(shù)kw,前面兩個**。在調(diào)用該函數(shù)時世杀,可以只傳入必選參數(shù):
>>> person('Michael',30)
? 輸出? name:Michaelage:30other:{}
也可以傳入任意個數(shù)的關(guān)鍵字參數(shù):
>>> person('Bob',35, city='Beijing')? ? # key=value? ? ? 調(diào)用時若key,value均為字符串key不能加引號阀参,value要加
????name:Bob age:35 other:{'city':'Beijing'}
>>> person('Adam',45, gender='M', job='Engineer')
????name:Adam age:45 other:{'gender':'M','job':'Engineer'}
關(guān)鍵字參數(shù)有什么用?它可以擴展函數(shù)的功能玫坛。比如结笨,在person函數(shù)里包晰,我們保證能接收到name和age這兩個參數(shù)湿镀,但是,如果調(diào)用者愿意提供更多的參數(shù)伐憾,我們也能收到勉痴。試想你正在做一個用戶注冊的功能,除了用戶名和年齡是必填項外树肃,其他都是可選項蒸矛,利用關(guān)鍵字參數(shù)來定義這個函數(shù)就能滿足注冊的需求。
和可變參數(shù)類似胸嘴,也可以先組裝出一個dict雏掠,然后,把該dict轉(zhuǎn)換為關(guān)鍵字參數(shù)傳進去:
>>> extra = {'city':'Beijing','job':'Engineer'}? ?#先組裝一個dict
>>> person('Jack',24, city=extra['city'], job=extra['job'])
????????name:Jack age:24 other:{'city':'Beijing','job':'Engineer'}
當然劣像,上面復(fù)雜的調(diào)用可以用簡化的寫法:
>>> extra = {'city':'Beijing','job':'Engineer'}
>>> person('Jack',24, **extra)
????????name:Jack age:24 other:{'city':'Beijing','job':'Engineer'}
**extra表示把extra這個dict的所有key-value用關(guān)鍵字參數(shù)傳入到函數(shù)的**kw參數(shù)乡话,kw將獲得一個dict,注意kw獲得的dict是extra的一份拷貝耳奕,對kw的改動不會影響到函數(shù)外的extra绑青。
(5)可變參數(shù)(列表參數(shù))
(7)強制關(guān)鍵字參數(shù)
defdog(name, host, *, age):
????????print(name, host, age)
參數(shù)中有一個 “*” 號诬像,在該符號之后的所有參數(shù)(可一至多個)均被稱為強制關(guān)鍵字參數(shù),如果按照位置參數(shù)的方式對這些參數(shù)傳值:
dog('dobi','xuzhoufeng',2)
????????TypeError: dog() takes 2 positional arguments but 3 were given
就會出現(xiàn)?TypeError闸婴,正確的傳值形式為:
dog('dobi', 'xuzhoufeng', age =2)?
????????dobi xuzhoufeng 2
也即這里的age?必須使用關(guān)鍵字參數(shù)的形式進行傳值坏挠。
(8)map函數(shù)
map?是一個在 Python 里非常有用的高階函數(shù)。它接受一個函數(shù)和一個序列(迭代器)作為輸入邪乍,然后對序列(迭代器)的每一個值應(yīng)用這個函數(shù)降狠,返回一個迭代器,不是現(xiàn)成的列表庇楞,其包含應(yīng)用函數(shù)后的結(jié)果喊熟。
舉例:
>>> lst = [1,2,3,4,5]
>>> def square(num):
? ? ? ? ????returnnum * num
>>> print(list(map(square, lst)))
????????[1,4,9,16,25]
又:
list(map(lambda x,y:x+y, [1,2,3,4], [1,2,3,4]))
結(jié)果是 [2,4,6,8]
(9)? enumerate()函數(shù)?
用于將一個可遍歷的數(shù)據(jù)對象(如列表、元組或字符串)組合為一個索引序列姐刁,同時列出數(shù)據(jù)和數(shù)據(jù)下標芥牌,一般用在 for 循環(huán)當中。
list = ['Spring', 'Summer', 'Fall', 'Winter']
for i, x in enumerate(list):
? ? print(i, x)
輸出:
0 Spring
1 Summer
2 Fall
3 Winter
14.文件
(1)open()? close()
r --只讀
r+ --打開一個文件用于讀寫聂使。文件指針將會放在文件的開頭
w --以寫入模式打開壁拉,如果文件存在將會刪除里面的所有內(nèi)容,然后打開這個文件進行寫入
w+ --打開一個文件用于讀寫柏靶。如果該文件已存在則打開文件弃理,并從開頭開始編輯,即原有內(nèi)容會被刪除屎蜓。如果該? ? ? ? ? ? 文件不存在痘昌,創(chuàng)建新文件
a --以追加模式打開,寫入到文件中的任何數(shù)據(jù)將自動添加到末尾
a+ --打開一個文件用于讀寫炬转。如果該文件已存在辆苔,文件指針將會放在文件的結(jié)尾。文件打開時會是追加模式扼劈。如? ? ? ? ? ? 果該文件不存在驻啤,創(chuàng)建新文件用于讀寫。
file_object = open('filename'[,'r/w/a'])? #open()返回一個對象荐吵,第一個參數(shù)為文件名骑冗,第二個默認為r。
file_object.close()? ? ?#用完一定要關(guān)閉
(2)讀取
file_object.read([size])? #默認讀完整個文件 返回的是字符串
file_object.readline()? ?#讀一行
file_object.readlines()? #讀所有行 以列表形式保存
比如 file_object = open('sample.txt')
>>> file_object.readlines()
['I love Python\n', 'I love shiyanlou\n']
也可以循環(huán)的方式讀
for x in file_object:
? ? print(x, end='')? ?
輸出 :
I love Python
I love shiyanlou
注:可以把讀的結(jié)果給一變量? s = file_object.read()? ?print(s)
for i in file_object :? ? #? ?i 此時是一行一行的字符串? ??
? ? ? ? ? ? ? pass
for i in file_object.read() :? ? ?#? i? 此時是一個一個的字符
? ? ? ? ? ? ? ?pass
(3)write()? 寫入
file_object = open('test.txt','w')??
file_object.write('this is a test\n')? #? 'w'模式下會清空文件再寫
(4)? sys模塊中的argv? ?sys.argv[]
用于在命令行模式中獲取參數(shù)
假設(shè)sample.py 文件用于文件的拷貝
```
import sys
file1 = open(sys.argv[1])? ?#sys.argv[1]具體是什么要取決于命令傳入的參數(shù)
s = file1.read()
file2 = open(sys.argv[2], 'w')
file2.write(s)
```
$ python3 sample.py newfile.py? ?#此處即為命令行命令? 第一個參數(shù)永遠是文件路徑及文件名第二個參數(shù)是? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#sample.py? 第三個是newfile.py
則sys.argv[0] = 文件路徑及文件名
? ? sys.argv[1] = sample.py
? ?sys.argv[2] = newfile.py
(5)with語句
with?語句處理文件對象先煎,它會在文件用完后會自動關(guān)閉贼涩,就算發(fā)生異常也沒關(guān)系。它是 try-finally 塊的簡寫:
>>>?
with open('sample.txt') as fobj:
?????????for line in fobj:
?????????????print(line, end ='')
輸出:
I love PythonI?
love shiyanlou
15.異常? ? 一定要看這篇博客https://www.cnblogs.com/wj-1314/p/8707804.html
注:博客中沒有提到的如下
(1)try語句執(zhí)行遇到錯誤會拋出給except捕獲并保存當前pc薯蝎,若捕獲失敗遥倦,則程序終止。捕獲成功良风,執(zhí)行該except下的語句谊迄,執(zhí)行完后從原pc繼續(xù)執(zhí)行try語句
異常處理是為了在程序運行發(fā)生錯誤時不讓程序終止運行闷供,而是拋出一個自定義的語句來提醒用戶發(fā)生了錯誤,
except用來捕捉程序運行時發(fā)生的錯誤统诺。如果發(fā)生的錯誤沒被except捕捉歪脏,則程序會直接結(jié)束,這樣不好粮呢。
while True:
????try:
????????num =int(input('輸入一個數(shù):'))
????????num =5/num
????????print(num)
? ? except ZeroDivisionError:? ? ? ?
????????print('輸入數(shù)字不能為0')
#當用戶輸入0婿失,自然會產(chǎn)生異常,即ZeroDivisionError啄寡,若不用except捕捉豪硅,則直接回結(jié)束程序,不會給用戶第二次輸入的機會
(2)else語句
如果使用這個子句挺物,那么必須放在所有的except子句之后懒浮。這個子句將在try子句沒有發(fā)生任何異常的時候執(zhí)行。例如:
for arg in sys.argv[1:]:
? ? try:
? ? ? ? f = open(arg, 'r')? ??
????except IOError:
? ? ? ? print('cannot open', arg)? ??
????else:
? ? ? ? print(arg, 'has', len(f.readlines()), 'lines')? ? ? ??
f.close()
使用 else 子句比把所有的語句都放在 try 子句里面要好识藤,這樣可以避免一些意想不到的砚著、而except又沒有捕獲的異常。
(3)Exception是所有 NameError的基類
try :
? ? ? ? .....
except Exception:? ? ? ? ?捕捉Exception時痴昧,會捕捉所有的異常 等同于只寫except
? ? ? ? .....
(4) raise?
try:
????raise?TypeError('類型錯誤')? ? #主動拋出一個TypeError型異常稽穆,是Exception的子類
except?Exception as e:? ? ? ? #由于是Exception是基類異常,所以會捕獲所有try拋出的異常
????print(e)? ? ? ? ??
輸出:
'類型錯誤'
(5) except NameError as e:
? ? ? ? ? ? ? ? ......
e是NameError類的實例赶撰,與? except NameError:? ....? 有區(qū)別
(6)自定義異常類
class MyError(Exception):
????def __init__(self,value):
????????self.value = value
????def __str__(self):? ? #__str__魔法方法 會在實例被要求print()的時候被調(diào)用
????????return self.value
try:
????raise MyError('my error')? ? ?#self.value = 'my error'
except MyError as e:? ? # e是MyError類的實例
????print(e)? ? ?#此處print()調(diào)用了e的__str__魔法方法
(7)在真實場景的應(yīng)用程序中舌镶,finally?子句用于釋放外部資源(文件或網(wǎng)絡(luò)連接之類的),無論它們的使用過程中是否出錯豪娜。
16.類
(1)語法
class nameoftheclass(parent_class):
? ? statement1? ??
????statement2? ??
????statement3
(2)__init__(self[,v1[,v2...])
類的實例化操作會自動為新創(chuàng)建的類實例調(diào)用?__init__()?方法
classComplex:
?????def__init__(self, realpart, imagpart):
? ? ? ? ? ?self.r = realpart
? ? ? ? ? ?self.i = imagpart
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)
(3)self
self代表類的實例餐胀,即當前對象的地址,而非類侵歇。類的方法與普通的函數(shù)只有一個特別的區(qū)別——它們必須有一個額外的第一個參數(shù)名稱, 按照慣例它的名稱是 self骂澄。
(4) 子類調(diào)用父類的方法的兩種形式
如下代碼中的???處進行父類方法調(diào)用
class Person:
? ? def __init__(self, name):
? ? ? ? ? ? self.name = name
? ? def ps(self):
? ? ? ? ? ? print('my name is {}'.format(self.name))
class Student(Person):
? ? ? ? def __init__(self,name,age,sex):
? ? ? ? ? ? ? ? ???
? ? ? ? ? ? ? ? self.age = age
? ? ? ? ? ? ? ? self.sex = sex
? ? ? ? ?def ps1(self):
? ? ? ? ? ? ? ? print('my name is {} , my age is {}, my sex is {}'.format(self.name,self.age,self.sex))
第一種是直接法吓蘑。使用父類名稱直接調(diào)用惕虑,形如?parent_class.parent_attribute(self),對應(yīng)例程即語句:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Person.__init__(self,name)? ?#一定要有self
? ? ? 第二種是通過super函數(shù)磨镶,形如 super(child_class, child_object).parent_attribute(arg)溃蔫。第一個參數(shù)表示調(diào)用父類的起始處,第二個參數(shù)表示類實例(一般使用self)琳猫,父類方法的參數(shù)只有self時伟叛,參數(shù)args不用寫。此外脐嫂,類內(nèi)部使用時统刮,child_class, child_object也可省略紊遵。對應(yīng)例程:
super(Student,self).__init__(name)
或者:
super().__init__(name)
在類外面也可使用super函數(shù),但是要有child_class, child_object兩個參數(shù)侥蒙。
(5)裝飾器??https://www.zhihu.com/question/26930016
首先明確? ?func與func()
函數(shù)只寫函數(shù)名表示函數(shù)對象本身暗膜,加上括號表示執(zhí)行這個函數(shù)
很多時候,你需要對一段代碼加上權(quán)限認證鞭衩,加上各種功能学搜;但是又不想,或者不方便破壞原有代碼论衍,則可以用裝飾器去擴展它瑞佩。比如play()函數(shù)默認播放動畫片,現(xiàn)在規(guī)定年齡范圍內(nèi)的才能看坯台,可以不用改動play()函數(shù)炬丸,使用裝飾器
userAge=40
def canYou(func):
????????def decorator(*args,**kwargs):
????????????if userAge > 1 and userAge < 10:
????????????????return func(*args,**kwargs)? ?#func加了括號,說明返回的是對這個函數(shù)的執(zhí)行
? ? ? ? ? ? print('你的年齡不符合要求蜒蕾,不能看')
? ? ? ? ?return decorator? ? ? ?#返回的是函數(shù)對象decorator,相當于一個變量御雕,沒有執(zhí)行這個函數(shù)
@canYou? ? # @為語法糖? 實際為 play = canYou(play),在函數(shù)定義后執(zhí)行。? 執(zhí)行后滥搭,play指向了decorator這個對
? ? ? ? ? ? ? ? ? ? #象酸纲。此時的play不再是原來的單一功能的函數(shù),而是一個有了年齡判斷功能的新函數(shù)
def play():
? ? print('開始播放動畫片 《喜洋洋和灰太狼》')
play()
# 輸出
# 你的年齡不符合要求瑟匆,不能看
# 你可以修改上面的 userAge 為9 試試
Python連接數(shù)據(jù)庫的步驟
1)建立數(shù)據(jù)庫連接? ? ? ? ? ?(db = pymysql.connect(......))
2)創(chuàng)建游標對象? ? ? ? ? ? ? ?(c = db.cursor())
3)游標方法? ? ? ? ? ? ? ? ? ? ? ?(c.execute(sql語句))
4)提交到數(shù)據(jù)庫? ? ? ? ? ? ? ? (db.commit())
5)關(guān)閉游標對象? ? ? ? ? ? ? ? ?(c.close())
6)關(guān)閉數(shù)據(jù)庫? ? ? ? ? ? ? ? ? ? ?(db.close())
connect對象
? ? ? ? ? ? ? 1)db=pymysql.connect(參數(shù)列表)
? ? ? ? ? ? ? ? ? ? 參數(shù)列表有:
? ? ? ? ? ? ? ? ? ? 1. host : 主機地址闽坡,本地地址 localhost
? ? ? ? ? ? ? ? ? ? 2. port : 端口號 ,默認為3306
? ? ? ? ? ? ? ? ? ? 3. user : 用戶名
? ? ? ? ? ? ? ? ? ? 4. password : 密碼
? ? ? ? ? ? ? ? ? ? 5. database : 要連接到的庫
? ? ? ? ? ? ? ? ? ? 6. charset : 編碼方式愁溜,推薦使用 utf8
? ? ? ? ? ? ? 2)數(shù)據(jù)庫連接對象(db)的方法
? ? ? ? ? ? ? ? ? ?1.db.close() ? ?關(guān)閉連接
? ? ? ? ? ? ? ? ? ?2.db.commit() ? ?提交到數(shù)據(jù)庫執(zhí)行
? ? ? ? ? ? ? ? ? ?3.db.rollback() ?回滾
? ? ? ? ? ? ? ? ? ?4.db.cursor() ? ?返回游標對象疾嗅,用于具體執(zhí)行
? ? ? ? ? ? ? ? ? ?SQL命令
? ? ? ? ? ? ? 3)游標對象(cur)的方法
? ? ? ? ? ? ? ? ? ?1.cur.execute(SQL命令,[列表]) ? 執(zhí)行SQL命令
? ? ? ? ? ? ? ? ? ?2.cur.close() ? ? ? ? ? ?關(guān)閉游標對象
? ? ? ? ? ? ? ? ? ?3.cur.fetchone() ?獲取查詢結(jié)果集的第一條數(shù)據(jù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?【獲取結(jié)果為一個元組】
? ? ? ? ? ? ? ? ? ?4.cur.fetchmany(n) ?獲取查詢結(jié)果集的第n條數(shù)據(jù)
? ? ? ? ? ? ? ? ? ? ? 【獲取結(jié)果為一個元組 如:((記錄1),(記錄2))】
? ? ? ? ? ? ? ? ? ?5.cur.fetchall() ? ?獲取所有記錄(結(jié)果為元組)
? ? ? ? ? ? ? ? ? ?注意:
? ? ? ? ? ? ? ? ? ?fetchone , fetchmany , fetchall 均獲取一條記錄少一條記錄