将函数应用于列表的每个元素

时间:2016-02-22 17:37:38

标签: list python-3.x

我正在尝试学习Python在raspberry Pi中做一些项目,所以我对所有编码工作仍然很陌生。我想将函数应用于字符串中的每个字母,包括空格和重复字母。我首先将它转换为列表,然后将其更改为使用此处其中一个答案的提示,但到目前为止,似乎对于同一列表中的两个相等元素,该函数仅应用于其中一个。 在这种情况下,例如,输出上只有一个L和一个O,没有空格(空间应该输出0.7s的暂停)。 这是我正在尝试编写的非常简单的程序的确切代码,基于monkmakes.com项目之一。基本上,我们的想法是通过点亮连接到Raspberry Pi的LED将字符串转换为莫尔斯电码。到目前为止,它仅用于处理消息" Hello World":

import RPi.GPIO as GPIO
import time
import itertools

#define basic blink styles for morse
#length of a dot is one unit
#length of a dash is three units
def fast_blink():
    # Configure the Pi to use the BCM (Broadcom) pin names, rather than the pin positions
    GPIO.setmode(GPIO.BCM)

    red_pin = 18

    GPIO.setup(red_pin, GPIO.OUT)
    GPIO.output(red_pin, True)  # LED on
    time.sleep(0.1)             # delay 0.1 seconds
    GPIO.output(red_pin, False) # LED off
    time.sleep(0.1)             # delay 0.1 seconds
def slow_blink():
    # Configure the Pi to use the BCM (Broadcom) pin names, rather than the pin positions
    GPIO.setmode(GPIO.BCM)

    red_pin = 18

    GPIO.setup(red_pin, GPIO.OUT)
    GPIO.output(red_pin, True)  # LED on
    time.sleep(0.3)             # delay 0.1 seconds
    GPIO.output(red_pin, False) # LED off
    time.sleep(0.1)             # delay 0.1 seconds

#Morse Code Letter Blink Funcions
#Define fast_blink and slow_blink repetitions
#The space between parts of the same letter is one unit
#The space between letters is three units

#define H code
def morse_H():
    print("H")
    for _ in itertools.repeat(None, 4):
        fast_blink()
    time.sleep(0.3)
#define E code
def morse_E():
    print("E")
    for _ in itertools.repeat(None, 1):
        fast_blink()
    time.sleep(0.3)
#define L code
def morse_L():
    print("L")
    for _ in itertools.repeat(None, 1):
        fast_blink()
    time.sleep(0.1)
    for _ in itertools.repeat(None, 1):
        slow_blink()
    time.sleep(0.1)
    for _ in itertools.repeat(None, 2):
        fast_blink()
    time.sleep(0.3)
#define O code
def morse_O():
    print("O")
    for _ in itertools.repeat(None, 3):
        slow_blink()
    time.sleep(0.3)
#define W code
def morse_W():
    print("W")
    for _ in itertools.repeat(None, 1):
        fast_blink()
    time.sleep(0.1)
    for _ in itertools.repeat(None, 2):
        slow_blink()
    time.sleep(0.3)
#define R code
def morse_R():
    print("R")
    for _ in itertools.repeat(None, 1):
        fast_blink()
    time.sleep(0.1)
    for _ in itertools.repeat(None, 1):
        slow_blink()
    time.sleep(0.1)
    for _ in itertools.repeat(None, 1):
        fast_blink()
    time.sleep(0.3)
#define D code
def morse_D():
    print("D")
    for _ in itertools.repeat(None, 1):
        slow_blink()
    time.sleep(0.1)
    for _ in itertools.repeat(None, 2):
        fast_blink()
    time.sleep(0.3)

#MESSAGE INPUT
message = input("Type your message \n")
print("Translating {} to morse, look at the LED" .format(message))
len_message = len(message)
print("Message is {} characters long." .format(len_message))

#MESSAGE TRANSLATION
#Create translation function
def m_translate(char):
    if "H" or "h":
        morse_H()
    else:
        pass
    if "E" or "e":
        morse_E()
    else:
        pass
    if "L" or "l":
        morse_L()
    else:
        pass
    if "O" or "o":
        morse_O()
    else:
        pass
    if "W" or "w":
        morse_W()
    else:
        pass
    if "R" or "r":
        morse_R()
    else:
        pass
    if "D" or "d":
        morse_D()
    else:
        pass
    if " ":
        print("\n")
        time.sleep(0.7)
    else:
        pass

#MESSAGE OUTPUT
#Execute in endless loop
try:
    while True:
        for _ in itertools.repeat(None):
           message_list = list(map(m_translate, message))
           print ("\n" * 100)
except KeyboardInterrupt:
        print("Transmission ended.")
        GPIO.cleanup()
        quit

有人能告诉我如何将函数应用于列表中的每个字符串(字符),甚至是重复的元素和空格? 提前谢谢!

2 个答案:

答案 0 :(得分:0)

你可以使用地图功能:

list_name = list(map(function_name, iterable_variable))

其中' list_name'是保存结果的变量,' function_name'是您希望应用于列表中所有元素的函数,以及“iterable_variable”#。是可以循环的任何变量,例如列表或字符串。您甚至可以跳过将字符串转换为列表,因为这也是如此。

答案 1 :(得分:0)

我得到了一位朋友的帮助,他调整了代码,将方法条件重新排列到Elif,并用其他东西替换“char”作为迭代。显然“char”引起了问题。最后的循环也被清理干净了。这是最终的工作代码:

import RPi.GPIO as GPIO
import time
import itertools

#define basic blink styles for morse
#length of a dot is one unit
#length of a dash is three units
def fast_blink():
    # Configure the Pi to use the BCM (Broadcom) pin names, rather than the pin positions
    GPIO.setmode(GPIO.BCM)

    red_pin = 18

    GPIO.setup(red_pin, GPIO.OUT)
    GPIO.output(red_pin, True)  # LED on
    time.sleep(0.1)             # delay 0.1 seconds
    GPIO.output(red_pin, False) # LED off
    time.sleep(0.1)             # delay 0.1 seconds
def slow_blink():
    # Configure the Pi to use the BCM (Broadcom) pin names, rather than the pin positions
    GPIO.setmode(GPIO.BCM)

    red_pin = 18

    GPIO.setup(red_pin, GPIO.OUT)
    GPIO.output(red_pin, True)  # LED on
    time.sleep(0.3)             # delay 0.1 seconds
    GPIO.output(red_pin, False) # LED off
    time.sleep(0.1)             # delay 0.1 seconds

#Morse Code Letter Blink Funcions
#Define fast_blink and slow_blink repetitions
#The space between parts of the same letter is one unit
#The space between letters is three units

#define H code
def morse_H():
    print("H")
    for _ in itertools.repeat(None, 4):
        fast_blink()
    time.sleep(0.3)
#define E code
def morse_E():
    print("E")
    for _ in itertools.repeat(None, 1):
        fast_blink()
    time.sleep(0.3)
#define L code
def morse_L():
    print("L")
    for _ in itertools.repeat(None, 1):
        fast_blink()
    time.sleep(0.1)
    for _ in itertools.repeat(None, 1):
        slow_blink()
    time.sleep(0.1)
    for _ in itertools.repeat(None, 2):
        fast_blink()
    time.sleep(0.3)
#define O code
def morse_O():
    print("O")
    for _ in itertools.repeat(None, 3):
        slow_blink()
    time.sleep(0.3)
#define W code
def morse_W():
    print("W")
    for _ in itertools.repeat(None, 1):
        fast_blink()
    time.sleep(0.1)
    for _ in itertools.repeat(None, 2):
        slow_blink()
    time.sleep(0.3)
#define R code
def morse_R():
    print("R")
    for _ in itertools.repeat(None, 1):
        fast_blink()
    time.sleep(0.1)
    for _ in itertools.repeat(None, 1):
        slow_blink()
    time.sleep(0.1)
    for _ in itertools.repeat(None, 1):
        fast_blink()
    time.sleep(0.3)
#define D code
def morse_D():
    print("D")
    for _ in itertools.repeat(None, 1):
        slow_blink()
    time.sleep(0.1)
    for _ in itertools.repeat(None, 2):
        fast_blink()
    time.sleep(0.3)

#MESSAGE INPUT
message = input("Type your message \n")
message = message.upper()
print("Translating {} to morse, look at the LED" .format(message))
len_message = len(message)
print("Message is {} characters long." .format(len_message))

#MESSAGE TRANSLATION
#Create translation function
def m_translate(letter):
    if letter == "H":
        morse_H()
    elif letter == "E":
        morse_E()
    elif letter == "L":
        morse_L()
    elif letter == "O":
        morse_O()
    elif letter == "W":
        morse_W()
    elif letter == "R":
        morse_R()
    elif letter == "D":
        morse_D()
    elif letter == " ":
        print("\n")
        time.sleep(0.7)
    else:
        pass

#MESSAGE OUTPUT
#Execute in endless loop
try:
    while True:
        for letter in message:
           m_translate(letter)
        print ("\n" * 100)
except KeyboardInterrupt:
        print("Transmission ended.")
        GPIO.cleanup()
        quit