Сделать код Python более эффективным для уменьшения размера скрипта?

#python #firebase-realtime-database #grovepi

#python #firebase-realtime-database #grovepi

Вопрос:

обновленный код Я новичок в Python и пытаюсь сделать свой код более эффективным. В настоящее время я переношу значения датчиков в базу данных Firebase в реальном времени в разные поля, но код повторяется. Могу ли я в любом случае уменьшить размер скрипта, используя цикл или альтернативный метод.

 def getSound():
    sound_value = grovepi.analogRead(sound_sensor)
    result = firebase.patch('/SoundValues/Monday/'{'Sound1':int(sound_value)})
    print("the sound value is%d" %sound_value)
    time.sleep(1)

def getSound1():
    sound_value = grovepi.analogRead(sound_sensor)
    result = firebase.patch('/SoundValues/Monday/'{'Sound2':int(sound_value)})
    print("the sound value is%d" %sound_value)
    time.sleep(1)
  

Любая помощь будет с благодарностью принята 🙂

Комментарии:

1. Напишите функцию, которая принимает в качестве параметра все, что отличается между этими двумя функциями.

2. Не могли бы вы уточнить, спасибо

3. Я предполагаю, что отсутствует запятая: она должна быть firebase.patch('/SoundValues/Monday/', {'Sound1':int(sound_value)}) . Верно?

Ответ №1:

Измените функцию так, чтобы она принимала номер звука в качестве параметра:

 def getSound(number):
    sound_value = grovepi.analogRead(sound_sensor)
    key = 'Sound%d' % number # this will be 'Sound1', 'Sound2', etc.
    result = firebase.patch('/SoundValues/Monday/'{key :int(sound_value)})
    print("the sound value is%d" %sound_value)
    time.sleep(1)
  

Затем вы должны вызвать функцию как getSound(1) getSound(2) , и т.д.

Комментарии:

1. Спасибо за ваш ответ! Я получаю следующий результат ошибки = firebase.patch(‘/SoundValues/Monday/'{key:int(sound_value)}) ^ Ошибка синтаксиса: недопустимый синтаксис

2. Я подумал, что это выглядит странно, но я скопировал это из вашего исходного кода, поэтому предположил, что это сработало. Вы действительно запускали опубликованный вами код?

3. Каким firebase.patch() должен быть аргумент? Это просто обычная строка, например '/SoundValues/Monday/Sound1' ?

4. Я пытаюсь запустить значение датчика звука и сохранить каждое значение в Firebase, а не перезаписывать его, например, мне нужно 10 значений в Firebase, и они будут сохранены от sound1 до sound10

5. Хорошо, но каким patch() должен быть аргумент? У вас есть пример? Я ничего не знаю о firebase.

Ответ №2:

Я бы всегда смотрел на то, что отличается между getSound() и getSound1(). Похоже, что функции имеют точно такой же код, за исключением этой строки:

 result = firebase.patch('/SoundValues/Monday/'{'Sound1':int(sound_value)})
  

Таким образом, вы можете написать одну функцию со всем повторяющимся кодом и использовать ‘sound_spec’ в качестве параметра вашей функции. Это будет выглядеть примерно так:

 sound_value = grovepi.analogRead(sound_sensor)

def getSound(sound_spec):
    result = firebase.patch(sound_spec)
    print("the sound value is%d" %sound_value)
    print("firebase.path result %s" % str(result))
    time.sleep(1)
  

Затем вы могли бы иметь список ‘sound_specification’ и использовать цикл for для получения результата для нескольких значений:

 sound_specs = ['/SoundValues/Monday/'{'Sound1':int(sound_value)},'/SoundValues/Monday/'{'Sound2':int(sound_value)}]

for sound_spec in sound_specs:
    getSound(sound_spec)
  

Комментарии:

1. Спасибо за ваш ответ! Я получаю ошибку имени для sound_value: ошибка имени: имя ‘sound_value’ не определено

2. не могли бы вы опубликовать весь свой код, включая код ‘firebase’?

3. Я включил изображение по ссылке выше в начале вопроса (обновленный код)

4. я только что обновил свой ответ. Значение ‘sound_value’ необходимо определить перед функцией ‘getSound ()’, чтобы функция, а также ‘sound_specs’ могли получить к нему доступ. Я также обновил код внутри функции getSound (), чтобы она также печатала «результат» из firebase.

5. Спасибо за вашу помощь! Теперь я получаю следующую ошибку: TypeError: patch() принимает не менее 4 аргументов (задано 3)