[問題] for 迴圈取完值,原本zip物件就變空了

看板Python作者 (...)時間7年前 (2017/04/10 17:26), 編輯推噓2(2020)
留言22則, 6人參與, 最新討論串1/2 (看更多)
做法是讀檔案後,將資料放入一zip物件 zipobj = zip(date2num(r['date']),r['open'],r['close'],r['volume']) dates = [x[0] for x in zipobj] volume = [x[3] for x in zipobj] print dates 後會有資料,但是print volume就會回傳[] 想請問上面for迴圈的做法,會造成原本的zipobj全部清空嗎? 最近開始自學python,這是參考網路上的程式碼, 發現的問題,覺得疑惑… -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.228.206.21 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1491816395.A.31A.html

04/10 17:33, , 1F
zip是 generator, 只能用一次
04/10 17:33, 1F

04/10 19:25, , 2F
iterator不回頭。這是從functional programming來的
04/10 19:25, 2F

04/10 19:42, , 3F
.... fp 裡面有 iterator...? 樓上是認真的嗎
04/10 19:42, 3F

04/10 21:26, , 4F
二樓說的應該是 generator, 不過仍然不太準確, 雖然這個
04/10 21:26, 4F

04/10 21:26, , 5F
概念是從 functional programming languages 開始流行,
04/10 21:26, 5F

04/10 21:27, , 6F
但本身與 functional programming 關係不大
04/10 21:27, 6F

04/11 14:12, , 7F
python裡generator繼承自iterator
04/11 14:12, 7F

04/11 14:14, , 8F
但zip不是generator吧
04/11 14:14, 8F

04/11 14:15, , 9F
zip也沒有send, throw, close等methods
04/11 14:15, 9F

04/11 14:16, , 10F
至少我看ABC裡是這樣寫的
04/11 14:16, 10F

04/12 08:47, , 11F
generator iterator iterable 傻傻分不清
04/12 08:47, 11F

04/12 12:37, , 12F
你應該是在用python3 看的範例卻是python2的
04/12 12:37, 12F

04/12 12:37, , 13F
zip在python2 是產生new list of turples 所以我用
04/12 12:37, 13F

04/12 12:38, , 14F
python2可正常執行 python3中 zip改成 generator
04/12 12:38, 14F

04/12 12:40, , 15F
你原本的code 加一行 zipobj2 = [ x for x in zipobj]
04/12 12:40, 15F

04/12 12:40, , 16F
應該就可以了(我不確定 因為我是用python2 測試看看吧)
04/12 12:40, 16F

04/12 12:41, , 17F
另外處理表格建議使用pandas
04/12 12:41, 17F

04/12 12:49, , 18F
補充一下 雖然加一行可以解決你的問題 但這種用法是違
04/12 12:49, 18F

04/12 12:50, , 19F
背generator精神的 (剛發現更簡單的寫法
04/12 12:50, 19F

04/12 12:51, , 20F
zipobj = list(zip(.....))
04/12 12:51, 20F

04/18 20:33, , 21F
為什麼不用一個迴圈包整個呢,發揮generator的特性,
04/18 20:33, 21F

04/18 20:33, , 22F
又不用跑兩個迴圈
04/18 20:33, 22F
文章代碼(AID): #1Owq_BCQ (Python)
文章代碼(AID): #1Owq_BCQ (Python)