見出し画像

バグあり!独学コンピューターサイエンティスト 第2部 第10章のサンプルプログラム

独学コンピューターサイエンティスト 第2部 第10章 では、連結リストのサンプルプログラムで整数と文字列のデータを扱っていますが整数データだと __str__ メソッドが落ちます。

以下は、 __str__ メソッドをデバッグした p180 から始まるサンプルプログラムです。

class Node:
    def __init__(self, data, next = None):
        self.data = data
        self.next = next

class LinkedList:
    def __init__(self):
        self.head = None

    def append(self, data):
        if not self.head:
            self.head = Node(data)
            return
        current = self.head
        while current.next:
            current = current.next
        current.next = Node(data)

    def __str__ (self):
        data_list = []
        node = self.head
        while node is not None:
            data_list.append(str(node.data))  # デバッグ! オリジナルは ⇒ data_list.append(node.data)
            node = node.next
        return "\n".join(data_list)

    def search(self, target):
      current = self.head
      while current:
           if current.data == target:
               return True
           else:
               current = current.next
      return False


a = LinkedList()
a.append('A')
print(a)  # 文字列 Σd(≧▽≦*)OK!! 

b = LinkedList()
b.append(1)
print(b)  # 整数  Σd(≧▽≦*)OK!! 


出力結果

A
1



【 追記 2023-04-04 】

落ちるオリジナルのサンプルプログラムを示さないのは不親切だと思ったので追記します。

以下は、出版社のサイトからダウンロードしたサンプルプログラム 'p180-p181.py' の最後に 'print(a_list)' を追加したプログラムとその出力結果です。

class Node:
    def __init__(self, data, next = None):
        self.data = data
        self.next = next

class LinkedList:
    def __init__(self):
        self.head = None

    def append(self, data):
        if not self.head:
            self.head = Node(data)
            return
        current = self.head
        while current.next:
            current = current.next
        current.next = Node(data)

    def __str__ (self):
        data_list = []
        node = self.head
        while node is not None:
            data_list.append(node.data)
            node = node.next
        return "\n".join(data_list)

    def search(self, target):
      current = self.head
      while current:
           if current.data == target:
               return True
           else:
               current = current.next
      return False

import random

a_list = LinkedList()

for i in range(0, 20):
    j = random.randint(1, 30)
    a_list.append(j)
    print(j, end=" ")

print(a_list.search(10))

print(a_list)  # バグを確認する為に追加!


出力結果

gundam@penguin:~/python$ python3 p180-p181.py
16 21 17 7 2 8 30 4 5 3 5 25 22 26 28 12 10 3 3 15 True
Traceback (most recent call last):
  File "/home/gundam/python/p180-p181.py", line 47, in <module>
    print(a_list)  # バグを確認する為に追加!
  File "/home/gundam/python/p180-p181.py", line 25, in __str__
    return "\n".join(data_list)
TypeError: sequence item 0: expected str instance, int found
gundam@penguin:~/python$ 





#日経BP
#独学コンピューターサイエンティスト #レビュー
#独CS #selftaughtcoder
#清水川貴之 さん
#CoryAlthoff さん
#Python #Python3
#バグ #bug