如何让 python 识别字符串中的正确子字符串?

我真的在为 python3 中的缓冲而苦苦挣扎。我正在尝试实现一个简单的收音机。


我有一个接收器类。它向用户显示可用的电台。这些电台是动态的,因此它们会出现和消失。


Welcome to the radio, select station you want to listen to.

> 1) Rock Station

  2) Hip Hop Station

  3) Country Station

所以接收器必须同时等待输入:来自管道(关于新站显示/消失的信息)和来自标准输入(用户可以使用向上和向下箭头来更改站)。


此外,当用户使用箭头键更改电台时,我必须一次从标准输入读取一个字符。


这就是标准select.select不起作用的原因(它等待用户按 ENTER 键):



class _GetchUnix:

    def __init__(self):

        import tty, sys


    def __call__(self):

        import sys, tty, termios

        fd = sys.stdin.fileno()

        old_settings = termios.tcgetattr(fd)

        try:

            tty.setraw(sys.stdin.fileno())

            ch = sys.stdin.read(1)

        finally:

            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)

        return ch



self.char_reader = _GetchUnix()

[...]


def __read_order_from_user(self,):

    k = self.char_reader()

    # Check for up/down arrow keys.

    if k == '\x1b':

        k = self.char_reader()

        if k != '[':

            return

        k = self.char_reader()

        if k == 'A':

            self.__arrow_down()

        if k == 'B':

            self.__arrow_up()


    # And check for enter key.

    if k == '\r':

        self.menu[self.option].handler()



def __update_stations(self,):

    [...]


def run(self):

    self.display()

    while True:

        rfds, _, _ = select.select([pipe, sys.stdin], [], [])


        if pipe in rfds:

                self.__update_stations()


        if sys.stdin in rfds:

            self.__read_order_from_user()

我在互联网上找到了如何从标准输入中逐个读取字符:Python 从用户读取单个字符 并且它确实有效,但与select.select.


慕少森
浏览 133回答 4
4回答

白板的微信

您的第一个if陈述的问题是,您评估了 、 等的真值"1","2"它们都是真的。您必须in card每次重复:def cardval(card):    if "2" in card or "3" in card or "4" in card: # etc.        return int(re.findall("\d+",card)[0])    # etc.

杨__羊羊

你应该改变:if "2" or "3" or ... in card:至:if "2" in card or "3" in card or ...:等等

浮云间

您可以执行以下操作:def cardval(card):    card_digit = re.findall("\d+",card)    if card_digit:        return card_digit[0]    elif "Ace" in card:        return 1    else:        return 10

冉冉说

作为其他答案的替代方案,您还可以执行以下操作:>>> card = ['Diamond_Ace', 'Diamonds_1', 'Diamonds_Jack']>>> if any(i.endswith(('2', '3', '4', '5', '6', '7', '8', '9', '10')) for i in card):...     print('Found it')... >>> if any(i.endswith(('Jack', 'Queen', 'King')) for i in card):...     print('Found it')... Found it>>> if any(i.endswith('Ace') for i in card):...     print('Found it')... Found it
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python