我正在尝试学习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
有人能告诉我如何将函数应用于列表中的每个字符串(字符),甚至是重复的元素和空格? 提前谢谢!
答案 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