【问题标题】:Stuck on next letter generator -- Python 3坚持下一个字母生成器——Python 3
【发布时间】:2013-02-17 15:50:27
【问题描述】:

目前,我正在网上学习一些计算机科学课程。我接到了编写一个程序的任务,该程序在有效输入后将打印字母表中的下一个字母。这是我的代码:

char = input()
ordchar = ord(char)
nextletter = ordchar + 1
nextletter = chr(nextletter)

if nextletter == ("["):
    print("A")

if nextletter == ("{"):
    print("a")

if nextletter!=("[","{"):
    print(nextletter)

现在,我确实看到了代码的问题,但我不知道如何纠正它。基本上,在代码的倒数第二行,我希望它基本上说“如果 nextletter 不等于 { 或 [ print nextletter”。

【问题讨论】:

    标签: python if-statement python-3.x chr ord


    【解决方案1】:
    if nextletter not in ["[", "{"]:
        print(nextletter)
    

    【讨论】:

    • downvoter:请解释我的答案与其他答案的错误/不同之处?什么?
    • @cIph3r:不,Ingbar 使用的是列表,而不是列表推导式。这里使用元组和列表没有太大区别。
    • @cIph3r 你说得对,在存储结果时生成器比列表理解更快并不重要,但在这种情况下,你完全糊涂了,请参阅其他回复。
    • 这很好,尽管我认为@MartijnPieters 使用not in 对字符串的回答是一种稍微 Pythonic 的方式——它也更具可读性,因为只有 2 个字符标点符号而不是 7。
    【解决方案2】:

    您根本不需要测试这些字符。在它之前的代码中,如果您在此处为nextletter 分配不同的字母,请确保nextletter 永远不会是[{

    if nextletter == "[":
        nextletter = "A"
    elif nextletter == "{":
        nextletter = 'a'
    

    如果您仍需要进行此类测试,请使用not in operator

    if nextletter not in '[{':
    

    not in 返回True 如果左侧的操作数不存在于右侧的序列中。我在示例中使用了一个包含两个字符的字符串,它算作一个序列:

    >>> '[' in '[{'
    True
    >>> '0' in '[{':
    False
    

    【讨论】:

      【解决方案3】:

      使用not in 成员运算符:

      if nextletter not in ("[","{"):
          print(nextletter)
      

      另外请注意,如果您使用if-elif 构造而不是单独的if's,则可以避免第三次测试。这样,您可以将第三部分放在 else 块中。

      【讨论】:

      • 哇,真快。谢谢,你真的帮了大忙。
      【解决方案4】:

      虽然其他答案是正确的,但正确的做法是使用elifelse

      if nextletter == ("[") :
          print("A")
      elif nextletter == ("{") :
          print("a")
      else :
          print(nextletter)
      

      【讨论】:

      • 在程序的早期版本中,我确实相差两个字符,但我忘记使用 elif。不能怪我,我才用 Python 5 天。
      • @cIph3r 因为您没有进行冗余检查:如果您到达else,那么nextletter 不能是[{
      • 好的,但运行时间将接近无法测量的速度。此外,代码更长,看起来更复杂,使代码可读性降低;)
      • @cIph3r 它不再长了,它的行数与 OP 的代码完全相同。它最大的优势不是执行速度,而是最小化错误和可维护性的机会:如果明天你决定检查? 而不是[,你只需要编辑一行,而不是两行。如果您发现使用 else if 语句会损害可读性,那么您需要阅读更多代码。
      • @cIph3r 投票最多的答案仍然需要分别处理[{ 的情况,这意味着多出四行。
      【解决方案5】:

      问题是你在问下一个字母是否不等于("[","{") 的元组。您想问它是否不等于“[”或“{”。因此,你必须问, if nextletter != "[" and nextletter != "{" 这将检查它是否既不是“[”也不是“{”。希望这会有所帮助

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 2019-05-14
      • 2019-08-06
      • 1970-01-01
      • 2022-01-12
      相关资源
      最近更新 更多