1. 程式人生 > >推導式、叠代器、生成器及包

推導式、叠代器、生成器及包

keys vip 就會 fir 取值 推導 end ems 生成器

# 一、推導式:

# 列表推導式
li = [i for i in range(1,10)]
print(li)

# 列表推導式中加判斷
li1 = [i for i in range(1,10) if i % 2 == 1]
print(li1)

# 列表推導式中加三目運算符
li2 = [i*100 if i % 2 == 0 else i*10 for i in range(1,10)]
print(li2)



# 集合推導式
se = {i for i in range(1,10)}
print(se)

# 集合推導式也可以加判斷和三目運算符


# 字典推導式
di = {i:j for i,j in enumerate([‘aa‘,‘bb‘,‘cc‘])} # 利用枚舉函數enumerate
print(di)

di2 = {i:j for i,j in zip([‘aa‘,‘bb‘,‘cc‘],[11,22,33])} # 利用zip
print(di2)


# 可叠代對象:序列類型,散列類型,range keys values items等等,有內置 __iter__ 方法的:
print(dir(dict))


# 叠代器(iterator):有 __iter__ 和 __next__ 方法
# 讓可叠代對象,變為叠代器有兩個方法:
# 1 iter()
it = iter([1,2,3,4])
print(dir(it))
print(it) # <list_iterator object at 0xb720534c> 叠代器對象

# 2 __iter__()
tu = (6,7,8)
it2 = tu.__iter__()
print(dir(it2))

# 取值 方法也有兩個
# 1 __next__()
while 1:
print(it.__next__()) # 值取完後 就會返還 StopIteration 的錯誤

# 2 next() # 一次取一個
# while 1:
# print(next(it)) # 沒有值了就會返還 StopIteration 的錯誤

# 可叠代對象是“一次性”的,即對其叠代一次後,值就沒了,要想再叠代,必須重新賦值
# 可叠代對象 是用來生成叠代器的



# for 原理 只能循環可叠代對象
li = [1,2,3,4,5,6,7]
my_it = iter(li) # 首先將可叠代對象變成叠代器
while True:
try:
var = next(my_it)
print(var)
except StopIteration:
break



# 生成器(generator) 就是 叠代器 叠代可控制、省內存
# 1 推導式

ge = (i for i in range(1,100000000000000))
print(ge)



# 2 yeild 關鍵字 在函數裏面加上yield關鍵字

li = [8,7,6,5,4,3]

def my_ge():
a = 0
for i in li:
yield i # 返回這個對象、暫停這個函數、等待下次next重新激活
a += 1
print(‘循環次數:‘,a)
a = my_ge()
print(a) # 打印的不是None 而是生成器
while 1:
print(next(a))





# 三、模塊
#導入:兩種方法:
# 1. import first

# 2. from first import my_dir

# from first import my_dir as dd # 取別名
# a = dd
# print(a)

import sys
sys.path.append(‘/home/pyvip/‘) # 可以添加路徑,讓其導入當前路徑以外的模塊
print(sys.path) # 在這個打印出的路徑下可以導入

import csc # 雖然報錯,但可以導入



# 四、包

#包的概念:

#導入包下面的東西
# from pakg import pakg1

# 同級文件夾下的模塊(包)可互導:
from 同級包名1 import 同級包名2

# 不同級的包不能互相導入,如果外層要導入的內層的包,需要:
from 外層包名.內層包名(或*) import 內層包名
# 在內層文件夾下導入外層的包:
from 外層包名 import 裏面的包

# 通過在上層包名前面加.來實現與上層的其他包同級

# 一般只導3層的包,即之前加兩個點。

推導式、叠代器、生成器及包