Изменяемые объекты
kane = {'name':'Kane', 'health':'normal'}
dallas = {'name':'Dallas', 'health':'normal'}
lambert = {'name':'Lambert', 'health':'normal'}
group1 = [kane, dallas, lambert]
explore_the_object(group1)
print(group1)
# [ {'name': 'Kane', 'health': 'infected!'}, !!!!!
# {'name': 'Dallas', 'health': 'normal'},
# {'name': 'Lambert', 'health': 'normal'} ]
def explore_the_object(group):
group[0]['health'] = 'infected!'
Ещё примерчики
group = spaceship.get_names()
def me_too(g):
g.append(alien) # возможны проблемы!
return g
def get_names(self): # self у нас изменяемый?
g = []
for k, v in self.members.items():
g.append(v['name'])
return g
def get_names(members): # нет видимых эффектов!
g = []
for k, v in members.items():
g.append(v['name'])
return g
# именно так мы избавляемся от циклов
def get_names(members):
return list(map(lambda v: v['name'], members.values())
Больше примерчиков!
def dispatch_emergency(members):
alive = next(filter(lambda m: m.is_alive(),
members.values()), None)
if alive is not None:
msg = alive.make_message()
log.debug(alive + ' made the message ' + msg) # Ы?
send(msg) # побочный эффект 1
elif len(members) == 0:
send('SOS') # побочный эффект 2
def build_emergency_action(members):
alive = next(filter(lambda m: m.is_alive(),
members.values()), None)
if alive is not None:
msg = alive.make_message()
return SendIntent(msg) # значение 1
elif len(members) == 0:
return SendIntent('SOS') # значение 2
return SendIntent(None) # значение 3
dispatch(emergency_action) # только эффект, никакой логики
Шаг 0
+6 +7 +6
Шаг 1
+2 -3 /3
Шаг 2
/2 *4 +9
Шаг 3
-5 +2 -6
Вопрос
? ? ?
Ответ
-1 18 5