1.迭代器和生成器
1.迭代器
#列表推導(dǎo)式:擴(kuò)展操作,簡化代碼
>>> l3=[i for i in range(20) if i%2==1] #第一個i,就是往列表里面添加的value
>>>l3=[i if i%2==1 else "a" for i in range(20) ] #偶數(shù)替換成“a”,奇數(shù)用i值
#集合推導(dǎo)式
>>> s={i for i in range(10)}
>>> s
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
#字典推導(dǎo)式
>>> s={i:"a" for i in range(5)}
>>> s
{0: 'a', 1: 'a', 2: 'a', 3: 'a', 4: 'a'}
#迭代器
迭代器對象要求支持迭代器協(xié)議的對象,在Python中,支持迭代器協(xié)議就是實現(xiàn)對象的__iter__()和__next__()方法。
其中__iter__()方法返回迭代器對象本身;__next__()方法返回容器的下一個元素,在結(jié)尾時引發(fā)StopIteration異常。
'''
>>> l3=[i for i in range(20) if i%2==0] #__iter__有這個魔法方法,具備可以迭代
>>> li=iter(l3)
>>> next(li)
0
>>> l3=[i for i in range(20) if i%2==0]
>>> l3=l3.__iter__()
>>> next(l3)
0
>>> l3.__next__()
2
iter() 實現(xiàn)了 __iter__()
next() 實現(xiàn)了 __next__()
'''
#迭代器是用來干嘛
for:
1.iter() ->迭代器
2.next()->迭代取值
extend(iterable)->iter()->next()->append()
2.生成器generator
在Python中,使用生成器可以很方便的支持迭代器協(xié)議。
生成器通過生成器函數(shù)產(chǎn)生,生成器函數(shù)可以通過常規(guī)的def語句來定義,但是不用return返回,而是用yield一次返回一個結(jié)果,在每個結(jié)果之間掛起和繼續(xù)它們的狀態(tài),來自動實現(xiàn)迭代協(xié)議。
也就是說,yield是一個語法糖,內(nèi)部實現(xiàn)支持了迭代器協(xié)議,同時yield內(nèi)部是一個狀態(tài)機(jī),維護(hù)著掛起和繼續(xù)的狀態(tài)。
生成器函數(shù)返回生成器的迭代器。 “生成器的迭代器”這個術(shù)語通常被稱作”生成器”。
要注意的是生成器就是一類特殊的迭代器。作為一個迭代器,生成器必須要定義一些方法,
其中一個就是__next__()。如同迭代器一樣,我們可以使用__next__()函數(shù)來獲取下一個值。
在一個 generator function 中,如果沒有 return,則默認(rèn)執(zhí)行至函數(shù)完畢,如果在執(zhí)行過程中 return,
則直接拋出 StopIteration 終止迭代。
#yield用來處理批量數(shù)據(jù)的,查看部分?jǐn)?shù)據(jù),防止內(nèi)存爆了
'''
def fun():
i=0
while i<5:
print("***")
yield i #暫停使用,同時還可以返回值
i+=1
print("+++",i)
#運行結(jié)果:
>>> next(a)
***
0
>>> next(a)
+++ 1
***
1
'''
>>>next(fun()) #每次調(diào)用,都會生成一個對象
# 斐波那契數(shù)
def fib(num):
n,a,b=0,0,1
while n<num:
print(b)
if n%10==0:
yield #用來處理批量數(shù)據(jù)的,查看部分?jǐn)?shù)據(jù),防止內(nèi)存爆了
a,b=b,a+b
n=n+1
2.模塊和包
1.內(nèi)置模塊
本身就帶有的庫,就叫做Python的內(nèi)置的庫。(模塊==庫)
一些常見的內(nèi)置模塊
os 和操作系統(tǒng)相關(guān) os.path
sys 和系統(tǒng)相關(guān) sys.path
sys.path.append(r'') 可以添加路徑
re 正則表達(dá)式
2.第三方模塊
非Python本身自帶的庫,就是所謂的第三方的庫
3.模塊的導(dǎo)入,模塊的本質(zhì)就是一個py文件
import xxx [as yy]
from ../xx import xx [as yy]
'''
>>> import keyword #會把模塊里面所有的內(nèi)容都導(dǎo)入
>>> from random import randint #指定導(dǎo)入,節(jié)省內(nèi)存
>>> from random import* #會把模塊里面所有的內(nèi)容導(dǎo)入,但是不會導(dǎo)入 _cos,帶下劃線的私有屬性
'''
4.自定義模塊
py文件,可以做為一個模塊來用,直接作為一個模塊導(dǎo)入就行
__main__ 的意義:
當(dāng)文件是直接運行是,文件的__name__是__main__ ,當(dāng)文件是被導(dǎo)入時,__name__是文件名
'''
#py 聲明了name相當(dāng)于聲明主權(quán)
if __name__=="__main__": #我自己調(diào)用,才會執(zhí)行
print(__name__)
'''
'''
#添加自定義引用的第三方庫
>>> import os,sys
>>> sys.path
>>> sys.path.append(r"C:\Users\xxxx\Desktop\test") #指定你的目錄
>>> sys.path
>>> import test3 #C:\Users\xxxx\Desktop\test 引用目錄下test3.py文件
test
'''
5.包管理
基本上就是另外一類模塊。把用來處理一類事物的多個文件放在同一文件夾下組成的模塊集。
要讓python 將其作為包對待,在python2中必須包含__init__.py的文件,但在python3中沒有__init__.py文件也可以,使用包可以避免多個文件重名的情況,不同的包下的文件同名不影響。
導(dǎo)入包和模塊是一樣的方法,包導(dǎo)入后會在目錄中自動生成__pycache__文件夾存放生成的.pyc文件,要注意的是import后面的才是存在當(dāng)前作用域中的對象名,from是告訴python從什么地方導(dǎo)入,
使用sys.path添加文件的目錄路徑。
'''
>>> import xml
>>> import xml.dom
#不是系統(tǒng)的包就添加路徑
'''
import time
>>>time.localtime()
>>>time.asctime(time.localtime())
>>>time.time() #時間戳
3.擴(kuò)展外傳參數(shù)
#cmd中調(diào)用: python3 C:\Users\xxx\Desktop\python\test.py "test" "a"
import sys
def test():
print("this is test")
a="test"
return a
test1="this is test"
if __name__=="__main__": #我自己調(diào)用,才會執(zhí)行
print(__name__)
sys.argv
print(sys.argv)
print(sys.argv[1])
print(sys.argv[2])
test()
#運行結(jié)果:
__main__
['C:\\Users\\xxx\\Desktop\\python\\test.py', 'test', 'a']
test
a
this is test