Python、はじめました

非IT系私文卒リーマン vs Python の全記録

【初めてのPython】zip関数

f:id:pokita:20180426195830j:plain

Pythonを勉強するために買ったオライリー『初めてのPython』(2017年第10版)
とても充実した内容で満足してたんだけど、後半に差し掛かり、「さて実際やってみるかな」でPyCharmを起動し記載されたプログラムを走らせて見たところ、エラーの連続。詳しく調べてみると、Python2準拠の教科書ってなに…??????

ってなことでzip関数の話。『初めてのPython(Python2準拠)』によると以下の入力でリストオブジェクトが出力されるハズなんだけど…

L1=[1,2,3,4,5]
L2=["a","b","c","d","e"]
X=zip(L1,L2)
print(X)
#初めてのPythonにはprint x と表記。まだprintが関数ではなくステートメント、つまりはPython2の文法。ここで気づくべきでした……
#予想だとここで
>>>[(1,"a"),(2,"b"),(3,"c"),…]
#と出るべきところが
>>>zip object at 0x02C9BF08

 

なんだこの仮想通貨のアドレスみたいな羅列は…調べてみると、Python3からはzip関数はzipオブジェクトを作るための関数となったらしく、そのままリストを返すわけではなくなったらしい。

つまり、上記の書き方はPython2の書き方。そう、何を隠そう『初めてのPython』はPython3非対応の書籍だったのである。
上記と同じ処理をしたいのなら、Python3での記述はこう。
print(list(zip(L1,L2)))
list関数でzipオブジェクトをリスト化することで同様の処理ができるとか。Python一から覚え直しやんけ!

ふざけるなよオライリー・ジャパン\(^o^)/

 

【オリジナル関数定義】

L1=[1,2,3,4,5]
L2=[1,2,3]
def zzip(a,b):
   if type(a)!=list or type(b)!=list:
   raise ValueError
   ("TypeError: 'type' object is not iterable")
   if len(a)>=len(b):
      n=len(a)
      s=len(a)-len(b)
      for i in range(s):
         b.append(None)
   else:
      n=len(b)
   s = len(b) - len(a)
      for i in range(s):
      a.append(None)
   z=[]
   for i in range(n):
      x=(a[i],b[i])
      z.append(x)
      i+=1
   return z
print(zzip(L1,L2))

>>>[(1, 1), (2, 2), (3, 3), (4, None), (5, None)]

ってなことで【初めてのPython】に騙されてしまいました。けど書い直すお金もないので良書には違いないので、今回からしっかりPyCharmを起動させその動きを見ながらPython3の勉強をすることにします。