python基礎(chǔ)-11-迭代器生成器、模塊和包

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

    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容