1. 程式人生 > >Python知識點總結(二)

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)