標籤:als 傳參 包括 ges pen dump ini read 轉換
本節目錄:
1、產生器
1.1 列表推導式方法
1.2 函數法--適用複雜的推導方法
2、迭代器
3、裝飾器
3.1 單一驗證方式(調用不傳參數)
3.2 單一驗證方式(調用傳參數)
3.3 多種驗證方式
4、模組
4.1 第三方模組
4.2 標準庫
4.3 sys模組
5、json
5.1 json序列化
5.2 json還原序列化
1、產生器
1.1 列表推導式方法
data = [1,2,3]
data = (i*2 for i in data)
print(data)
print(data.__next__())
print(data.__next__())
print(data.__next__())
1.2 函數法--適用複雜的推導方法
def fib(num):
count = 0
a,b = 0,1
while count < num:
tmp = a
a = b
b = a + tmp
#print(a)
count += 1
yield a
print("done.......")
num = int(input("num>>:")) #輸入列印的資料數量
f = fib(num)
for i in range(num):
print(f.__next__())
****************************************************
函數中:
return a 返回a,並結束函數
yield a 返回a,並掛起函數;返回給了通過__next__()調用函數的人;
代表通過yield實現函數的中斷,並且儲存了函數執行的中間狀態。
類比並發:
import time
def consumer(name):
print("%s準備吃包子"% name)
while True:
baozi = yield
print("包子[%s]來了,被[%s]吃了"% (baozi,name))
def producer(name):
c1 = consumer("A")
c2 = consumer("B")
c1.__next__()
c2.__next__()
print("%s做包子"% name)
for i in range(5):
time.sleep(1)
print("做2個包子")
c1.send(i+1)
c2.send(i+1)
producer("tom")
****************************************************
2、迭代器
可以被next()函數調用並不斷返回一個值得對象成為迭代器
產生器都是迭代器>>>產生器是帶有next方法的僅能迭代一次的迭代器
迭代器不全是產生器
由iter產生的對象是迭代器,也可以說是產生器
(1)、iter獨立產生迭代器,這種角度可以說迭代器和產生器不一樣
(2)、iter底層也是由產生器的方法產生的迭代器,這種角度可以說迭代器和產生器一樣
range函數最佳化
py2直接產生對應的列表
py3產生對應的產生器
****************************************************
3、裝飾器
高階函數 嵌套函數 -->給原代碼增加新功能,但是不改變原代碼
作用:
完全符合 開放、封閉原則--不改變原代碼、調用方式,實現功能擴充
3.1 單一驗證方式(調用不傳參數)
user_status = False
def login(func):
def inner():
_username = ‘zs‘
_passwd = ‘123‘
global user_status
if user_status == False:
username = input("user>>:")
passwd = input("pw>>:")
if username == _username and passwd == _passwd:
print("welcome!")
user_status = True
else:
print("wrong username or passwd")
if user_status:
func()
return inner
def home():
print("首頁")
@login
def america():
#login()
print("美國")
@login
def japan():
#login()
print("日本")
def china():
print("中國")
home()
#america = login(america)
america()
#japan = login(japan)
japan()
china()
3.2 單一驗證方式(調用傳參數)
user_status = False
def login(func):
def inner(*args,**kwargs):
_username = ‘zs‘
_passwd = ‘123‘
global user_status
if user_status == False:
username = input("user>>:")
passwd = input("pw>>:")
if username == _username and passwd == _passwd:
print("welcome!")
user_status = True
else:
print("wrong username or passwd")
if user_status:
func(*args,**kwargs)
return inner
def home():
print("首頁")
@login
def america(stype):
print(stype)
print("美國")
def japan():
print("日本")
def china():
print("中國")
home()
america(‘america‘)
japan(‘japan‘)
china()
3.3 多種驗證方式
user_status = False
def login(stype):
def outer(func):
def inner(*args,**kwargs):
if stype == ‘qq‘:
_username = ‘zs‘
_passwd = ‘123‘
global user_status
if user_status == False:
username = input("user>>:")
passwd = input("pw>>:")
if username == _username and passwd == _passwd:
print("welcome!")
user_status = True
else:
print("wrong username or passwd")
if user_status:
func(*args,**kwargs)
else:
print("僅支援QQ驗證")
return inner
return outer
def home():
print("首頁")
@login(‘qq‘)
def america(stype):
print(stype)
print("美國")
@login(‘weixin‘)
def japan():
print("日本")
def china():
print("中國")
home()
america(‘america‘)
japan(‘japan‘)
china()
4、模組
import sys
for i in sys.path:
print(i)
輸出:
D:\python培訓\our_python\day5
D:\python培訓\our_python
F:\Python\Python3\python35.zip
F:\Python\Python3\DLLs
F:\Python\Python3\lib
F:\Python\Python3
F:\Python\Python3\lib\site-packages
尋找模組時按照上述的路徑依次進行查詢,知道查到模組為止,否則報錯
__file__ 取相對路徑
os.path.abspath(__file__) 把相對路徑變為絕對路徑
多個模組匯入,每個模組寫一行,太長的模組名做別名
py2
目錄中沒有__init__,那就只是一個目錄,目錄是不可以被匯入的
目錄中有__init__,這個目錄就變成了“包”=package 包是模組的集合
py3
4.1 第三方模組
pypi網址上 pip安裝
4.2 標準庫
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 輸出用於分割檔案路徑的字串
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所指向的檔案或者目錄的最後修改時間
4.3 sys模組
sys.argv 命令列參數List,第一個元素是程式本身路徑
sys.exit(n) 退出程式,正常退出時exit(0)
sys.version 擷取Python解釋程式的版本資訊
sys.maxint 最大的Int值
sys.path 返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值
sys.platform 返回作業系統平台名稱
sys.stdout.write(‘please:‘)
val = sys.stdin.readline()[:-1]
進度條:
import sys, time
for i in range(5):
sys.stdout.write(‘#‘)
time.sleep(1)
sys.stdout.flush()
5、json
把記憶體對象轉換成字串的形式就是序列化
把一個字元創轉成對應的記憶體對象就是反序列
序列化作用持久化記憶體資料
json.dumps(data) 針對資料序列化
json.loads(f.read()) 針對資料序列化
json.dump(data) 針對資料序列化
json.load(f.read()) 針對資料序列化
5.1 json序列化
<1>
import json
data = {‘name‘:‘zs‘,‘age‘:26}
f = open(‘json.txt‘,‘w‘,encoding=‘utf-8‘)
f.write(json.dumps(data))
f.close()
<2>
import json
data = {‘name‘:‘zs‘,‘age‘:26,‘sex‘:‘men‘}
f = open(‘json.txt‘,‘w‘,encoding=‘utf-8‘)
json.dump(data,f)
f.close()
5.2 json還原序列化
<1>
import json
f = open(‘json.txt‘,‘r‘,encoding=‘utf-8‘)
data = json.loads(f.read())
print(data)
print(data[‘age‘])
<2>
import json
f = open(‘json.txt‘,‘r‘,encoding=‘utf-8‘)
data = json.load(f)
print(data)
print(data[‘age‘])
json從檔案中取資料,僅能取一種類型,並且只能去一條記錄,即dump和load的次數只能是1
json無法序列化函數---所有語言通用
pickle僅用於python語言,支援計劃所有的資料類型
Python基礎篇-day5