函數(shù)
常用內(nèi)置函數(shù)
計(jì)算函數(shù)
abs(-1) # 絕對(duì)值
pow(2,5) # 冪: 等效于 2**5
sum([2,3,4]) # 累加和
divmod(92, 10) # 模: 返回為9, 2
round(3.1415926,3) # 精確值: 返回為3.142 (自動(dòng)四舍五入)
檢測(cè)函數(shù)
max([1,4,5]) # 最大值
min([1,3,4]) # 最小值
all([1,2,39,0]) # 檢查是否全為T(mén)rue箫章,返回bool: 這里返回False
any([1,2,4,0]) # 檢查是否存在True锭部,返回bool: 這里返回True
進(jìn)制轉(zhuǎn)換函數(shù)
v1 = bin(55) # 十進(jìn)制 -> 二進(jìn)制
v2 = int('0b0100110', base = 2) # 二進(jìn)制(0b) -> 十進(jìn)制
v1 = oct(55) # 十進(jìn)制 -> 八進(jìn)制
v2 = int('0o173', base = 8) # 八進(jìn)制(0o) -> 十進(jìn)制
v1 = hex(55) # 十進(jìn)制 -> 十六進(jìn)制
v2 = int('0o9a3', base = 16) # 十六進(jìn)制(0x) -> 十進(jìn)制
字符進(jìn)制
v1 = ord('我') # 獲得字符 unicode 的十進(jìn)制表示:字符->數(shù)字
v1 = chr(65) # 由 unicode 十進(jìn)制獲取字符:數(shù)字->字符
排序
a = [1,3,2]
a.sort() # 將列表排序
b = sorted(a) # 排序但不影響原列表,生成新列表返回
def func1(x):
return int(x[:2])
b = sorted(a, key = func1) # 自定義排序規(guī)則般哼,以func1返回值排序
隨機(jī)函數(shù)random
random.randint(1,10) # 隨機(jī)整數(shù)
random.uniform(0,5.5) # 隨機(jī)小數(shù)
random.choice([1,2,3,5]) # 列表中隨機(jī)值
random.sample([1,2,3,4],2) # 列表中隨機(jī)取兩個(gè)數(shù)谷朝,返回為列表形式
number_list = [1,2,66,8]
random.shuffle(number_list) # 將原列表打散
函數(shù)傳參:默認(rèn)值為可變類(lèi)型格式
def func(a = []):
pass
函數(shù)創(chuàng)建的時(shí)候則生成了空列表激捏,后續(xù)調(diào)用如果不傳參的時(shí)候,都會(huì)使用這個(gè)空列表煮盼,類(lèi)似于C語(yǔ)言中的static參數(shù)短纵。所以默認(rèn)為可變類(lèi)型時(shí)建議:
def func(a = None):
if not a:
a = []
pass
傳參中 * 的用法
乘法運(yùn)算
收集列表中多余的值
a,b,*c = [1,2,3,4,5]
# a = 1, b = 2, c = [3, 4, 5]
- 函數(shù):以元組形式接受參數(shù) ( *args )
def f(a,*args):
print(args)
f(1, 2, 3, 4, 5, ['a', 'b'])
# a = 1, args = (2, 3, 4, 5, ['a', 'b'])
# 即將其后所有參數(shù)放入一個(gè)元組中
- 函數(shù):以關(guān)鍵字形式接受參數(shù) ( **args )
def f(**args):
print(args)
f(a = 1, b = 2)
# args為字典,{'a' = 1, 'b' = 2}
生成器函數(shù):yield
def func(): # 生成器函數(shù)
print(1)
yield 1
print('next')
yield 'xx'
a = func() # 生成器對(duì)象
a.__next__ # 調(diào)用生成器對(duì)象僵控,并運(yùn)行至下一個(gè)yield踩娘,并返回值
# 如果函數(shù)代碼全部結(jié)束會(huì)返回None
for item in a:
print item # 可以使用循環(huán)遍歷生成器對(duì)象
適用于大數(shù)據(jù)量情況下的操作,減少內(nèi)存占用喉祭。range默認(rèn)使用生成器函數(shù)創(chuàng)建
global
關(guān)鍵字
global name
name = 'XXX'
# global 關(guān)鍵字可以在函數(shù)直接使用全局變量养渴,并直接修改變量值
閉包(裝飾器)
def func(n1):
v1 = 111
def inner():
print(n1 + v1)
return inner # 返回函數(shù)名
a = func(2)
b = func(33)
c = func(66) # 先將數(shù)據(jù)封裝在了包(作用域)中
# 執(zhí)行時(shí)再獲取封裝時(shí)的值
a() # 113
b() # 144
c() # 177
多用于線程池
用法: 裝飾器
def func1(a1):
def inner():
print('test')
a1()
return inner
@fun1
def func2():
print('inner')
# 相當(dāng)于執(zhí)行 func2 = func1(func2)
閉包應(yīng)用: 裝飾器。不改動(dòng)原函數(shù)的情況下泛烙,添加功能
多個(gè)返回值本質(zhì):元組
def func():
return 1,2
a, b = fuc()
# a = 1, b = 2
# 實(shí)際返回為(1,2)理卑,隨后python會(huì)對(duì)其自動(dòng)解包,按順序賦值
郵件
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
# 郵件內(nèi)容
msg = MIMEText('hello', 'html', 'utf-8') # 郵件內(nèi)容
msg['Subject'] = 'my主題' # 主題
msg['From'] = formataddr(['ght', 'XXXX@136.com']) # 名字和郵箱
msg['to'] = 'xxx@qq.com' # 目標(biāo)郵箱
# 發(fā)送郵件
server = smtplib.SMTP_SSL('smtp.163.com') # SMTP服務(wù)器
server.login('XXXX@136.com', 'XXDDWWGSX') # 賬戶(hù)蔽氨、授權(quán)碼
server.sendmail('XXXX@136.com', 'xxx@qq.com',
msg.as_string()) # 自己郵箱藐唠、目標(biāo)郵箱帆疟、內(nèi)容
server.quit()
類(lèi)
類(lèi)變量
class TestClass:
# 變量:
city = 'xian' # 類(lèi)變量
def __init__(self, name):
self.name = name # 實(shí)例變量
v1 = TestClass('shanghai')
print(v1.name) # 上海
print(v1.city) # 西安
print(TestClass.city) # 西安
類(lèi)方法
class TestClass:
def print_str(self): # 綁定方法:需要self參數(shù)
pass
@staticmethod # 靜態(tài)方法:不需要self參數(shù)
def static_method():
pass
@classmethode # 類(lèi)方法:需要cls參數(shù)
def class_method(cls, a1):
pass
# 綁定方法需要實(shí)例化再調(diào)用,靜態(tài)方法可以直接通過(guò)類(lèi)調(diào)用宇立,也可以實(shí)例化調(diào)用
v1.print_str()
v1.static_method() # 實(shí)例化兩個(gè)都可以調(diào)用
TestClass.static_method() # 靜態(tài)方法直接通過(guò)類(lèi)調(diào)用
TestClass.class_method() # 類(lèi)方法于靜態(tài)方法類(lèi)似
類(lèi)屬性
class TestClass:
@property # 將方法偽造為變量踪宠,
def d1(self): # 可以用v1.d1直接調(diào)用
return self.name + 'add_info' # 不能有self外其他參數(shù)
@d1.setter # 將對(duì)象偽造為變量,可用=號(hào)
def d1(self, val): # 調(diào)用v1.d1 = 'wuhan'妈嘹,相當(dāng)于'wuhan'傳入val
self.name = val
@d1.deleter # 調(diào)用del v1.d1時(shí)運(yùn)行此方法
def d1(self):
pass
print(v1.d1)
v1.d1 = 'wuhan'
del v1.d1
class TestClass:
x = property(get_x, set_x, del_x) # 快速創(chuàng)建x屬性
def get_x(self):
return 123
def set_x(self, val):
pass
def get_x(self):
pass
obj = TestClass()
print(obj.x)
obj.x = 88
del obj.x
特殊成員
__init__
def __init__(self, a1): # 初始化方法
pass
### `__new__`
def __new__(self, *args, **kwargs): # 構(gòu)造方法(默認(rèn)執(zhí)行)
# 創(chuàng)建空對(duì)象
obj = object.__new__(self)
return obj
__init__
實(shí)際做了兩件事:
創(chuàng)建空對(duì)象
obj = 對(duì)象
柳琢。(__new__
創(chuàng)建對(duì)象)執(zhí)行
__init__
方法。(__init__
初始化)
__call__
def __call__(self, *args, **kwargs): # 實(shí)例化對(duì)象直接調(diào)用
pass
obj = EgClass()
润脸,則obj()
意義為調(diào)用__call__
__dict__
print(obj.__dict__) # 得到字典形式的對(duì)象所有變量
class Foo:
city = 'shanghai'
def __init__(self, name):
self.name = name
self.age = 20
obj = Foo('xiaowang')
print(obj.__dict__)
# {'name':'xiaowang', 'age': 20}
print(Foo.__dict__)
# {拿到類(lèi)中所有方法和變量的值}
__str__
class Foo:
def __init__(self):
pass
def __str__(self):
return 'qte'
obj = Foo()
print(obj)
# 輸出 qte
__getitem__
, __setitem__
, __delitem__
class Foo:
def __init__(self, name):
self.name = name
self.age = 20
def __getitem__(self, item):
return 999
def __setitem__(self, key, val):
pass
def __delitem__(self, key):
pass
obj[22]
:將22
以item
參數(shù)柬脸,傳入__getitem__
obj[0] = 'test'
:將0
以key
參數(shù),'test'
以val
參數(shù)毙驯,傳入__setitem__
del obj[99]
:將99
以key
參數(shù)倒堕,傳入__delitem__
__enter__
, __exit__
class Foo:
def __init__(self, name):
self.name = name
self.age = 20
def __enter__(self):
print('start')
return "return_info"
def __exit__(self):
print('end')
obj = Foo('xiaowang')
with obj as o:
print(123)
# start
# 123
# end
__enter__
,__exit__
需成對(duì)使用,with
開(kāi)始時(shí)調(diào)用__enter__
, 結(jié)束時(shí)調(diào)用__exit__
爆价。__enter__
中返回的值為with obj as o
中的o
__add__
等
class Foo:
def __init__(self, name):
self.name = name
self.age = 20
def __add__(self, other):
return self.age + other.age
f1 = Foo('root')
f2 = Foo('admin')
data = f1 + f2 # 即:f1.__add__(f2)
類(lèi)似的加減乘除垦巴、大于小于不等于都可以使用類(lèi)似方法
模塊
文件操作
f = open('path', 'w')
content = f.read() # 獲取文件所有內(nèi)容
content = f.read(N) # 按N個(gè)字節(jié)逐次讀取入內(nèi)存
for i in f: # 按行讀取,內(nèi)存占用小
f.flush() # 將文件的內(nèi)容直接存儲(chǔ)的硬盤(pán)
__file__ # 運(yùn)行腳本的文件路徑
os.path.abspath('path.txt') # 獲取絕對(duì)路徑
os.path.join('a', 'b', 'c.txt') # 連接字符為路徑:a/b/c.txt
os.path.dirname('path.txt') # 獲取文件所在目錄
os.path.exists('path.txt') # 判斷路徑是否存在铭段,返回True/False
os.path.isdir('./path') # 判斷是否為文件夾
os.remove('path.txt') # 刪除文件(沒(méi)辦法刪除文件夾)
os.listdir('dir') # 獲取文件夾一級(jí)目錄中的所有的文件名
os.walk('dir')
'''
獲取文件夾中所有文件(包括嵌套)返回元組:
('a', [b], [c])
第一個(gè) 'a' 為當(dāng)前迭代的目錄骤宣,
第二個(gè) [b] 為文件夾內(nèi)的目錄list,
第三個(gè) [c] 為文件夾內(nèi)的文件list稠项。
使用for循環(huán)時(shí),每次迭代[b]中的目錄鲜结,直到遍歷所有目錄展运,
返回格式同上,即('a', [b], [c])格式
例:
for in_path, folder_list, name_list in os.walk('path')
'''
shutil.rmtree('path') # 刪除文件夾以及其內(nèi)容
shutil.move('a.txt', 'b.txt') # 將文件改名(文件夾也可以)
shutil.copytree('aa', 'bb') # 將文件夾拷貝到目標(biāo)位置
shutil.copy('aa/bb.txt', 'cc') # 將文件拷貝到目標(biāo)位置
shutil.make_archive(base_name = 'a', format = 'zip' , root_dir = 'y')
# 壓縮文件
shutil.unpack_archive('a.zip', extract_dir = 'xxx', format = 'zip')
# 解除壓縮
configparser
import configparser
config = configparser.Configparser() # 初始化
config.read('path.txt', encoding = 'utf-8') # 讀取文件
x = config.sections() # 獲取節(jié)點(diǎn)值['server', 'client']
y = config.items('server') # 獲取'server'節(jié)點(diǎn)鍵值對(duì)
z = config.get('server', 'v1') # 獲取'server'節(jié)點(diǎn)精刷,'v1'的值
config.has_section('server') # 是否存在某個(gè)節(jié)點(diǎn)
config.add_section('test') # 添加節(jié)點(diǎn)
config.set('test','name','12') # 為某個(gè)節(jié)點(diǎn)添加鍵值拗胜,或修改鍵值
config.remove_section('server') # 刪除節(jié)點(diǎn)
config.remove_option('server', 'v1') # 刪除鍵值
with open('path.txt','w', encoding = 'utf-8') as f:
config.write(f) # 寫(xiě)入文件
json
json.loads() # 解碼json數(shù)據(jù),返回字典
json.dumps() # 將字典編碼為json格式
json.dumps(XX, indent = 2) # 為字符串添加縮進(jìn)
xml
<data>
<country name = 'China'>
<rank updata = 'yes'>69</rank>
# tag:rank attrib:updata = 'yes' text:99
</country>
</data>
from xml.etree import ElementTree
root = ElementTree.XML(CONTENT) # 獲取內(nèi)容
node1 = root.find('country') # 找到特定節(jié)點(diǎn)內(nèi)容
node2 = root.findall('country')
for i in node2:
print(i.tag, i.attrib, i.text)
re:正則表達(dá)式
\d{11} 數(shù)字 {11位}
\w{5,10} 字符 {5-10位}
XX[a,b,d] 固定文本+可變范圍[a,b,d]: XXa, XXb, XXd
XX[a-z] or XX[0-9] 固定文本+可變范圍[a-z]或[0-9]
. 除了換行符以外的任意字符
[a-zA-Z0-9_-] 可組合多個(gè)范圍的字符
數(shù)量相關(guān)(\d為例):
\d? ? 表示為0或1
\d+ + 表示為1或n
\d* * 表示為0或n
{9} 表示為9個(gè)
{9,} 表示為9及以上
{1,9} 表示為1到9個(gè)
^ 起始符
$ 終止符
默認(rèn)貪婪匹配
import re
res = re.findall(r'\d{11}', example) # 獲取所有和正則表達(dá)式匹配的字符串
res = re.findall(r'@(\d{11})', example) # 獲取匹配的字符串怒允,返回括號(hào)內(nèi)的內(nèi)容
res = re.match(r'^\d{11}\w+$', example) # 返回第一個(gè)匹配埂软,沒(méi)有返回None
res = re.search(r'^\d{11}\w+$', example) # 縱觀全部字符串,但返回第一個(gè)匹配
res = re.split('[,\.]', example) # 通過(guò)','和'.'將字符串切割纫事,返回列表
openpyxl:excel
from openpyxl import load_workbook
wb = load_workbook('test.xlsx') # 以路徑方式打開(kāi)excel文件
f = open('test.xlsx')
wb = load_workbook(f) # 以對(duì)象方式打開(kāi)excel文件
all_sheet = wb.worksheets # excel中的每個(gè)sheet(對(duì)象)
single_cell = all_sheet[0].cell(2,3) # 某個(gè)sheet中特定坐標(biāo)的內(nèi)特
all_sheet_name = wb.sheetname # 所有sheet名字(list形式)
wb['sheet_name'] # 通過(guò)索引方式抓取特定sheet
row1 = sheet[1] # 獲取某一行
all_rows = sheet.rows # 獲取所有行
for i in sheet.iter_rows(min_row=1, max_row=4) # 循環(huán)讀取一個(gè)區(qū)間的行
wb.save('test2.xlsx') # 存儲(chǔ)文件
并發(fā)編程
進(jìn)程和線程
GIL鎖保證每個(gè)進(jìn)程只占用一個(gè)CPU勘畔,使用多核需要使用多進(jìn)程。
線程丽惶,IO密集型使用多線程(并發(fā))
IO操作炫七、輸入輸出等,一般可以直接通過(guò)驅(qū)動(dòng)完成的任務(wù)钾唬。如:網(wǎng)絡(luò)請(qǐng)求
import threading
def task(a):
pass
for i in range(10): # 創(chuàng)建十個(gè)線程
t = threading.Thread(target = task, arg = ('path',))
t.start()
進(jìn)程万哪,CPU密集型使用多進(jìn)程(并行)
一個(gè)程序可以有多個(gè)進(jìn)程侠驯,其中每個(gè)進(jìn)程會(huì)有GIL鎖,保證每個(gè)進(jìn)程只占用一個(gè)CPU奕巍。多線程可以充分利用CPU吟策,但是開(kāi)銷(xiāo)更大。
import multiprocessing
def task(a):
pass
for i in range(10): # 創(chuàng)建十個(gè)進(jìn)程
t = multiprocessing.Process(target = task, arg = ('path',))
t.start()
進(jìn)程池和線程池
防止無(wú)限制開(kāi)進(jìn)程和線程
線程池
from concurrent.futures import ThreadPoolExecutor
def task(a):
pass
pool = ThreadPoolExecutor(5) # 創(chuàng)建五個(gè)線程的線程池
for i in range(9):
pool.submit(task, 'test') # 提交任務(wù)
進(jìn)程池
from concurrent.futures import ProcessPoolExecutor
def task(a):
pass
pool = ProcessPoolExecutor(5) # 創(chuàng)建五個(gè)線程的線程池
for i in range(9):
pool.submit(task, 'test') # 提交任務(wù)
數(shù)據(jù)共享
一個(gè)進(jìn)程中的線程共享數(shù)據(jù)
進(jìn)程之間共享數(shù)據(jù)
from multiprocessing import Manager
import multiprocessing
def task(a):
pass
if __name__ == '__main__':
manager = Manager() # 創(chuàng)建共享對(duì)象
with manager:
data = manager.list() # 共享的數(shù)據(jù)
p = multiprocessing.Process(target = task, args = (data,))
t.start()
t.join() # 等到子進(jìn)程中的代碼執(zhí)行完畢在執(zhí)行下面的代碼
協(xié)程
協(xié)程本身不存在的止,由程序員人為創(chuàng)建檩坚。本質(zhì)是讓一個(gè)線程不停止,切換做多個(gè)任務(wù)(微線程)
應(yīng)用場(chǎng)景:IO等待
- 如果開(kāi)發(fā)過(guò)程中有IO等待冲杀,則適合使用協(xié)程效床。
線程與協(xié)程對(duì)比
- 并發(fā)能力差不多,但是協(xié)程資源消耗更
from greenlet import greenlet
def func1():
print(1) # 第2步:輸出1
gr2.switch() # 第3步:跳轉(zhuǎn)到func2函數(shù)
print(2) # 第6步:輸出2
gr2.swithc() # 第7步:跳轉(zhuǎn)到func2函數(shù)
def func2():
print(3) # 第4步:輸出3
gr1.switch() # 第5步:跳轉(zhuǎn)到func1函數(shù)
print(4) # 第8步:輸出4
gr1 = greenlet(func1)
gr2 = greenlet(func2)
gr1.switch() # 第1步:執(zhí)行協(xié)程
import asyncio
async def func1():
print(1)
await asyncio.sleep(2) # IO自動(dòng)切換到其他任務(wù)
print(2)
async def func2():
print(3)
await asyncio.sleep(2)
print(4)
tasks = [ # 添加任務(wù)
asyncio.ensure_future(func1()),
asyncio.ensure_future(func2())
]
loop = asyncio.get_event_loop()
loop.run_untill_complete(asyncio.wait(tasks))
垃圾回收機(jī)制
引用計(jì)數(shù):
為每個(gè)對(duì)象維護(hù)一個(gè) ref 的字段用來(lái)記錄對(duì)象被引用的次數(shù)权谁,每當(dāng)對(duì)象被創(chuàng)建或者被引用時(shí)將該對(duì)象的引用次數(shù)加一剩檀,當(dāng)對(duì)象的引用被銷(xiāo)毀時(shí)該對(duì)象的引用次數(shù)減一,當(dāng)對(duì)象的引用次數(shù)減到零時(shí)說(shuō)明程序中已經(jīng)沒(méi)有任何對(duì)象持有該對(duì)象的引用旺芽,則釋放內(nèi)存沪猴。
問(wèn)題:當(dāng)二者之間交叉引用,則每個(gè)對(duì)象的引用計(jì)數(shù)都不為零采章,會(huì)讓占用空間無(wú)法釋放標(biāo)記清除:
是一種基于對(duì)象可達(dá)性分析的回收算法运嗜,該算法分為兩個(gè)步驟,分別是標(biāo)記和清除悯舟。標(biāo)記階段担租,將所有活動(dòng)對(duì)象進(jìn)行標(biāo)記。清除階段將所有未進(jìn)行標(biāo)記的對(duì)象進(jìn)行回收即可抵怎。
則問(wèn)題變?yōu)榱?GC 是如何判定哪些是活動(dòng)對(duì)象奋救。GC 會(huì)從根結(jié)點(diǎn)出發(fā),與根結(jié)點(diǎn)直接相連或者間接相連的對(duì)象我們將其標(biāo)記為活動(dòng)對(duì)象(該對(duì)象可達(dá))反惕,之后進(jìn)行回收階段尝艘,將未標(biāo)記的對(duì)象(不可達(dá)對(duì)象)進(jìn)行清除。前面所說(shuō)的根結(jié)點(diǎn)可以是全局變量姿染,也可以是調(diào)用棧背亥。
問(wèn)題:必須掃描整個(gè)堆內(nèi)存,即使只有少量的非可達(dá)對(duì)象需要回收悬赏。性能浪費(fèi)嚴(yán)重分代回收:
在引用計(jì)數(shù)和標(biāo)記清楚的基礎(chǔ)上狡汉,將系統(tǒng)中存活時(shí)間不同的對(duì)象劃分到不同的內(nèi)存區(qū)域,共三代闽颇,分別是 0 代轴猎,1 代 和 2 代。新生成的對(duì)象是 0 代进萄,經(jīng)過(guò)一次垃圾回收之后捻脖,還存活的對(duì)象將會(huì)升級(jí)到 1 代锐峭,以此類(lèi)推,2 代中的對(duì)象是存活最久的對(duì)象可婶。
隨著程序的運(yùn)行沿癞,有大量的對(duì)象創(chuàng)建和銷(xiāo)毀,但是由于交叉引用的存在矛渴,創(chuàng)建的對(duì)象的數(shù)量大于等于銷(xiāo)毀的數(shù)量椎扬,當(dāng)這兩個(gè)的數(shù)量差大于某個(gè)閾值的時(shí)候,觸發(fā)垃圾回收機(jī)制具温。使用標(biāo)記清除算法將死亡對(duì)象進(jìn)行清除蚕涤,同時(shí)將存活對(duì)象移動(dòng)到 1 代,以此類(lèi)推铣猩。因?yàn)槌绦虻囊话阋?guī)律揖铜,大部分的對(duì)象生存周期都是相當(dāng)短的,只有少量對(duì)象生命周期比較長(zhǎng)达皿,甚至?xí)qv內(nèi)存天吓。分代回收算法,做到了針對(duì)不同的區(qū)域采取不同的回收頻率峦椰,節(jié)約了大量的計(jì)算從而提高 Python 的性能龄寞。
pymysql
連接數(shù)據(jù)庫(kù)
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset='utf8') # 連接數(shù)據(jù)庫(kù)
cursor = conn.cursor() # 創(chuàng)建游標(biāo)
#1.查看數(shù)據(jù)庫(kù)
cursor.execute("show databases;")
result = cursor.fetchall()
print(result) # 元組形式返回
# 2.創(chuàng)建數(shù)據(jù)庫(kù)
cursor.execute("create database jxday15;")
conn.commit() # 創(chuàng)建數(shù)據(jù)庫(kù)必須要commit
# 3.刪除數(shù)據(jù)庫(kù)
cursor.execute("drop database ixday15;")
conn.commit() # 刪除數(shù)據(jù)庫(kù)也要commit
# 4.進(jìn)入數(shù)據(jù)庫(kù)
cursor.execute('use mysql')
cursor.execute('show tables')
result = cursor.fetchall()
print(result)
cursor.close()
conn.close()
表操作
# 創(chuàng)建表
cursor.execute('use ixday14');
sql = """
create table tb:(
id int,
name varchar(16),
age int
)default charset=utf8
"""
cursor.execute(sql)
conn.commit() # 創(chuàng)建表后需要commit
# 刪除表
cursor.execute('use jxday14')
cursor.execute('drop table tb3')
conn.commit()
刪除表
drop table NAME;