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