推導式,迭代器,模組,包
阿新 • • 發佈:2019-01-13
推導表示式
- 推導表示式相對於for迴圈來處理資料,要更加的方便
- 列表推導表示式使用更加的廣泛
列表推導
- 迴圈新增:
li = [ ]
for i in range(1,11): #左閉右開
li.append(i) #[1,2,3,4,5,6,7,8,9,10] - 列表推導:
li = [i for i in range(1,11)]- 列表推導+條件判斷
l2 = [i for i in range(1,11) if i % 2 == 0] #[2,4,6,8,10] - 列表推導+三目運算
l3 = [i if i % 2 == 0 else 0 for i in range(1,11)] #[0, 2, 0, 4, 0, 6, 0, 8, 0, 10]
- 列表推導+條件判斷
集合和字典推導
- 集合推導
{i for i in range(1,10)} - 字典推導
{i:j for i,j in enumerate(li)}
迭代器和生成器
迭代器
- 生成迭代器:
iterator = iter(li)
或者:
iterator = li.iter() - 迭代器物件本身需要支援以下兩種方法(必須要有的,它們使迭代器能夠進行迴圈遍歷),他們一起構成迭代器協議:
iterator.iter()
iterator.next() - 取值:
next(iterator)
iterator.next()
小例:
i = iter([1,2,3])
for j in range(3):
print(next(i)) #1
2
3
注意:如果迭代器值取完之後,會返回StopIteration錯誤
自定義迭代器
class TupleIter: def __init__(self,li): self.li = li self._index = 0 def __iter__(self): return self #固定寫法 def __next__(self): if self._index < len(self.li): index = self.li[self._index] self._index += 1 return index else: raise StopIteration t = TupleIter((1,2,3,4)) for i in t: print(i) #1 2 3 4
生成器
- 生成器也可以看作迭代器
- 函式中只要有yield關鍵字就是一個生成器物件
- 生成器物件可以被遍歷
- 生成器一般使用到大資料批量獲取
- 作用:節省資源
def func(n):
i = 0
while i < n:
yield i
i += 1 - yield表示式只能在函式中使用,在函式體中使用yield表示式可以使函式成為一個生成器
- 生成器可以被迭代,也就是可以被迴圈遍歷
- yield可以表示式結果,並且暫定函式執行
- yield類似於return,但yield不會結束函式,是暫時掛起返回值
斐波拉契數列
def fab_yield(end):
n,a,b = 0,0,1
while n < end:
yield b
a,b = b,a + b
n = n + 1
- 通過迭代器去生成斐波拉契數列或者獲取列表中大量資料要比直接得到(比如for)更加節省記憶體,是一個一個迭代出來,而不是一起全部取出,效率也高
i = 0
def func():
global i
i += 1
yield i
print(“hh”)
f = func() #沒有下面時,什麼都不會列印,在這裡掛起
for j in f:
print(j) #1
hh
模組
- 模組:
在Python中,模組就是一個py檔案,可以使用下面兩種方法匯入- import datetime #模組名
使用時:datetime.datetime() #模組名.函式名() - from datetime import datetime(as this_datetime)
注意:datetime是一個常用的時間處理模組
- import datetime #模組名
- 在同一目錄下,可直接使用上面兩種方法去匯入
- 在不同目錄下,需要使用sys.path新增路徑
- sys.path.append(‘path’)
- 在Python3中匯入後,會在當前路徑下生成一個__pycache__資料夾
sys模組
- sys模組提供了與Python直譯器互動的函式,在Python中它是始終可以匯入使用的
- sys.argv 獲取終端命令列輸入
- sys.path 直譯器模組匯入查詢路徑
if name==‘main’:
- name
python會自動的給模組加上這個屬性
如果模組是被直接呼叫的,則__name__的值是__main__,否則就是改模組的模組名 - if name==‘main’
- 自身直接執行的時候成立,其他檔案呼叫的時候不成立
- 該語句可以控制程式碼在被其他模組匯入時,if name=='main’下面的程式碼不被執行
包和包管理
- 包概念:
把很多模組放到一個資料夾裡面,就可以形成一個包 - 包管理:
當把很多模組放在檔案中時,為了方便引用包中的模組,引入了包管理 - init.py
在包管理中,加入此模組,則包名可以直接通過屬性訪問的方式,訪問此模組內的物件,此模組不加上可能不會報錯,但是規範是要加上,檔案內容可以為空 - 相對路徑匯入:
在包管理中,可以通過(一個點)和…(兩個點)分別來匯入同層和上一層的模組
相對路徑匯入
- 引用作用:
在包中,如果包中模組要匯入同一包中的其他模組,就必須使用此方法匯入 - 使用方法:
from.module(…module) import obj (as new_name) - 引入之後的影響
當一個模組中出現此匯入方式,則該模組不能被直接執行,只能被匯入