1. 程式人生 > >python 生成器和各種推導式

python 生成器和各種推導式

##################################總結###############################

什麼是迭代器?

  可迭代物件通過__iter__()可以轉換成迭代器,滿足迭代器協議。

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

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

迭代器的取值兩種方法:
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))

迭代器:

  1,節省記憶體

  2,滿足惰性機制

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

生成器

        生成器函式中包含 yield , 返回資料和return差不多.
        return 會立即結束這個函式的執行
        yield 可以分段的執行一個函式

        生成器函式在執行的時候返回生成器. 而不是直接執行此函式

        能向下執行的兩個條件:
            
__next__(), 執行到下一個yield send(), 執行到下一個yield, 給上一個yield位置傳值 所有的生成器都是迭代器都可以直接使用for迴圈 都可以使用list()函式來獲取到生成器內所有的資料 生成器中記錄的是程式碼而不是函式的執行 def func(): print("我的天哪 ") yield "寶寶" gen = func() # 建立生成器. 此時執行會把生成器函式中的程式碼記錄在記憶體 當執行到__next__(), 執行此空間中的程式碼, 執行到yield結束.
def func():
    print("1111")
    yield "林志穎"
    print('22222')
    yield "周潤發"
    print('33333')
ret=func()
print("返回值是",ret)#返回值是 <generator object func at 0x00000000021B1F48>


print(ret.__next__())#1111 林志穎
print(ret.__next__())#22222 周潤發
# print(ret.__next__())

##################################作業#############################

(1)過濾掉長度小於3的字串列表,並將剩下的轉換成大寫字母
lst=['qwe1','ert','oo']
lse2=[i.upper() for i in lst if len(i) >3]
print(lse2)
(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)

for x in range(0,6):
    print('111111111111')#0次 包含了 0 1 2 3 4 5
                         #1次 包含了 0 1 2 3 4 5
    print(x)
    for y in range(0, 6):
        print('22222222222')
        print(y)
        if x % 2 == 0:
            print(x)
            print('=========')
        if y % 2 == 1:
            print(y)
(3)求M中3,6,9組成的列表
 
 
 
M = [[1,2,3],[4,5,6],[7,8,9]]
li = [i[-1] for i in M]
print(li)

for i in M:
print(i[-1])
 
(4)求出50以內能被3整除的數的平方,並放入到一個列表中。
li=[i*i for i in range(1,51) 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)

# for x in range(6):
# for y in range(7):#0 0123456 1 0123456 2 0123456
# # 1-1=0 #2-1=1 #3-1=2
# if x == y - 1:
# print(x)
(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)

#####思路
# l1 = ['alex', 'WuSir', '老男孩', '太白']
# for i in range(len(l1)):
# a=l1[i]+str(i)
# print(a)
(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]]
 
 
 
# for i in x['Values']:
#     print([i['timestamp'],i['values']])

li=[[i['timestamp'],i['values']] for i in x['Values']]
print(li)