內置函數、匿名函數、正則表達式、time模塊、rangdom模塊、os模塊、序列化


內置函數
abs(-1)#絕對值all([1,2,'a',None])#可迭代對象中每一個值都為真結果為真
any([''])#None,空,0,False 當都為假的時候為假,否則為真
bin()#10進制轉化2進制
oct()#10進制8進制
hex()#10進制轉16進制
bool()#判斷值為false或true None,False,空串、字典、列表、元組、集合,0
bytes('hello',encoding='utf-8') = 'hello'.encode('utf-8') #unicode轉為bytes
callable(bytes)#判斷是否能被調用
chr(65)#A 數字對應的ascii碼
ord('A')#65 字母對應的ascii碼
compile()

eval(cmd,{全局},{局部})
#
#
cmd='print(x)'
#
x=1
#
eval(cmd,{'x':0},{'x':10000}) //10000
#
eval(cmd,{'x':0},{'y':10000})// 0
exec()
例子:
s
= 'for i in range(10):print(i)'
code
= compile(s,'','exec')#編譯成exec可執行的
exec(code)
int()
#整形
complex()#復數
float()#浮點
str()#字符串
list()#列表
tuple#元組
dict()#字典
set()#可變集合
frozenset()#不可變集合 s=set({1,2,3,4}) == s1 = frozenset({1,2,3,4})
dir(sys)#顯示內置函數下的屬性
divmod(10,3)#(3,1)求商與余數
enumerate()#l =['a','b','c'] \res = enumerate(l) \ for i in res:print(i) 顯示索引與值
globals()#查看全局作用域的名字(字典)
locals()#查看局部作用域
help(函數名)#查看函數的注釋
id()#id號,變量在內存中的位置
isinstance(x,int)#判斷x是不是整形的實例
max()#求最大值,序列值為同類型
min()#最小值
pow(x,y,z)#x的y平方,取模2
range()#
repr()#與str相似,轉化為字符串
reversed([1,'a',2,'c'])#反轉產生新的序列 結果為迭代器
round(3.567,2)#4舍5入 保留第二個參數兩位小數
slice(起始位置,結束位置,步長)#截取函數
sorted(l)#排序
sorted(l,reverse = True)#倒敘
sum([1,2,3])#求和 sum(i for i in range(10)) 生成器表達式
vars()#沒有參數相當於locals() 有參數相當於__dict__
zip()#拉鏈s = 'hello' l = [1,2,3,4,5] print(list(zip(s,l))) [('h',1),('e',2),('l',3),('l',4),('o',5)]
__import__('sys')#將字符串轉化為可引用的函數名
#
inp = input('》》》')
#
sys = __import__(inp)
#
print(sys.path)

匿名函數

利用匿名函數求最大工資
salariy
={'alex':10000000,
'egon':3000,
'yuanhao':2000,
'wupeiqi':10000
}
#方法一
print(list(zip(salariy.values(),salariy.keys())))
print(max(zip(salariy.values(),salariy.keys()))[1])

print(max(salariy,key = lambda name:salariy[name]))
#max分部拿取salariy的key,key= 比較依據
#按薪資排序人名
print(sorted(salariy,key=lambda name:salariy[name]))
print(sorted(salariy,key=lambda name:salariy[name],reverse = True))

--map映射
names
= ['alex','wupeiqi','yuanhao','yanglei','egon']
res
= map(lambda x:x+'_sb',names)
res
= map(lambda x:x if x=='egon' else x+'_sb',names)
print(list(res))

--reduce合並
from functools import reduce
#沒有第三個參數的時候,會把第一個range()的值作為初始值
print(reduce(lambda x,y:x+y,range(101),100))

--filter過濾
names
= ['alex_SB','wupeiqi_SB','yuanhao','yanglei','egon']
print(list(filter(lambda x:x.endswith('_SB'),names)))

正則表達式

import re
print(re.findall('\w','hello_ | egon 123'))#匹配字母數字及下划線
>['h', 'e', 'l', 'l', 'o', '_', 'e', 'g', 'o', 'n', '1', '2', '3']
print(re.findall('\W','hello_ | egon 123'))#匹配除字母數字和下划線之外的
>[' ', '|', ' ', ' ']
print(re.findall('\s','hello_ | egon 123 \n \t')) #匹配空
>[' ', ' ', ' ', ' ', '\n', ' ', '\t']
print(re.findall('\S','hello_ | egon 123 \n \t'))#匹配非空
>['h', 'e', 'l', 'l', 'o', '_', '|', 'e', 'g', 'o', 'n', '1', '2', '3']
print(re.findall('\d','hello_ | egon 123 \n \t'))#匹配數字
>['1', '2', '3']
print(re.findall('\D','hello_ | egon 123 \n \t'))#匹配非數字
>['h', 'e', 'l', 'l', 'o', '_', ' ', '|', ' ', 'e', 'g', 'o', 'n', ' ', ' ', '\n', ' ', '\t']
print(re.findall('h','hello_ | egon 123 \n \t'))#匹配h
>['h']
print(re.findall('^he','hello_ | egon 123 \n \t'))#he開頭
>['he']
print(re.findall('123$','hello_ | egon 123 \n \t 123'))#123結尾
>['123']

print(re.findall('a.c','a aaccacc a1c aaac'))
>['aac', 'acc', 'a1c', 'aac']
# []內部可以有多個字符,但本身只配多個字符的一個
print(re.findall('a[a-zA-Z]c','a a12cc a1c a*c a2c aac a\nc',re.S))
>['aac']
print(re.findall('a[.]c','a a12cc a1c a*c a2c aac a\nc',re.DOTALL))#re.S 可以匹配/n
['a1c', 'a*c', 'a2c', 'aac', 'a\nc']
print(re.findall('a[^a-zA-Z]c','a a12cc a1c a*c a2c aac a\nc',re.S))#匹配a非a-zA-Z c
>['a1c', 'a*c', 'a2c', 'a\nc']

#re.I(re.IGNORECASE): 忽略大小寫(括號內是完整寫法,下同)
#
M(MULTILINE): 多行模式,改變'^'和'$'的行為(參見上圖)
#
S(DOTALL): 點任意匹配模式,改變'.'的行為
#
L(LOCALE): 使預定字符類 \w \W \b \B \s \S 取決於當前區域設定
#
U(UNICODE): 使預定字符類 \w \W \b \B \s \S \d \D 取決於unicode定義的字符屬性
#
X(VERBOSE): 詳細模式。這個模式下正則表達式可以是多行,忽略空白字符,並可以加入注釋。以下兩個正則表達式是等價的:

print(re.findall(r'a\\c','a a12cc a\c a*c a2c a\nc'))#r原生

#?左邊那一個字符有0個或1個
print(re.findall('ab?','aab a ab aaaa'))
>['a', 'ab', 'a', 'ab', 'a', 'a', 'a', 'a']
print(re.findall('ab{0,1}','aab a ab aaaa'))
>['a', 'ab', 'a', 'ab', 'a', 'a', 'a', 'a']
#* 左邊哪一個字符有0個或無窮個
print(re.findall('ab*','aab a ab aaaa abbbbbabb'))
>['a', 'ab', 'a', 'ab', 'a', 'a', 'a', 'a', 'abbbbb', 'abb']
print(re.findall('ab{0,}','aab a ab aaaa abbbbbabb'))
>['a', 'ab', 'a', 'ab', 'a', 'a', 'a', 'a', 'abbbbb', 'abb']
#+ 左邊哪一個字符有1個或無窮個
print(re.findall('ab+','aab a ab aaaa abbbbbabb'))
>['ab', 'ab', 'abbbbb', 'abb']
print(re.findall('ab{1,}','aab a ab aaaa abbbbbabb'))
>['ab', 'ab', 'abbbbb', 'abb']
#{}左邊的字符有n-m次
print(re.findall('ab{3}','aab a ab aaaa abbbbbabb'))
>['abbb']
#.* 貪婪匹配
print(re.findall('a.*c','a123c456c'))
>['a123c456c']
#.*?非貪婪匹配
print(re.findall('a.*?c','a123c456c'))
>['a123c']
print(re.findall('company|companies','Too many companies hava gone bankrupt,and the next one is my company'))
>['companies', 'company']
print(re.findall('compan(?:y|ies)','Too many companies hava gone bankrupt,and the next one is my company'))
>['companies', 'company']

正則表達式分組

#():分組
print(re.findall('ab+','abababab123'))#匹配a*n個b
>['ab', 'ab', 'ab', 'ab']
print(re.findall('ab+123','abababab123'))#匹配a*n個b*123
>['ab123']
print(re.findall('ab','abababab123'))#匹配ab
>['ab', 'ab', 'ab', 'ab']
print(re.findall('(ab)','abababab123'))
>['ab', 'ab', 'ab', 'ab']
print(re.findall('(a)b','abababab123'))
>['a', 'a', 'a', 'a']
print(re.findall('a(b)','abababab123'))
>['b', 'b', 'b', 'b']
print(re.findall('(ab)+','abababab123'))
>['ab']
print(re.findall('(?:ab)','abababab123'))
>['ab', 'ab', 'ab', 'ab']

time模塊

time.time()#1970年到現在的時間戳
>1502378474.6239138
time.strftime(
'%Y-%m-%d %X')#格式化時間
>2017-08-10 23:21:14
time.localtime()
#結構化時間(可加時間戳)
>time.struct_time(tm_year=2017, tm_mon=8, tm_mday=10, tm_hour=23, tm_min=21, tm_sec=14, tm_wday=3, tm_yday=222, tm_isdst=0)
time.mktime(time.localtime())
#結構化時間轉為時間戳
>1502378474.0
time.strftime(
'%Y',time.localtime())#結構化轉為格式化
>2017
time.strptime(
'2017-03-01','%Y-%m-%d')#轉為結構化
>time.struct_time(tm_year=2017, tm_mon=3, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=60, tm_isdst=-1)
time.ctime()
#格式為:Sat Aug 5 8:29:23 2017 可將時間戳轉為前面的格式
>Thu Aug 10 23:21:14 2017

random模塊

random.random()#0-1之間的小數
random.randint(1,3)#1到等於3之間的整數
random.randrange(1,3)#1到小於3之間的整數
random.choice([1,'23'])#任意去一個元素
random.sample([1,'23',[4,5]],2)#任意取第三個參數個值
random.uniform(1,3)#大於1小於3的小數
random.shuffle([1,2,3])#打亂順序

os模塊

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 輸出用於分割文件路徑的字符串 win下為;,Linux下為:
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所指向的文件或者目錄的最后修改時間
os.path.getsize(path) 返回path的大小

shutil模塊

將文件內容拷貝到另一個文件中
shutil.copyfileobj(fsrc, fdst[, length])
例:

import shutil 
shutil.copyfileobj(open(
'old.xml','r'), open('new.xml', 'w'))

shutil.copyfile(src, dst)
拷貝文件

shutil.copyfile('f1.log', 'f2.log') #目標文件無需存在

shutil.copymode(src, dst)
僅拷貝權限。內容、組、用戶均不變

shutil.copymode('f1.log', 'f2.log') #目標文件必須存在

shutil.copystat(src, dst)
僅拷貝狀態的信息,包括:mode bits, atime, mtime, flags

shutil.copystat('f1.log', 'f2.log') #目標文件必須存在

shutil.copy(src, dst)
拷貝文件和權限

 import shutil
shutil.copy(
'f1.log', 'f2.log')

shutil.copy2(src, dst)
拷貝文件和狀態信息

import shutil
shutil.copy2(
'f1.log', 'f2.log')

shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
遞歸的去拷貝文件夾

 import shutil
shutil.copytree(
'folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目標目錄不能存在,注意對folder2目錄父級目錄要有可寫權限,ignore的意思是排除

shutil.rmtree(path[, ignore_errors[, onerror]])
遞歸的去刪除文件

 import shutil
shutil.rmtree(
'folder1')

shutil.move(src, dst)
遞歸的去移動文件,它類似mv命令,其實就是重命名。

 import shutil
shutil.move(
'folder1', 'folder3')

序列化

--序列化
我們把對象(變量)從內存中變成可存儲或傳輸的過程稱為序列化
序列化的作用:1、持久保存狀態 2、跨平台數據交互
json:如果我們要在不同編程語言之間傳遞對象,就必須把對象序列化為標准格式,比如xml
但更好的方法是轉化為json,因為json標識出來就是一個字符串,可以被所有語言讀取。

import json
dic
= {'name':'egon','age':18}
print(type(json.dumps(dic)))#將字典轉化為json形式的字符串

--存

with open('a.json','w') as f :
f.write(json.dumps(dic))

--讀

with open('a.json','r') as f:
data
= json.loads(f.read())

--dump直接打開文件存入

dic = {'name':'egon','age':18}
json.dump(dic,open(
'b.json','w'))

--load 直接打開文件讀取

a = json.load(open('b.json','r'))
print(a['name'])

注意:
import json
#dct="{'1':111}"#json 不認單引號
#dct=str({"1":111})#報錯,因為生成的數據還是單引號:{'one': 1}

dct='{"1":"111"}'
print(json.loads(dct))

#conclusion:
# 無論數據是怎樣創建的,只要滿足json格式,就可以json.loads出來,不一定非要dumps的數據才能loads

--pickle Pickle的問題和所有其他編程語言特有的序列化問題一樣,就是它只能用於Python,並且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的數據,不能成功地反序列化也沒關系。

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com