如何处理 raw_input 中的整数和字符串?

2023-12-05

仍在尝试理解Python。它与 php 有很大不同。

我将选项设置为整数,问题出在我的菜单上,我也需要使用字母。

如何一起使用整数和字符串?
为什么我不能设置为字符串而不是整数?

def main(): # Display the main menu
    while True:
        print
        print "  Draw a Shape"
        print "  ============"
        print
        print "  1 - Draw a triangle"
        print "  2 - Draw a square"
        print "  3 - Draw a rectangle"
        print "  4 - Draw a pentagon"
        print "  5 - Draw a hexagon"
        print "  6 - Draw an octagon"
        print "  7 - Draw a circle"
        print
        print "  D - Display what was drawn"
        print "  X - Exit"
        print

        choice = raw_input('  Enter your choice: ')

        if (choice == 'x') or (choice == 'X'):
            break

        elif (choice == 'd') or (choice == 'D'):
            log.show_log()

        try:
            choice = int(choice)
            if (1 <= choice <= 7):

                my_shape_num = h_m.how_many()
                if ( my_shape_num is None): 
                    continue

                # draw in the middle of screen if there is 1 shape to draw
                if (my_shape_num == 1):
                    d_s.start_point(0, 0)
                else:
                    d_s.start_point()
                #
                if choice == 1: 
                    d_s.draw_triangle(my_shape_num) 
                elif choice == 2: 
                    d_s.draw_square(my_shape_num) 
                elif choice == 3:             
                    d_s.draw_rectangle(my_shape_num) 
                elif choice == 4:             
                    d_s.draw_pentagon(my_shape_num) 
                elif choice == 5:             
                    d_s.draw_hexagon(my_shape_num) 
                elif choice == 6:             
                    d_s.draw_octagon(my_shape_num) 
                elif choice == 7: 
                    d_s.draw_circle(my_shape_num)

                d_s.t.end_fill() # shape fill color --draw_shape.py-- def start_point

            else:
                print
                print '  Number must be from 1 to 7!'
                print

        except ValueError:
            print
            print '  Try again'
            print

让我用另一个问题来回答你的问题:
真的有必要混合字母和数字吗?
它们不能都是字符串吗?

好吧,让我们长远来看一下程序在做什么:

  1. 显示主菜单
  2. Ask/receive the user input
    • 如果有效:好的
    • 如果不是:打印错误消息并重复
  3. Now we have a valid input
    • 如果是字母:执行特殊任务
    • 如果是数字:调用正确的绘图函数

Point 1.让我们为此创建一个函数:

def display_menu():
    menu_text = """\
  Draw a Shape
  ============

  1 - Draw a triangle
  2 - Draw a square
  D - Display what was drawn
  X - Exit"""
    print menu_text

display_menu非常简单,因此无需解释它的作用,但稍后我们将看到将此代码放入单独函数中的优点。

Point 2.这将通过循环完成:

options = ['1', '2', 'D', 'X']

while 1:
    choice = raw_input('  Enter your choice: ')
    if choice in options:
        break
    else:
        print 'Try Again!'

Point 3.好吧,再想一想,也许特殊任务并不是那么特别,所以让我们将它们也放入一个函数中:

def exit():
    """Exit"""  # this is a docstring we'll use it later
    return 0

def display_drawn():
    """Display what was drawn"""
    print 'display what was drawn'

def draw_triangle():
    """Draw a triangle"""
    print 'triangle'

def draw_square():
    """Draw a square"""
    print 'square'

现在让我们把它们放在一起:

def main():
    options = {'1': draw_triangle,
               '2': draw_square,
               'D': display_drawn,
               'X': exit}

    display_menu()
    while 1:
        choice = raw_input('  Enter your choice: ').upper()
        if choice in options:
            break
        else:
            print 'Try Again!'

    action = options[choice]   # here we get the right function
    action()     # here we call that function

开关的关键在于options现在不再是list but a dict,所以如果你只是像这样迭代它if choice in options你的迭代是在keys:['1', '2', 'D', 'X'],但如果你这样做options['X']你得到了退出函数(是不是太棒了!)。

现在让我们再次改进,因为维护主菜单消息和options字典不太好,一年后我可能会忘记更改一个或另一个,我不会得到我想要的东西,我很懒,我不想做两次同样的事情,等等......
那么为什么不通过options字典到display_manu然后让display_menu使用文档字符串完成所有工作__doc__生成菜单:

def display_menu(opt):
    header = """\
  Draw a Shape
  ============

"""
    menu = '\n'.join('{} - {}'.format(k,func.__doc__) for k,func in opt.items())
    print header + menu

我们需要OrderedDict代替dict for options, 因为OrderedDict顾名思义,保持其项目的顺序(看看官方文档)。所以我们有:

def main():
    options = OrderedDict((('1', draw_triangle),
                           ('2', draw_square),
                           ('D', display_drawn),
                           ('X', exit)))

    display_menu(options)
    while 1:
        choice = raw_input('  Enter your choice: ').upper()
        if choice in options:
            break
        else:
            print 'Try Again!'

    action = options[choice]
    action()

请注意,您必须设计您的操作,以便它们都具有相同的签名(无论如何它们应该是这样的,它们都是操作!)。您可能想使用可调用对象作为操作:带有以下内容的类实例__call__实施的。创建基地Action类并继承它在这里就很完美了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理 raw_input 中的整数和字符串? 的相关文章

随机推荐

  • XSL:计算以前的唯一兄弟姐妹

    好的 我想应用一个 XSL 样式表 该样式表对先前唯一的 ROLE 节点进行计数 并输出以下输出格式 name 当前节点之前的唯一 ROLE 节点的数量 我在本来应该很容易实现的事情上浪费了几个小时 我尝试以多种方式实现这一点 包括 Mue
  • 在android中加载flash文件(.swf)webview [重复]

    这个问题在这里已经有答案了 可能的重复 将 SWF 加载到 WebView 中 我有一个 swf 文件 我想将其打开到 Web 视图中 并且还想玩 Web 视图中加载的 Flash 游戏 我怎么做 我在 webview 中获取编码形式的 s
  • 弹出窗口使用滚动条

    我正在尝试创建一个使用窗口滚动条而不是 div 滚动条的弹出窗口 类似于正在播放的内容http pinterest com 如何达到这样的效果呢 我所有的尝试都不成功 滚动条出现在 div 上 窗口滚动条滚动正文内容 当你打开弹出窗口时 你
  • JSON 获取嵌套字典中的键路径

    json app Garden Flowers Red flower Rose White Flower Jasmine Yellow Flower Marigold Fruits Yellow fruit Mango Green frui
  • ReactJS 中的 prevState 是什么?

    我认为问这个问题可能很愚蠢 但相信我 我是 ReactJS 的初学者 有人可以解释一下我们为什么使用上一个状态在 Reactjs 中 我努力去理解但失败了 这是我的代码 请帮助我理解 state placeName places place
  • Java 中的 toUpperCase 不起作用[重复]

    这个问题在这里已经有答案了 我有一个字符串 String c IceCream 如果我使用toUpperCase 函数然后它返回相同的字符串 但我想得到 ICECREAM 哪里有问题 The code String c IceCream S
  • 通过 JQuery ajax.post 向 PHP 提交 JSON 数据

    我使用 POST 通过 AJAX 将数据提交到 php 文件 仅提交字符串就可以正常工作 但现在我想使用 JSON 提交 JS 对象并在 PHP 端对其进行解码 在控制台中我可以看到 我的数据已正确提交 但在 PHP 端 json deco
  • Android Studio 膨胀类 com.google.android.gms.ads.AdView 时出错

    我要疯了 我正在尝试使用 google play 服务更改 admob 但我陷入了这个错误 Caused by android view InflateException Binary XML file line 53 Error infl
  • 致命错误:调用未定义的函数 domxml_new_doc()

    当我想在 php 中使用 xml 库时 出现此错误 Fatal error Call to undefined function domxml new doc in C AppServ www direction db2xml php on
  • 我的应用程序从“平板电脑”Google Play 中消失,但仍可用于手机

    我的应用程序在 Google Play 上发布了几个月 拥有手机和平板电脑的人都可以下载它 令人惊讶的是 有时在过去两周内 Google Play 的某些内容发生了变化 我的应用程序仅适用于手机 当我使用平板电脑搜索时找不到它 知道是否有什
  • 使用 C# 强制关闭 Windows CE 5 应用程序

    如何使用 C 在 Windows CE 5 0 上强制关闭应用程序 我已经尝试过了Application Exit 但这并不总是杀死所有当前正在运行的线程 我通常会使用Environment Exit 但不幸的是 这在 CF 中不可用 这取
  • VBa 条件删除循环不起作用

    我正在电子表格上运行以下代码 Do While i lt 100000 If Not Cells i 4 String Then Cells i 4 EntireRow Delete End If i i 1 Loop 有很多条目not 字
  • 如何查看客户购买产品的次数

    在 woocommerce 中 如何检查客户在所有订单中购买产品的次数 我如何检查客户在他下的所有订单中可以购买某种产品的次数 当前客户的产品购买历史记录示例 Product one bought 5 times Product five
  • 如何从两个表中查找不相等的值

    我正在进行左连接查询 以比较两个表中 f9 和 sumoff6 列上彼此不相等的任何值 仅当 F1 列相同时 如果它们不同 我想减去它们 我得到的结果显示两个表上已有相同的值 我需要 f1 列在两个表上匹配 但如果它们在 sumoff6 和
  • sizeof(long) == sizeof(void*) 吗?

    C是否保证sizeof long sizeof void 如果不是 为什么它在 Linux 内核源代码中如此广泛地使用 我在看sizeof int sizeof void 但这谈论的是sizeof int vs sizeof void 不
  • 如何将gridview模板化的Item数据保存到DB中并生成word文档?

    我有几个位于 gridview 之外的文本框和一个模板化项目 gridview 单击位于 gridview 之外的按钮 我想将数据保存到数据库表中并生成word文档 在word文档中 数据将显示类似这样的内容 采购订单号 123 公司名称
  • 将 R 中向量的所有元素相乘

    我想要一个函数返回向量中所有值的乘积 例如sum但用乘法而不是加法 我预计它已经存在 但如果存在 我找不到它 这是我的解决方案 product lt function vec out lt 1 for i in 1 length vec o
  • 切换主显示器的简单应用程序

    我目前的电脑设置是在办公桌上放置一台 17 英寸显示器 在几英尺外放置高清电视 每隔一段时间 通常是玩游戏时 当我将主显示器切换到高清电视时 效果会更好 我运行的是 Vista 所以事情可能会变得非常痛苦 因为我必须通过几个窗口才能切换 我
  • Json和循环引用异常

    我有一个对象 它对另一个对象有循环引用 考虑到这些对象之间的关系 这是正确的设计 为了显示 Machine gt Customer gt Machine 正如预期的那样 当我尝试使用 Json 序列化机器或客户对象时 我遇到了问题 我不确定
  • 如何处理 raw_input 中的整数和字符串?

    仍在尝试理解Python 它与 php 有很大不同 我将选项设置为整数 问题出在我的菜单上 我也需要使用字母 如何一起使用整数和字符串 为什么我不能设置为字符串而不是整数 def main Display the main menu whi