Wpis z mikrobloga

[ #python #programowanie #programista15k ]

Czy ktoś może mi wytłumaczyć co się dzieje def __init__()?
Wiem, że ta klasa zwraca w zależności od podania cyfry alergie...
Tzn

Allergies(2) - zwróci is_allergic_to('peanuts'), dla (5) zwróci is_allergic_to('eggs') i is_allergic_to('shellfish')
To działa dobrze, ale nie rozumiem tego co dzieje się w self.lst po =

class Allergies(object):
"""Generates and stores allergies from a given score"""

# Allergie # score
allergie_list = ['eggs', # 1
'peanuts', # 2
'shellfish', # 4
'strawberries',# 8
'tomatoes', # 16
'chocolate', # 32
'pollen', # 64
'cats', # 128
]

def __init__(self, score):
"""Generates a list of allergies from a score"""
self.lst = [allergie
for i, allergie in enumerate(Allergies.allergie_list)
if 0 < (score & 1 << i )]

def is_allergic_to(self, allergie):
"""Tests if allergie is on the list"""
return allergie in self.lst
  • 4
Dla każdego elementu listy Allergies.allergie_list jest sprawdzane czy liczba zawiera bit 1 na określonej pozycji, jeśli tak, to ten element jest dopisywany dodawany do listy self.lst, w przeciwnym wypadku jest pomijany.

Przykładowo 5 to binarnie 101 więc ma 1 na pozycji 0 i 2 (patrząc od prawej strony), więc lista self.lst zawiera elementy znajdujące się pod tymi indeksami w liście Allergies.allergie_list