深淺拷貝html
有時候,尤爲是當你在處理可變對象時,你可能想要複製一個對象,而後對其作出一些改變而不但願影響原來的對象。這就是Python的copy所發揮做用的地方。python
定義了當對你的類的實例調用copy.copy()時所產生的行爲。copy.copy()返回了你的對象的一個淺拷貝——這意味着,當實例自己是一個新實例時,它的全部數據都被引用了——例如,當一個對象自己被複制了,它的數據仍然是被引用的(所以,對於淺拷貝中數據的更改仍然可能致使數據在原始對象的中的改變)。
定義了當對你的類的實例調用copy.deepcopy()時所產生的行爲。copy.deepcopy()返回了你的對象的一個深拷貝——對象和其數據都被拷貝了。memodict是對以前被拷貝的對象的一個緩存——這優化了拷貝過程而且阻止了對遞歸數據結構拷貝時的無限遞歸。當你想要進行對一個單獨的屬性進行深拷貝時,調用copy.deepcopy(),並以memodict爲第一個參數。
思路一:利用切片操做和工廠方法list方法拷貝就叫淺拷貝,只是拷貝了最外圍的對象自己,內部的元素都只是拷貝了一個引用而已。mysql
思路二:利用copy中的deepcopy方法進行拷貝就叫作深拷貝,外圍和內部元素都進行了拷貝對象自己,而不是引用。linux
可是對於數字,字符串和其餘原子類型對象等,沒有被拷貝的說法,即使是用深拷貝,查看id的話也是同樣的,若是對其從新賦值,也只是新建立一個對象,替換掉舊的而已。正則表達式
pwd = getpass.getpass("請輸入密碼:") #輸入密碼不可見算法
yh = getpass.getuser() #顯示當前登陸系統用戶名;sql
getpass.getpass([prompt[, stream]]) 提示用戶輸入一段密碼,參數 prompt 用於提示用戶開始輸入,默認爲'Password: '。在 Unix 上,該提示符被寫入到類文件對象流中。 參數 stream 默認爲控制終端 (/dev/tty) 或入過前者不可用時爲 sys.stderr (該參數在 Windows 上無效)。 若是無回顯輸入不可用,getpass() 回退並向流 stream 中輸出一個警告消息, 從 sys.stdin 中讀取並拋出異常 GetPassWarning。 適用於: Macintosh, Unix, Windows. *注:若是你在 IDLE 中調用getpass(),輸入可能會在你啓動 IDLE 的終端中而不是在 IDLE 窗口中完成 1 >>> import getpass 2 >>> p=getpass.getpass('input your password') 3 input your password 4 >>> print(p) 5 aaa exception getpass.GetPassWarning Python內置異常 UserWarning 的子類,當密碼輸入可能被回顯時拋出。 getpass.getuser() 返回用戶的登陸名,適用於:Unix, Windows 該函數依次檢測環境變量 LOGNAME、USER、LNAME 和 USERNAME,返回其中第一個非空的值。 若是這些變量都沒有被設置,支持 pwd 模塊的系統會返回密碼數據庫中的登陸名,不然拋出異常。 注,此模塊在pycharm中沒法使用。
* os,os模塊對通用的操做系統服務提供了可移植的(portable)的接口。os能夠認爲是nt和posix的抽象。nt提供windows的服務接口,posix提供UNIX(Linux,mac)的服務接口。shell
* os.path,os.path模塊以可移植的方式來處理路徑相關的操做。數據庫
os.getcwd() 獲取當前工做目錄,即當前python腳本工做的目錄路徑 os.chdir("dirname") 改變當前腳本工做目錄;至關於shell下cd os.curdir 返回當前目錄: ('.') os.pardir 獲取當前目錄的父目錄字符串名:('..') os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄 os.removedirs('dirname1') 若目錄爲空,則刪除,並遞歸到上一級目錄,如若也爲空,則刪除,依此類推 os.mkdir('dirname') 生成單級目錄;至關於shell中mkdir dirname os.rmdir('dirname') 刪除單級空目錄,若目錄不爲空則沒法刪除,報錯;至關於shell中rmdir dirname os.listdir('dirname') 列出指定目錄下的全部文件和子目錄,包括隱藏文件,並以列表方式打印 os.remove() 刪除一個文件 os.rename("oldname","newname") 重命名文件/目錄 os.stat('path/filename') 獲取文件/目錄信息 os.sep 輸出操做系統特定的路徑分隔符,win下爲"\\",Linux下爲"/" os.linesep 輸出當前平臺使用的行終止符,win下爲"\t\n",Linux下爲"\n" os.pathsep 輸出用於分割文件路徑的字符串 os.name 輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix' os.system("bash command") 運行shell命令,直接顯示 os.environ 獲取系統環境變量 os.path.abspath(path) 返回path規範化的絕對路徑 os.path.split(path) 將path分割成目錄和文件名二元組返回 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 os.path.basename(path) 返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素 os.path.exists(path) 若是path存在,返回True;若是path不存在,返回False os.path.isabs(path) 若是path是絕對路徑,返回True os.path.isfile(path) 若是path是一個存在的文件,返回True。不然返回False os.path.isdir(path) 若是path是一個存在的目錄,則返回True。不然返回False os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑以前的參數將被忽略 os.path.getatime(path) 返回path所指向的文件或者目錄的最後存取時間 os.path.getmtime(path) 返回path所指向的文件或者目錄的最後修改時間
sys.argv 命令行參數List,第一個元素是程序自己路徑 sys.exit(n) 退出程序,正常退出時exit(0) sys.version 獲取Python解釋程序的版本信息 sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值 sys.platform 返回操做系統平臺名稱 sys.stdout.write('please:') val = sys.stdin.readline()[:-1]
import subprocess subprocess.call("ping", shell=True) #執行命令,返回狀態碼 subprocess.check_call("ipconfig", shell=True)#執行命令,若是執行狀態碼是 0 ,則返回0,不然拋異常 subprocess.check_output("ipconfig", shell=True)#執行命令,若是狀態碼是 0 ,則返回執行結果,不然拋異常 subprocess.Popen("mkdir t2", shell=True)
shutil.make_archive(base_name, format,...)編程
建立壓縮包並返回文件路徑,例如:zip、tar
base_name: 壓縮包的文件名,也能夠是壓縮包的路徑。只是文件名時,則保存至當前目錄,不然保存至指定路徑,
如:www =>保存至當前路徑
如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/
format: 壓縮包種類,「zip」, 「tar」, 「bztar」,「gztar」
root_dir: 要壓縮的文件夾路徑(默認當前目錄)
owner: 用戶,默認當前用戶
group: 組,默認當前組
logger: 用於記錄日誌,一般是logging.Logger對象
#將 /Users/wupeiqi/Downloads/test 下的文件打包放置當前程序目錄 import shutil ret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test') #將 /mnt下的文件打包放置 /tmp目錄 import shutil ret = shutil.make_archive("/tmp/www", 'gztar', root_dir='/mnt') #2.6用不了,2.7或許能夠 相似於高級API,並且主要強大之處在於其對文件的複製與刪除操做更是比較支持好。 相關API介紹 copyfile(src, dst) 從源src複製到dst中去。固然前提是目標地址是具有可寫權限。拋出的異常信息爲 IOException. 若是當前的dst已存在的話就會被覆蓋掉。 copyfile( src, dst) 從源src複製到dst中去。固然前提是目標地址是具有可寫權限。拋出的異常信息爲IOException. 若是當前的dst已存在的話就會被覆蓋掉 copymode( src, dst) 只是會複製其權限其餘的東西是不會被複制的 copystat( src, dst) 複製權限、最後訪問時間、最後修改時間 copy( src, dst) 複製一個文件到一個文件或一個目錄 copy2( src, dst) 在copy上的基礎上再複製文件最後訪問時間與修改時間也複製過來了,相似於cp –p的東西 copy2( src, dst) 若是兩個位置的文件系統是同樣的話至關因而rename操做,只是更名;若是是不在相同的文件系統的話就是作move操做 copytree(olddir,newdir,True/Flase) 把olddir拷貝一份newdir,若是第3個參數是True,則複製目錄時將保持文件夾下的符號鏈接,若是第3個參數是False,則將在複製的目錄下生成物理副原本替代符號鏈接 shutil.rmtree("te") 刪除一個目錄 import shutil shutil.copyfile('f:/temp.txt', 'f:/os.txt') #複製文件 shutil.copytree('f:/temp', 'f:/os') #複製目錄 # ######## zip的用法 ######## shutil 對壓縮包的處理是調用 ZipFile 和 TarFile 兩個模塊來進行的,詳細: import zipfile # 壓縮 z = zipfile.ZipFile('laxi.zip', 'w') z.write('a.log') #壓縮包寫入a.log z.write('data.data') #寫入data文件 z.close() # 解壓 z = zipfile.ZipFile('laxi.zip', 'r') z.extractall() z.close()
import hashlib m = hashlib.md5() m.update(b"Nobody inspects the spammish repetition") #參數必須是byte類型,不然報Unicode-objects must be encoded before hashing錯誤 md5value=m.hexdigest() print(md5value) #bb649c83dd1ea5c9d9dec9a18df0ffe9 ############################################## import hashlib data = '我是' m = hashlib.md5(data.encode(encoding='gb2312')) print(m.hexdigest()) ############################################## import hmac h = hmac.new(b'ccccccc') #自定義key h.update(b'hellowo') #對內容加密 print( h.hexdigest())
不少程序都有記錄日誌的需求,而且日誌中包含的信息即有正常的程序訪問日誌,還可能有錯誤、警告等信息輸出,python的logging模塊提供了標準的日誌接口,你能夠經過它存儲各類格式的日誌,logging的日誌能夠分爲 debug()
, info()
, warning()
, error()
and critical() 5個級別,
下面咱們看一下怎麼用。
import logging logging.warning("user [admin] attempted wrong password more than 3 times") logging.critical("server is down") #輸出 WARNING:root:user [admin] attempted wrong password more than 3 times CRITICAL:root:server is down
看一下這幾個日誌級別分別表明什麼意思
Level | When it’s used |
---|---|
DEBUG |
Detailed information, typically of interest only when diagnosing problems. |
INFO |
Confirmation that things are working as expected. |
WARNING |
An indication that something unexpected happened, or indicative of some problem in the near future (e.g. ‘disk space low’). The software is still working as expected. |
ERROR |
Due to a more serious problem, the software has not been able to perform some function. |
CRITICAL |
A serious error, indicating that the program itself may be unable to continue running. |
把日誌寫到文件裏
import logging logging.basicConfig(filename='example.log', level=logging.INFO,format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') #level=loggin.INFO意思是,把日誌紀錄級別設置爲INFO,也就是說,只有比日誌是INFO或比INFO級別更高的日誌纔會被紀錄到文件裏, logging.debug('This message should go to the log file') #在這個例子, 第一條日誌是不會被紀錄的,若是但願紀錄debug的日誌,那把日誌級別改爲DEBUG就好了。 logging.info('So should this') logging.warning('And this, too')
日誌格式
%(name)s |
Logger的名字 |
%(levelno)s |
數字形式的日誌級別 |
%(levelname)s |
文本形式的日誌級別 |
%(pathname)s |
調用日誌輸出函數的模塊的完整路徑名,可能沒有 |
%(filename)s |
調用日誌輸出函數的模塊的文件名 |
%(module)s |
調用日誌輸出函數的模塊名 |
%(funcName)s |
調用日誌輸出函數的函數名 |
%(lineno)d |
調用日誌輸出函數的語句所在的代碼行 |
%(created)f |
當前時間,用UNIX標準的表示時間的浮 點數表示 |
%(relativeCreated)d |
輸出日誌信息時的,自Logger建立以 來的毫秒數 |
%(asctime)s |
字符串形式的當前時間。默認格式是 「2003-07-08 16:49:45,896」。逗號後面的是毫秒 |
%(thread)d |
線程ID。可能沒有 |
%(threadName)s |
線程名。可能沒有 |
%(process)d |
進程ID。可能沒有 |
%(message)s |
用戶輸出的消息 |
logger提供了應用程序能夠直接使用的接口;
handler將(logger建立的)日誌記錄發送到合適的目的輸出;
filter提供了細度設備來決定輸出哪條日誌記錄;
formatter決定日誌記錄的最終輸出格式。
logger 每一個程序在輸出信息以前都要得到一個Logger。Logger一般對應了程序的模塊名,好比聊天工具的圖形界面模塊能夠這樣得到它的Logger: LOG=logging.getLogger(」chat.gui」) 而核心模塊能夠這樣: LOG=logging.getLogger(」chat.kernel」) Logger.setLevel(lel):指定最低的日誌級別,低於lel的級別將被忽略。debug是最低的內置級別,critical爲最高 Logger.addFilter(filt)、Logger.removeFilter(filt):添加或刪除指定的filter Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增長或刪除指定的handler Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():能夠設置的日誌級別 handler handler對象負責發送相關的信息到指定目的地。Python的日誌系統有多種Handler可使用。有些Handler能夠把信息輸出到控制檯,有些Logger能夠把信息輸出到文件,還有些 Handler能夠把信息發送到網絡上。若是以爲不夠用,還能夠編寫本身的Handler。能夠經過addHandler()方法添加多個多handler Handler.setLevel(lel):指定被處理的信息級別,低於lel級別的信息將被忽略 Handler.setFormatter():給這個handler選擇一個格式 Handler.addFilter(filt)、Handler.removeFilter(filt):新增或刪除一個filter對象 每一個Logger能夠附加多個Handler。接下來咱們就來介紹一些經常使用的Handler: 1) logging.StreamHandler 使用這個Handler能夠向相似與sys.stdout或者sys.stderr的任何文件對象(file object)輸出信息。它的構造函數是: StreamHandler([strm]) 其中strm參數是一個文件對象。默認是sys.stderr 2) logging.FileHandler 和StreamHandler相似,用於向一個文件輸出日誌信息。不過FileHandler會幫你打開這個文件。它的構造函數是: FileHandler(filename[,mode]) filename是文件名,必須指定一個文件名。 mode是文件的打開方式。參見Python內置函數open()的用法。默認是’a',即添加到文件末尾。 3) logging.handlers.RotatingFileHandler 這個Handler相似於上面的FileHandler,可是它能夠管理文件大小。當文件達到必定大小以後,它會自動將當前日誌文件更名,而後建立 一個新的同名日誌文件繼續輸出。好比日誌文件是chat.log。當chat.log達到指定的大小以後,RotatingFileHandler自動把 文件更名爲chat.log.1。不過,若是chat.log.1已經存在,會先把chat.log.1重命名爲chat.log.2。。。最後從新建立 chat.log,繼續輸出日誌信息。它的構造函數是: RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]]) 其中filename和mode兩個參數和FileHandler同樣。 maxBytes用於指定日誌文件的最大文件大小。若是maxBytes爲0,意味着日誌文件能夠無限大,這時上面描述的重命名過程就不會發生。 backupCount用於指定保留的備份文件的個數。好比,若是指定爲2,當上面描述的重命名過程發生時,原有的chat.log.2並不會被改名,而是被刪除。 4) logging.handlers.TimedRotatingFileHandler 這個Handler和RotatingFileHandler相似,不過,它沒有經過判斷文件大小來決定什麼時候從新建立日誌文件,而是間隔必定時間就 自動建立新的日誌文件。重命名的過程與RotatingFileHandler相似,不過新的文件不是附加數字,而是當前時間。它的構造函數是: TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]]) 其中filename參數和backupCount參數和RotatingFileHandler具備相同的意義。 interval是時間間隔。 when參數是一個字符串。表示時間間隔的單位,不區分大小寫。它有如下取值: S 秒 M 分 H 小時 D 天 W 每星期(interval==0時表明星期一) midnight 天天凌晨
import logging #create logger logger = logging.getLogger('TEST-LOG') logger.setLevel(logging.DEBUG) # create console handler and set level to debug ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) # create file handler and set level to warning fh = logging.FileHandler("access.log") fh.setLevel(logging.WARNING) # create formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # add formatter to ch and fh ch.setFormatter(formatter) fh.setFormatter(formatter) # add ch and fh to logger logger.addHandler(ch) logger.addHandler(fh) # 'application' code logger.debug('debug message') logger.info('info message') logger.warn('warn message') logger.error('error message') logger.critical('critical message')
import logging from logging import handlers logger = logging.getLogger(__name__) log_file = "timelog.log" #fh = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=3) fh = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3) formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s') fh.setFormatter(formatter) logger.addHandler(fh) logger.warning("test1") logger.warning("test12") logger.warning("test13") logger.warning("test14")
三種表示主式:
一、時間戳 1970年1月1往後的秒
二、元組包含了:年、日、星期等...time.struct_time
三、格式化的字符串 2014-11-11 11:11 print time.time()
* time,time模塊提供了各類時間相關的函數。經常使用的time.sleep().
import time # 時間戳形式存在 print (time.time()) print(time.mktime(time.localtime())) #print (time.localtime()) # 元組形式存在 print (time.gmtime()) #可加時間戳參數 print (time.localtime()) #可加時間戳參數 print (time.strptime('2014-11-11','%Y-%m-%d')) #字符串形式轉換成元組形式 # 字符串形式存在 print (time.strftime('%Y-%m-%d')) #默認當前時間,必須記住,工做中用得最多 print (time.strftime('%Y-%m-%d',time.localtime())) #默認當前時間 print (time.asctime()) print (time.asctime(time.localtime())) print (time.ctime(time.time())) # 時間的三種表示方式演示 import time print (time.time()) #秒,時間戳的方式,1488459426.7593124 print (time.gmtime())#元組方式,time.struct_time(tm_year=2017, tm_mon=3, tm_mday=2, tm_hour=12, tm_min=57, tm_sec=6, tm_wday=3, tm_yday=61, tm_isdst=0) print (time.strftime('%Y-%m-%d %H:%M:%S'))#字符串方式,2017-03-02 20:57:06
datetime類定義的類屬性與方法:
from datetime import * import time print('datetime.max:', datetime.max) print('datetime.min:', datetime.min) print('datetime.resolution:', datetime.resolution) print('today():', datetime.today()) print('now():', datetime.now()) print('utcnow():', datetime.utcnow()) print('fromtimestamp(tmstmp):', datetime.fromtimestamp(time.time())) print('utcfromtimestamp(tmstmp):', datetime.utcfromtimestamp(time.time()) ) 輸出結果: datetime.max: 9999-12-31 23:59:59.999999 datetime.min: 0001-01-01 00:00:00 datetime.resolution: 0:00:00.000001 today(): 2017-03-02 21:22:09.304740 now(): 2017-03-02 21:22:09.304739 utcnow(): 2017-03-02 13:22:09.304739 fromtimestamp(tmstmp): 2017-03-02 21:22:09.304740 utcfromtimestamp(tmstmp): 2017-03-02 13:22:09.304740
json:
dumps: 將對象序列化
dump: 將對象序列化並保存到文件
loads: 將序列化字符串反序列化
load: 將序列化字符串從文件讀取並反序列化
pickle:基本上和json同樣,pickle: pickle模塊被用來序列化python的對象到bytes流,從而適合存儲到文件,網絡傳輸,或數據庫存儲。
(pickle的過程也被稱serializing,marshalling或者flattening,pickle同時能夠用來將bytes流反序列化爲python的對象)。
那pickle和json有什麼區別呢?
在上面兩段代碼中,pickle寫入和讀取文件時,用的是 ‘b’模式,而json沒有。
json是能夠在不一樣語言之間交換數據的,而pickle只在python之間使用。
json只能序列化最基本的數據類型,而pickle能夠序列化全部的數據類型,包括類,函數均可以序列化。
import json data = {'k1':123, 'k2':123} j_dumps = json.dumps(data) print(j_dumps,type(j_dumps)) j_loads = json.loads(j_dumps) print(j_loads,type(j_loads)) #打開文件,而後將data寫入 with open('data.txt', 'w') as f: json.dump(data, f) #一樣讀取的時候也須要打開文件 with open('data.txt', 'r') as f: data_1 = json.load(f) print(type(data_1) ) ####################################### import pickle data = {'k1':123, 'k2':123} p_dumps = pickle.dumps(data) print(p_dumps,type(p_dumps)) p_loads = pickle.loads(p_dumps) print(p_loads,type(p_loads)) #打開文件,而後將data寫入 with open('data.txt', 'wb') as f: pickle.dump(data, f) #一樣讀取的時候也須要打開文件 with open('data.txt', 'rb') as f: data_1 = pickle.load(f) print(type(data_1) )
'.' 默認匹配除\n以外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行 '^' 匹配字符開頭,若指定flags MULTILINE,這種也能夠匹配上(r"^a","\nabc\neee",flags=re.MULTILINE) '$' 匹配字符結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也能夠 '*' 匹配*號前的字符0次或屢次,re.findall("ab*","cabb3abcbbac") 結果爲['abb', 'ab', 'a'] '+' 匹配前一個字符1次或屢次,re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb'] '?' 匹配前一個字符1次或0次 '{m}' 匹配前一個字符m次 '{n,m}' 匹配前一個字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果'abb', 'ab', 'abb'] '|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC' '(...)' 分組匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c '\A' 只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的 '\Z' 匹配字符結尾,同$ '\d' 匹配數字0-9 '\D' 匹配非數字 '\w' 匹配[A-Za-z0-9] '\W' 匹配非[A-Za-z0-9] 's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t' '(?P<name>...)' 分組匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 結果{'province': '3714', 'city': '81', 'birthday': '1993'}
最經常使用的匹配語法
re.match 從頭開始匹配
re.search 匹配包含
re.findall 把全部匹配到的字符放到以列表中的元素返回
re.splitall 以匹配到的字符當作列表分隔符
re.sub 匹配字符並替換
反斜槓的困擾
與大多數編程語言相同,正則表達式裏使用"\"做爲轉義字符,這就可能形成反斜槓困擾。假如你須要匹配文本中的字符"\",那麼使用編程語言表示的正則表達式裏將須要4個反斜槓"\\\\":前兩個和後兩個分別用於在編程語言裏轉義成反斜槓,轉換成兩個反斜槓後再在正則表達式裏轉義成一個反斜槓。Python裏的原生字符串很好地解決了這個問題,這個例子中的正則表達式可使用r"\\"表示。一樣,匹配一個數字的"\\d"能夠寫成r"\d"。有了原生字符串,你不再用擔憂是否是漏寫了反斜槓,寫出來的表達式也更直觀。
僅需輕輕知道的幾個匹配模式 re.I(re.IGNORECASE): 忽略大小寫(括號內是完整寫法,下同) M(MULTILINE): 多行模式,改變'^'和'$'的行爲(參見上圖) S(DOTALL): 點任意匹配模式,改變'.'的行爲
enumerate:遍歷,返回序號和值
seq = ['one', 'two', 'three'] for i, element in enumerate(seq): print(i,seq[i]) print(i,element)
filter和map函數:
def f1(a): if a>22: return True def f2(a): if a>22: return a+100 li = [11,22,33,44,55,66,77] ret = filter(f1,li) #fliter(函數,可迭代的對象) print(list(ret)) print(ret) result = map(f2,li) #fliter(函數,可迭代的對象) print(list(result)) print(result) 輸出結果: [33, 44, 55, 66, 77] <filter object at 0x000001BE9C03B198> [None, None, 133, 144, 155, 166, 177] <map object at 0x000001BE9C03B278>
#fliter() 將li中的每一個值執行函數,將函數返回值爲TRUE的添加到列表中 #map() 將li中的每一個值執行函數,將函數返回值爲TRUE的添加到列表中,返回值爲FLASE的用NONE代替
關於計算的:
# abs() #求絕對值 abs(11) # pow() #求X方,即冪的次數 pow(3,6) # round() #返回浮點數x的四捨五入值,能夠指定返回的小數點位數 round(1.5) # divmod() #求商和餘數(地板除) divmod(5,3)
類型轉換:
# int() print(int(123.1)) # complex() print(complex(12)) # float() print(float(55.22)) # bool() print(bool(0)) 輸出結果: 123 (12+0j) 55.22 False
進制轉換:
bin()#將十進制的數轉換成二進制的數 oct()#將十進制的數轉換成八進制的數 hex()#將十進制的數轉換成十六進制的數 例子: print(hex(10)) print(oct(10)) print(bin(255)) 輸出結果: 0xa 0o12 0b11111111
ASCII轉換:
ord()#將ascii碼轉成整數 chr()#將整數轉成ascii碼 print(ord('A')) print(chr(65)) 輸出結果: 65 A
數學函數:
import math math.sin() math.tan() math.cos()
隨機數函數:
import random random.uniform(1,10)#返回1-10間的一個浮點數 random.choice([1,2,3,4,5,6,7,8,9])#返回其中一個數 random.randint(50,60)# #返回一個整數 random.randrange(10,100,2)#從指定範圍內,按指定基數遞增的集合中 獲取一個隨機數。
判斷函數:
******
格式函數:
#只有字符串纔有這個屬性,int沒有 s_num = 'aba' a = s_num.center(10,'*')#AttributeError: 'int' object has no attribute 'center' b = s_num.ljust(10,'*')#AttributeError: 'int' object has no attribute 'ljust' print(a,b) format() #這個方法會把字符串看成一個模版,經過傳入的參數進行格式化。這個用來格式化的模版使用大括號({,})做爲特殊字符
搜素函數:
num = '123as113f1a6f5a32f1sa5f1as3f51as23s1a5613b1351u35131f3a' # count() print(num.count('a')) # find() print(num.find('3')) # index() print(num.index('u')) # rfind() print(num.rfind('a')) 輸出結果: 8 2 46 54
替換函數:
基本用法:對象.replace(rgExp,replaceText,max) 其中,rgExp和replaceText是必需要有的,max是可選的參數,能夠不加。 rgExp是指正則表達式模式或可用標誌的正則表達式對象,也能夠是 String 對象或文字;replaceText是一個String 對象或字符串文字;max是一個數字。
對於一個對象,在對象的每一個rgExp都替換成replaceText,從左到右最多max次。 num = '123as113f1a6f5a32f1sa5f1as3f51as23s1a5613b1351u35131f3a' new_num = num.replace('1','*',3) print(num) print(new_num) 輸出結果: 123as113f1a6f5a32f1sa5f1as3f51as23s1a5613b1351u35131f3a *23as**3f1a6f5a32f1sa5f1as3f51as23s1a5613b1351u35131f3a ====================================================================================== str.expandtabs(tabsize=8) 參數:tabsize — 指定轉換字符串中的 tab 符號(‘\t’)轉爲空格的字符數。 返回值:該方法返回字符串中的 tab 符號(‘\t’)轉爲空格後生成的新字符串。 實例 如下實例展現了expandtabs()方法的實例: #!/usr/bin/python3 str = "this is\tstring example....wow!!!" print ("原始字符串: " + str) print ("替換 \\t 符號: " + str.expandtabs()) print ("使用16個空格替換 \\t 符號: " + str.expandtabs(16)) 輸出結果: 原始字符串: this is string example....wow!!! 替換 \t 符號: this is string example....wow!!! 使用16個空格替換 \t 符號: this is string example....wow!!!
拆分函數:
str = 'abc.' \ '123.def.456.ghi.789.jkl' # partition('.') #根據指定的分隔符將字符串進行分割。若是字符串包含指定的分隔符, #則返回一個3元的元組,第一個爲分隔符左邊的子串,第二個爲分隔符自己,第三個爲分隔符右邊的子串 print(str.partition('.'))#輸出結果:('abc', '.', '123.def.456.ghi.789.jkl') # split('.')#經過指定分隔符對字符串進行切片,若是參數num 有指定值,則僅分隔 num 個子字符串 print(str.split('.'))#輸出結果:['abc', '123', 'def', '456', 'ghi', '789', 'jkl'] # splitlines()#照行('\r', '\r\n', \n')分隔,返回一個包含各行做爲元素的列表,若是參數 keepends 爲 False,不包含換行符,若是爲 True,則保留換行符。 print(str.splitlines())#輸出結果:['abc.123.def.456.ghi.789.jkl'] # # 剝離函數 # strip()#用於移除字符串頭尾指定的字符(默認爲空格) # lstrip()#用於截掉字符串左邊的空格或指定字符 # rstrip()##用於截掉字符串右邊的空格或指定字符 # str = '* abc.123.456.dff ' \ 'safafsfa156165.saa,14 *' print(str) print(str.strip('*')) print(str.lstrip('*')) print(str.rstrip('*')) 輸出結果: * abc.123.456.dff safafsfa156165.saa,14 * abc.123.456.dff safafsfa156165.saa,14 abc.123.456.dff safafsfa156165.saa,14 * * abc.123.456.dff safafsfa156165.saa,14
len() #3.5中按字符計算,2.7中按字節計算json() #變量裏面的字符必須使用雙引號