2014年11月12日 星期三

Python3-學習雜筆

※資源收集

(Python庫的安裝工具)
https://bootstrap.pypa.io/ez_setup.py

(影像處理庫PIL)
http://pillow.readthedocs.org/en/latest/installation.html 

(更改IDLE顏色配置)
http://blog.csdn.net/u012337841/article/details/22447523  

(解決paramiko和winrandom)
http://blog.csdn.net/ivanlxf/article/details/20472035 

(pip工具)
http://quest.keitheis.org/post/6713569631/pip-install-on-windows-linux-mac 


1,重點筆記
#從外部導入測資,並將執行結果導出
import os
os.chdir('D:\\Desktop')
os.popen('test.exe < test.txt > result.txt')

#變數轉換
bin(integer)#以二進制顯示整數(oct(),hex()同理)
int('n', x) #以十進制顯示x進制的n
float('1') #字串轉浮點數

#給迭代成員增加編號
names = ['Alice', 'Bob', 'Cindy']
for i, element in enumerate(names):
print('%d %s' % (i, element))

#Python 的比較運算子可以鏈接起來
return True if a < b < c <= d else False

#檢測布林值
all([a,b,c,d]) #全真則返回真
any([a,b,c,d]) #一真則返回真

#打印
print(x, end="str")
print(string.ljust(8))
print("%d to the power of %10s is %.2f." % (var1, var2, var3))

#排序
lis.sort(key=len)
lis.sort(key=lambda d: (d[1],len(d[0])),reverse=True)

#跳出多層迴圈(如果內層遇到break,則外層執行break)
for row in range(8,-1,-1):
    for col in range(8,-1,-1):
        if sudoku[row][col] == '0':
            break
    else:
        continue
    break

'''
cxfreeze 是將 Python3 腳本打包成 EXE 執行檔的工具!
安裝 cxfreeze 後,將CMD路徑切換到 cxfreeze.exe 所在資料夾
'''
#用CMD命令轉成EXE執行檔(不支持名稱含中文)
cxfreeze app.py
cxfreeze app.pyw --base-name=Win32GUI
cxfreeze --base-name=Win32GUI --icon=icon.ico app.pyw

#避免模塊在被import時執行
if  __name__ == '__main__':
    pass

#隱藏源碼
編譯成pyc檔(Byte code)可以增加執行速度,但不能跨版本執行!
打包成EXE檔和製作pyc為相同的原理,所以不需要特地弄成pyc檔!
pyo檔是經過優化編譯後的檔案!



2,一些數據類型
import fractions
#分數類型會自動約分
x = fractions.Fraction(1000, 6) => Fraction(500, 3)
list(str(x).split('/')) => ['500','3']

#複數
a = complex(2, 3)
print(a.real, a.imag)

#集合類型
a_set.add(4)                 #添加單個新元素
a_set.update({3, 9}, {1, 3}) #添加多個新元素
a_set.discard(value)         #刪除元素
a_set.remove(value)          #刪除元素(找不到會拋錯)
a_set.union(b_set)           #返回聯集
a_set.intersection(b_set)    #返回交集
a_set.difference(b_set)      #返回差集 
a_set.issubset(b_set)        #判斷是否為b的子集合
b_set.issuperset(a_set)      #判斷是否為a的父集合

#返回只出現在其中一個集合的元素
a_set.symmetric_difference(b_set)

#字典類型
dic.items()      #列出所有key/value
dic.keys()       #列出所有key
dic.values()     #列出所有value
dic.get('key')   #找到key則回傳value
del dic['Peter'] #以key刪除一對鍵值
sorted(dic)      #以key排序
sorted(dict.items(), key=lambda d: d[1]) #按照value排序
dic = string.maketrans('abc','xyz')      #製作簡單字典
print(string.translate(dic))             #使用字典翻譯字串

#串列類型
list.index("duck")         #查找元素
list.insert(index,"cobra") #插入元素
list.count('\n')           #計算某成員出現次數
list.append(var)           #尾端增加一個新元素
list.extend([1,2,3...])    #尾端增加多個新元素
list.sort()                #排序(會更改原始內容)
list.clear()               #清空list
del list[i]                #刪除單個元素
del list[i:j]              #刪除片段元素
del list[i:j:k]            #可指定間隔來抓取元素
newList = list[:]          #複製LIST

#使用 list-comprehension 製作質數表
[x for x in range(2, N) if 0 not in [
    x % d for d in range(2,int(sqrt(x))+1)] ]

#BYTES類型
一串由0到255之间的数字组成的序列叫做bytes对象。
字串前面加上b,表明是bytes類型
>>>by = b'abcd\x65'
>>>by[0] => 97
b = bytearray(by)           #轉成陣列
mystr = by.decode('ascii')  #將BYTES變數用ascii解碼成字串
b = "python".encode('utf‐8')#字串透過utf‐8編碼形成bytes

#字串類型
str.lower()           #(小寫化,像C的_strlwr)
str.upper()           #(大寫化,像C的_strupr)
str.replace("app","") #字串取代
str.startswith("pre") #是否以 pre 開頭
str.endswith("pre")   #是否以 pre 結尾
str.find('str2')      #返回子字串出現的第一個位置
chr(number)           #返回askii對照的字元
ord('c')              #返回askii對照的號碼
'abc'.title() => 'Abc'#字母開頭轉大寫

#將跳脫字元用原始字元解釋
s = r"hello world\n" 

#轉成BYTE,可解決windowShell無法辨認unicode的問題
s = b"hello world\n" 


3,正規表達式 (所有的正则表达式功能都包含在re模块中)
import re

#以|隔開,切割時應該用\跳脫EX:('\<|\>', str1)
re.split('<|>', str1) 

#取代句子中所有單獨存在的單詞ROAD
re.sub(r'\bROAD\b', 'RD.', str) 

#判斷email
re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", email)

#取代句子中所有單獨存在的單詞ROAD
re.sub(r'\bROAD\b', 'RD.', str)

#匹配方法
\d #表示數字
\D #表示非數字
\d{3} #尋找連續三個的數字
\D* #中間為任意非數字字符
(a|b|c) #匹配单独的任意一个a或者b或者c。
X? #X出現一次或完全沒有
X* #X出現零次或多次
X+ #X出現一次或多次
X{n} #X出現n次
X{n,} #X出現至少n次
X{n,m} #X出現至少n次,但不超過m次
\s #等於 [ \t\n\x0B\f\r] 空白字元
\w #等於 [a-zA-Z_0-9] 數字或是英文字
\W #等於 [^a-zA-Z_0-9] 非數字與英文字


4, 迭代工具
import itertools

#找出所有序对
a = list(itertools.product('ABC', '123'))
[('A', '1'), ('A', '2'), ('A', '3'),
('B', '1'), ('B', '2'), ('B', '3'),
('C', '1'), ('C', '2'), ('C', '3')]

#只列出升序序對
a = list(itertools.combinations('ABC', 2))
[('A', 'B'), ('A', 'C'), ('B', 'C')]

#列出所有序對
a =list(itertools.permutations('ABC', 2))
[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), 
 ('C', 'A'), ('C', 'B')]


5,函式(預設返回None)
#未知參數仍可操作
#使用yield可return函數的值而且不結束函式!
def actors(*argv):
    for arg in argv:
        print(arg)

#計算第n個fib
fib = lambda n:1 if n<=2 else fib(n-1)+fib(n-2)
print(fib(10))

#計算第n個階乘
mul = lambda n:n*mul(n-1) if n > 1 else 1
print(mul(10))


6,常用庫
#亂數
import random
random.randint(x,y) #x,y之間任意取一數(含x,y)
random.shuffle(array) #打亂順序

#時間
import time
tStart = time.time()#取得當前秒時間
time.sleep(1) #延遲一秒
time.localtime() #取得當前完整時間
time.localtime().tm_wday #取得星期幾

#文件查看或修改時間
mtime = time.ctime(
    os.path.getmtime('learning.txt'))

#文件建立時間
ctime = time.ctime(
    os.path.getctime('learning.txt'))

#檔案的複製、移動、刪除
shutil.copy(src, dst)
shutil.move(src, dst)
shutil.rmtree('dir')

#網路程式範例(取得對外網的IP)
import urllib.request, re

#get html of the webpage
htmlText = urllib.request.urlopen(
    'http://myip.yybit.com/' ) 

for line in htmlText:
    ip = re.findall(
        '\d{3}.\d{2,}.\d{1,}.\d{1,}',str(line))
        if  ip:
            print(ip[0])
            break

#当试图导入(import)模块的时候,Python 会寻找几个地方
import sys
sys.path #列出所有搜尋路徑
sys.path.insert(index, new_path) #插入新的搜索路徑
sys.argv[0] #取得檔案完整路徑

#取得一些系統資料
import platform
print(platform.uname())

#一些檔案文件的常用操作 from os import *
remove(path)              #刪除檔案
rename("a.txt a.txt")     #改名
listdir('D:\Desktop\')    #取得目錄下第一層的文件和目錄名
list(walk('D:\Desktop\')) #取得目錄下所有層的文件和目錄名
getcwd()                  #取得當前目錄路徑
path.abspath(os.pardir)   #取得上一層目錄
path.isdir('F:')          #判斷該目錄是否存在
path.isfile('D:\\a.txt')  #判斷該檔案是否存在
mkdir( path )             #創建目錄
chdir( path )             #切換目錄
rmdir( path )             #刪除目錄
path.getsize('path')      #取得檔案大小
path.split('D:\\ff.py')   #切割出檔案所在目錄和檔名
path.splitext('string')   #切割路徑,倒數第一個元素可取得副檔名
startfile('path')         #在前台打開檔案
getpid()                  #取得本執行程式的PID


7,檔案讀寫
a = f_name.name #取得檔名
f.seek(0)       #回到檔案開頭
f.truncate()    #清空檔案內容,用之前要先f.seek(0)

#讀取檔案報錯
UnicodeDecodeError: 'cp950' codec can't decode byte 0xbb in position 15...
#加入encoding="utf-8"這項參數或許可解決 
with open("C:\\a.txt","r",encoding="utf-8")...

#讀取 cp950 編碼的檔案
file = open(sys.argv[1], 'rb')
print(file.read().decode('cp950', 'ignore'))


8,多線程
#此方法需搭配sleep函數等待子進程返回
import _thread, time

def hello(index):
    while True:
        time.sleep(1)
        print("hello from %d\n"%index)

if __name__=='__main__':
    #只有一個參數時要加逗號
    _thread.start_new_thread(hello,(1,))
    _thread.start_new_thread(hello,(2,))


9,音效
import winsound #只支援wav(但速度很快)

#播放
winsound.PlaySound('key.wav',
    'winsound.SND_FILENAME)

#重複播放
winsound.PlaySound('key.wav',
    winsound.SND_ASYNC|winsound.SND_LOOP) 

#使用新線程播放
winsound.PlaySound('key.wav',
    winsound.SND_FILENAME|winsound.SND_ASYNC) 

#pygame是第三方庫,需要另外下載
#如果是mp3檔,要轉成ogg檔,路徑不能含中文
import pygame 
pygame.mixer.init()
pygame.mixer.music.load('mouseover.wav')
pygame.mixer.music.play()   #play
pygame.mixer.music.play(-1) #replay


10,windows編程
#在reg指令後面加上'/reg:64'的參數,可解決64位元下註冊表重定向
#VBS腳本能使多個運行程序不會閃出黑窗
Set ws = CreateObject("Wscript.shell")
ws.run "test1.bat",0
ws.run "test2.bat",0
ws.run "test3.exe",0

#64位元下,要用以下方法才能進入 c:\windows\system32
os.popen('c:/windows/Sysnative/msconfig.exe') 

#後台調用指令並取得結果
os.popen('dir').read()


                                             上一頁

沒有留言:

張貼留言