day13——迭代器,生成器,列表推導式,生成器表達式

迭代器

可迭代對象

內部含有__iter__方法的就是可迭代對象,遵循可迭代協議。python

 

可迭代協議:

假如咱們本身寫了一個數據類型,但願這個數據類型裏的東西也可使用for被一個一個的取出來,那咱們就必須知足for的要求。這個要求就叫作「協議」。數組

能夠被迭代要知足的要求就叫作可迭代協議。可迭代協議的定義很是簡單,就是內部實現了__iter__方法。app

dir:查看對象全部方法

# print(dir('123')) # '__iter__'----------------------------True
# print('__iter__' in dir([1, 2, 3]))---------------------------True
# print('__iter__' in dir({'name':'alex'}))---------------------------True
# print('__iter__' in dir({'name'}))---------------------------True
# print('__iter__' in dir((1, 2, 3)))---------------------------True
# print('__iter__' in dir(1)) --------------------------- False
# print('__iter__' in dir(True))--------------------------- False函數

 

什麼是迭代器?

  可迭代對象經過__iter__()能夠轉換成迭代器,知足迭代器協議。

  內部含有__iter__且__next__方法的就是迭代器。

# l = [1, 2, 3]
# l_obj = l.__iter__()
# print(l_obj)spa

 

迭代器的取值兩種方法:

l = [1, 2, 3]
l_obj = l.__iter__()
print(l_obj)------------------<list_iterator object at 0x000002B84DE73748>
方法一:__next__()
print(l_obj.__next__())-------------1
print(l_obj.__next__())-------------2
print(l_obj.__next__())-------------3

方法二 for循環
for i in l_obj:
    print(i)
print('__next__' in dir(l_obj))
-------------1
        2
        3
        True

第二種判斷方法:

from collections import Iterable
from collections import Iterator
print(isinstance('123', Iterable))
print(isinstance('123', Iterator))debug

 

迭代器:

  1,節省內存code

  2,知足惰性機制對象

  3,取值過程單向不可逆(一條路走到黑)blog

 

迭代器遵循迭代器協議:必須擁有__iter__方法和__next__方法。內存

for循環,能遍歷一個可迭代對象,他的內部到底進行了什麼?

  • 將可迭代對象轉化成迭代器。(可迭代對象.__iter__())
  • 內部使用__next__方法,一個一個取值。
  • 加了try異常處理功能,取值到底後自動中止,防止報錯。

用while循環模擬for循環:

l = [1, 2, 3, 4, 5]
l_obj = l.__iter__()
while True:
    try:
        print(l_obj.__next__())
    except Exception:
        break
------------1
            2
            3
            4
            5

生成器

生成器本質也是迭代器,生成器是本身用python構建的迭代器

  1,經過生成器函數構建

  2,經過生成器推導式構建。

def func1():
    print(666)
    return 222
ret = func1()
print(ret)----------------666
                                    222

def func1():
    print(11)
    print(333)
    yield 222
    print(666)
    yield 777
g_obj = func1()  # 生成器對象 generator object
print(g_obj.__next__())
print(g_obj.__next__())
--------------------------11
                                    333
                                    222
                                    666
                                    777  

 

 

def cloth1():
    for i in range(1,10001):
        print('衣服%s' % i)
cloth1()  

打印''衣服+序號'’直到----------衣服10000


def cloth2():
    for i in range(1,10001):
        yield '衣服%s' % i

g = cloth2()
for i in range(1,51):
    print(g.__next__())

for i in range(1, 151):
    print(g.__next__())
打印''衣服+序號''   一直打印到----衣服200

 

next --- send

def func1():
    count = yield 222
    print(count)
    yield 777
    yield 888
g_obj = func1()  # 生成器對象 generator object
print(g_obj.__next__())
print(g_obj.send('wusir'))
-----------------222
                        wusir
                        777        

  1,send具備next功能

  2,send能夠給上一個yield傳值。

  3,第一個取值不會使用send

  4,最後一個yield不會獲得send的值、

 

列表推導式:

  能用列表推導式完成的,用python代碼均可以完成。用一句話構建一個你想要的列表。

  優勢:簡單,稍微難理解

  缺點:不能用debug

li = []
for i in range(1, 12):
    li.append(i)
print(li)----------------[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
li = [i for i in range(1, 12)]
[ 變量(加工後的變量) for 變量 in 可迭代對象 ]  遍歷模式
print(li)-------------------[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
li = []
for i in range(1, 12):
    li.append('python%s期' % i)
print(li)
---------------['python1期', 'python2期', 'python3期', 'python4期', 'python5期',
 'python6期', 'python7期', 'python8期', 'python9期', 'python10期', 'python11期']
[變量(加工後的變量) for 變量 in 可迭代對象]    遍歷模式
[變量(加工後的變量) for 變臉 in 可迭代對象 if 判斷]  帥選模式

l1 = [i for i in range(1, 101) if i % 2 == 0]
print(l1)-------------【2,4,6,8·····1001,篩選,100之內全部奇數。

l2 = [i for i in range(1, 101) if i % 2 == 1]
l2 = [i for i in range(1, 101, 2)]

print(l2)--------【1,3,5,7,```````992,10之內全部數的平方。 [1,4,9,16,```````100]

print([i*i for i in range(1, 11)])

 

3,將100之內全部內被三整除的數留到列表中。

①

print([i for i in range(1,101) if i % 3 == 0])

②
g = (i*i for i in range(1, 11))
print(g.__next__())-------------1
print(g.__next__())-------------4
print(g.__next__())-------------9
print(g.__next__())-------------16
print(g.__next__())-------------25
③
g = (i*i for i in range(1, 11))
for i in g:
    print(i)

列表推導式 :簡單明瞭,可是佔內存

生成器表達式:節省內存,不易看出

30之內全部能被3整除的數的平方
print([i*i for i in range(1, 31) if i % 3 ==0])
-------------[9, 36, 81, 144, 225, 324, 441, 576, 729, 900]

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
l3 = [ name for i in names for name in i if name.count('e') == 2]
print(l3)-------------------['Jefferson', 'Wesley', 'Steven', 'Jennifer']

# mcase = {'a': 10, 'b': 34}
# mcase_frequency = {mcase[k]: k for k in mcase}
# print(mcase_frequency)------------{10: 'a', 34: 'b'}

 

 




day13做業默寫
1,整理今天的博客,寫課上代碼,整理流程圖。
2,用列表推導式作下列小題
(1)過濾掉長度小於3的字符串列表,並將剩下的轉換成大寫字母
li = [i.upper() for i in ['dfsf','fskjf','fs','f'] if len(i) < 3]
print(li)



(2)求(x,y)其中x是0-5之間的偶數,y是0-5之間的奇數組成的元祖列表
li = [(x,y) for x in range(0,6) for y in range(0,6) if x % 2 == 0 if y % 2 == 1]
print(li)



(3)求M中3,6,9組成的列表
M = [[1,2,3],[4,5,6],[7,8,9]]
li = [i[-1] for i in M]
print(li)



(4)求出50之內能被3整除的數的平方,並放入到一個列表中。
li = [i*i for i in range(50) if i % 3 == 0]
print(li)

 



(5)構建一個列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
li = ['python%s期'%i for i in range(1,11)]
print(li)

 



(6)構建一個列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
li = [(x,y) for x in range(6) for y in range(7) if x == y - 1]
print(li)

 



(7)構建一個列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
li = [i for i in range(19) if i % 2 == 0]
print(li)

 



(8)有一個列表l1 = ['alex', 'WuSir', '老男孩', '太白']將其構形成這種列表['alex0', 'WuSir1', '老男孩2', '太白3']
l1 = ['alex', 'WuSir', '老男孩', '太白']
li = [l1[i] + str(i) for i in range(len(l1))]
print(li)

 



(9)有如下數據類型:
x = {
'name':'alex',
'Values':[{'timestamp':1517991992.94,
'values':100,},
{'timestamp': 1517992000.94,
'values': 200,},
{'timestamp': 1517992014.94,
'values': 300,},
{'timestamp': 1517992744.94,
'values': 350},
{'timestamp': 1517992800.94,
'values': 280}
],}
將上面的數據經過列表推導式轉換成下面的類型:
[[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]
①
li = [[x['Values'][i]['timestamp'],x['Values'][i]['values']]for i in range(len(x['Values']))]
print(li)

②
lst=[[i['timestamp'],i['values']] for i in x['Values']]
print(lst)
相關文章
相關標籤/搜索