У вас есть ошибка, когда вы устанавливаете L = len (L), а не len (U). Кроме того, у вас есть ошибка, из-за которой вы будете возвращать false, если первый пользователь не соответствует, а не если каждый пользователь не соответствует. В Python та же функция может быть написана как одно из следующих:
def user_crawled(user):
for a in l:
if a == user:
return True
return False
def user_crawled(user):
return user in a
Функция test_users использует user_crawled в качестве переменной, на самом деле она ее не вызывает. Кроме того, кажется, что вы делаете обратное тому, что вы намерены, вы хотите, чтобы новые были заполнены непроверенными пользователями, а не проверенными. Это функция с исправленными ошибками:
def test_users(users):
new = list()
for u in users:
if not user_crawled(u):
new.append(u)
return new
Используя функцию генератора, вы можете еще больше упростить функцию (при условии, что вы намереваетесь зацикливаться на результатах):
def test_users(users):
for u in users:
if not user_crawled(u):
yield u
Вы также можете использовать функцию фильтра:
def test_users(users):
return filter(lambda u: not user_crawled(u), users)
Вы используете список для хранения пользователей, а не хеш-структуру. Python предоставляет наборы для случаев, когда вам нужна структура типа списка, которая никогда не может иметь дубликатов и требует быстрых тестов существования. Наборы также могут быть вычтены для удаления всех элементов одного набора из другого.
Кроме того, ваш список (U) состоит из пользователей, но вы сопоставляете его с именами пользователей. Вам нужно хранить только имя пользователя каждого добавленного пользователя. Кроме того, вы используете u для представления пользователя в одной точке программы и для представления имени пользователя в другой, вам следует использовать более значимые имена переменных.
Синтаксический сахар Python в итоге устраняет необходимость во всех ваших функциях. Вот как я бы переписал всю программу:
import twitter
start_follower = "cleversallie"
MAX_DEPTH = 3
searched = set()
api = twitter.Api()
def crawl(follower, in_depth=MAX_DEPTH):
if in_depth > 0:
searched.add(follower['screen_name'])
users = api.GetFriends(follower)
names = set([u['screen_name'] for u in users])
names -= searched
for name in list(names)[:5]:
crawl(name, in_depth - 1)
crawl(start_follower)
print "\n".join(searched)
print("Program done.")