Python知識點總結(二)
Python知識點總結(二)
本文主要總結以下python知識點
- FileIO檔案操作
- python操作MySQL
- OOP面向物件
- python套接字程式設計
- python執行緒
- python函式
FileIO檔案操作
檔案操作無非是開啟檔案,插入或讀寫,關閉檔案
下面
成功
鍵盤輸入
python操作MySQL
(之前已經寫過如何利用IDEA建立python專案及PyMySQL-master)
資料庫無非就是增刪改查,聚合函式,函式,儲存過程,許可權,事務操作等
程式碼裡面資料庫不必要每次都連線可以優化,可以自己寫一個Util工具類封裝
#-*-encoding=utf-8-*- import pymysql print("================ Drop Table====================") try: conn = pymysql.connect(host='localhost', user='root', passwd='root', db='study', port=3306, charset='utf8') cur = conn.cursor() cur.execute('drop table student') #我的資料庫裡面有一個表student cur.close() conn.close() except Exception: print("發生異常") print("================ Create Table====================") try: conn = pymysql.connect(host='localhost', user='root', passwd='root', db='study', port=3306, charset='utf8') cur = conn.cursor() cur.execute('create table student(id int primary key auto_increment, name varchar (20), age int)') conn.commit() cur.close() conn.close() except Exception: print("發生異常") print("================ Insert 插入 ====================") try: # 開啟連線 conn = pymysql.connect(host='localhost', user='root', passwd='root', db='study', port=3306, charset='utf8') # 開啟遊標 cur = conn.cursor(); # 開始插入 sql = "insert into student(name,age) values ('%s','%d')" %('tom',12); cur.execute(sql); conn.commit(); cur.close() conn.close() except Exception: print("發生異常") print("================ Insert 插入100條記錄,帶有提交和回滾機制 ====================") try: # 開啟連線 conn = pymysql.connect(host='localhost', user='root', passwd='root', db='study', port=3306, charset='utf8') # 開啟遊標 cur = conn.cursor() # 關閉自動提交 conn.autocommit(False); #執行sql i = 0 ; while i < 100 : sql = "insert into student(name,age) values('%s',%d)" % ("tom" + str(i),i % 100); #異常回滾測試 # if(i == 50): # sql = "insert" #執行sql插入 cur.execute(sql) i += 1 ; #提交 conn.commit() except Exception: print("發生異常,進行回滾操作") conn.rollback() finally: #關閉 cur.close() conn.close() print("================ Delete====================") try: # 開啟連線 conn = pymysql.connect(host='localhost', user='root', passwd='root', db='study', port=3306, charset='utf8') # 開啟遊標 cur = conn.cursor() # 關閉自動提交 conn.autocommit(False); #執行sql sql = "delete from student where id > 50"; cur.execute(sql) #提交 conn.commit() except Exception: print("發生異常,進行回滾操作") conn.rollback() finally: #關閉 cur.close() conn.close() print("================ Update ====================") try: # 開啟連線 conn = pymysql.connect(host='localhost', user='root', passwd='root', db='study', port=3306, charset='utf8') # 開啟遊標 cur = conn.cursor() # 關閉自動提交 conn.autocommit(False); #執行sql sql = "update student set age = age - 20 where age > 20"; cur.execute(sql) #提交 conn.commit() except Exception: print("發生異常,進行回滾操作") conn.rollback() finally: #關閉 cur.close() conn.close() print("================ select from ====================") try: # 開啟連線 conn = pymysql.connect(host='localhost', user='root', passwd='root', db='study', port=3306, charset='utf8') # 開啟遊標 cur = conn.cursor() # 關閉自動提交 conn.autocommit(False); #執行sql sql = "select * from student"; cur.execute(sql) res = cur.fetchall() for r in res : print(str(r[0]) + "," + r[1] + "," + str(r[2])); #提交 conn.commit() except Exception: print("發生異常,進行回滾操作") conn.rollback() finally: #關閉 cur.close() conn.close() print("================ select count(*) from ====================") try: # 開啟連線 conn = pymysql.connect(host='localhost', user='root', passwd='root', db='study', port=3306, charset='utf8') # 開啟遊標 cur = conn.cursor() # 關閉自動提交 conn.autocommit(False); #執行sql sql = "select count(*) from student where id > 10"; cur.execute(sql) # res=cur.fetchall() res = cur.fetchone() print(res[0]) #提交 conn.commit() except Exception: print("發生異常,進行回滾操作") conn.rollback() finally: #關閉 cur.close() conn.close()
邊操作過程中邊檢視資料庫
python 多執行緒
執行緒:程序內部併發執行的程式碼段。
多執行緒裡面最經典的就是火車站賣票及生產消費,涉及鎖的技術,也就是同步問題
簡單例子(特別要注意主執行緒太早結束還沒來得及列印分執行緒資訊,這裡可以讓程式sleep一下)
#-*-encoding=utf-8-*- import threading import _thread import time def helloword(arg1,arg2): print(arg1+arg2); _thread.start_new_thread(helloword,("hello","word")) #分執行緒還沒列印,主執行緒已經結束 time.sleep(4)
火車票賣票問題
# -*- encoding utf-8 -*-
import threading
tickets = 100 ;
#宣告一個鎖物件
loc = threading.Lock()
#定義一個函式檢視票餘額,並取票
def getTicket():
global loc ;
#加鎖
loc.acquire()
global tickets
tmp = 0 ;
if tickets > 0 :
tmp = tickets ;
tickets -= 1 ;
else:
tmp = 0 ;
#釋放鎖
loc.release()
return tmp ;
#售票啟用多執行緒,呼叫到getTicket函式
class Saler(threading.Thread):
def run(self):
while True:
tick = getTicket();
if tick != 0:
print(self.getName() + " : " + str(tick))
else:
return ;
s1 = Saler()
s1.setName("s1")
s2 = Saler()
s2.setName("s2")
s3 = Saler()
s3.setName("s3")
s1.start()
s2.start()
s3.start()
輸出結果
python面向物件
類(Class): 用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法。物件是類的例項。
類變數:類變數在整個例項化的物件中是公用的。類變數定義在類中且在函式體之外。類變數通常不作為例項變數使用。
資料成員:類變數或者例項變數用於處理類及其例項物件的相關的資料。
方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。
繼承:即一個派生類(derived class)繼承基類(base class)的欄位和方法。繼承也允許把一個派生類的物件作為一個基類物件對待。
物件:通過類定義的資料結構例項。物件包括兩個資料成員(類變數和例項變數)和方法。
繼承:支援多重繼承,__init__在父類中不會呼叫,需要子類顯式呼叫,調用父類方法,使用父類名做字首,還要攜帶self引數,查詢方法線本類,在父類。
程式碼練習
# -*- encoding utf-8 -*-
class didi:
num=200;
def __init__(self):
print("dididi null")
def __init__(self,name,age):
print("didiid"+name+str(age))
def add(self,a,b):
print(a+b)
return a+b
#解構函式
def __del__(self):
print("類被銷燬了")
#haha=didi()
haha1=didi("hq",23)
haha1.add(1,2)
haha2=didi("lf",18)
print(hasattr(haha1,"num"))
#python內建函式,刪除物件屬性
#delattr(haha1,"num")
#print(hasattr(haha1, "num")) 會報錯AttributeError: num
dict1 = didi.__dict__
for key in dict1.keys():
print(key + ": " + str(dict1[key]))
#刪除物件,呼叫解構函式,類似於finalize();
#haha2 = None ;
#del haha2
haha1 = None #銷燬物件
#繼承
#定義類
class Dog:
#類似於java中的靜態成員,直接通過類訪問。
name = "dahuang" ;
#私有成員
__color = "yellow" ;
#定義建構函式
def __init__(self,age):
print("new Dog()..."+str(age))
#相當於新增例項變數
self.age = age ;
#刪除例項變數
#del self.age ;
def __del__(self):
print("銷燬物件了")
def watch(self):
print("watch house!!")
def add(self,a,b):
return a + b ;
class Cat:
#靜態方法.
def HHH(s):
print("hhhh") ;
def __init__(self,name,age):
self.name2 = name ;
self.age2 = age ;
print("i am a cat,my name is %s,i am %d years old"%(name,age))
def catchMouse(self):
self.__eatFish()
print("抓了只老鼠!!!")
#定義私有方法,只能在當前物件中訪問
def __eatFish(self):
print("好吃!!")
class DogCat(Dog,Cat):
def __init__(self,name,age1,age2):
Dog.__init__(self,age2)
Cat.__init__(self,name,age1)
#自己的新方法
def run(self):
print(",,,,,,")
#重寫方法
def catchMouse(self):
print("抓了只青蛙!!")
dc=DogCat("tomas",20,23)
dc.run()
dc.catchMouse()
輸出結果
python套接字程式設計
一般分為TCP(server+客戶端),UDP(sender+receiver),程序間通訊會涉及到套接字程式設計,一般分為
面向連線的TCP:TCP(Transmission Control Protocol,傳輸控制協議)是基於連線的協議,也就是說,在正式收發資料前,必須和對方建立可靠的連線。
面向非連線UDP:(User Data Protocol,使用者資料報協議)是與TCP相對應的協議。它是面向非連線的協議,它不與對方建立連線,而是直接就把資料包傳送過去!傳送的資料包有大小限制,所以有時候要切割,制定對應的協議。
tcp服務端
# -*- encoding=utf-8 -*-
import socket
#建立socket物件SOCK_STREAM表示tcp協議。
ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#繫結地址
ss.bind(("localhost",8888))
#啟動監聽
ss.listen(0)
print("啟動監聽了!!")
buffer=1024
while True :
#接受連線
(sock,addr) = ss.accept()
print("有連線了 : " + str(addr))
while True :
data = sock.recv(buffer)
#對bytes(位元組陣列),decode解碼字串.
i = int.from_bytes(data,byteorder='little')
print("recved : " + str(i)) ;
print("收到資料了: %s" % (s))
tcp客戶端
# -*- encoding=utf-8 -*-
import socket ;
#建立socket物件
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#連線到server端
sock.connect(("localhost",8888))
# 構造位元組陣列資料b"hello world"
# sock.send(b"hello world")
index = 0 ;
while True :
b = index.to_bytes(4,byteorder='little')
#傳送資料
sock.send(b)
print("sended : " + str(index))
index += 1 ;
import time ;
time.sleep(1)
sock.close();
udp sender
# -*- encoding=utf-8 -*-
import socket
#建立socket物件SOCK_DGRAM表示udp協議。
sender = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sender.bind(("192.168.11.100",9999))
print("啟動了udp傳送者")
index = 0 ;
while True:
msg = "hello" + str(index) ;
msgBytes = msg.encode("utf-8");
sender.sendto(msgBytes,("192.168.11.255",8888))
print("傳送了 : " + msg)
index += 1 ;
import time
time.sleep(1)
udp reciver
# -*- encoding=utf-8 -*-
import socket
# 建立socket物件SOCK_DGRAM表示udp協議。
recver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
recver.bind(("192.168.11.100", 8888))
print("啟動了udp接受者")
while True:
(data, addr) = recver.recvfrom(1024)
msg = bytes.decode(data);
print("接收了 from " + str(addr[0]) + ":" + str(addr[1]) + " : " + msg)