繁体   English   中英

错误地打破了Python的while循环?

[英]Incorrectly breaking out of a python while loop?

我正在尝试构建一个Twitter筛选器应用程序,该应用程序可以从您选择的关键字中搜索您关注的人/ RT的个人时间轴。 (这不是问题,这是背景...我还没有做到这一点,我现在只是在玩API!)

我刚刚开始学习Python,以前是Java程序员,我想知道如何检查用户输入是否有效...输入!

我有一个编号菜单(当前只有2个菜单项),我希望用户键入1或2,如果不输入,则它会引发错误消息并循环回到输入。 我目前收到以下错误消息:

Traceback (most recent call last):
  File "Filtwer.py", line 31, in <module>
    if "1" in menuselect:
TypeError: argument of type 'int' is not iterable

第31行是下面代码块中if语句的开始。 我不确定我是否想念什么? 例如,是否没有正确打破while循环? 任何帮助将非常感激!

谢谢 :)

import twitter
api = twitter.Api(consumer_key='<redacted>',
                  consumer_secret='<redacted>',
                  access_token_key='<redacted>',
                  access_token_secret='<redacted>')

while True:
    menuselect = input("1. Tweet\n2. Get Tweets\n...: ")
    if menuselect == 1 or 2: break
    print "Please enter a valid entry!"

if "1" in menuselect:
    statusinput = raw_input("Tweet: ")
    status = api.PostUpdate(statusinput)
    print "Sucessfully tweeted!"

else:
    timeline5 = api.GetUserTimeline(user_id=<my_twitter_ID>, screen_name='<my_twitter_screenname>', count=5, include_rts='true')
    print [s.text for s in timeline5]

编辑:

使它像这样工作(包括注释,以显示我的答案与我选择的答案有何不同。感谢您的帮助!))

while True:
#try:
    menuselect = raw_input("1. Tweet\n2. Get Tweets\n...: ")
    if menuselect == "1" or menuselect == "2": break
#catch ValueError:
#   pass
#finally:
    print "Please enter a valid entry!"

if "1" == menuselect:
[...]

要检查menuselect是否为1 ,应in运算符中使用==运算符NOT。 (因为in运算符来检查成员的存在)

if 1 == menuselect:

注意:另外,出于安全考虑,不要在Python 2.x中使用input功能来获取用户输入。 改用raw_input并将结果手动转换为int ,就像这样

menuselect = int(raw_input("1. Tweet\n2. Get Tweets\n...: "))

注意2:您可能想在break条件下使用in运算符(此处正确,因为您正在检查menuselect的值是否是可能的值之一),像这样

if menuselect in (1, 2): break

因为

if menuselect == 1 or 2:

将始终评估为True ,因为其评估为(menuselect == 1) or 2 ,即使menuselect不为2部分也会使表达式评估为Truthy。

编辑:要解决异常部分,当输入字符串而不是整数时,可以使用try..except这样的

while True:
    try:
        menuselect = input("1. Tweet\n2. Get Tweets\n...: ")
        if menuselect int (1, 2): break
    catch ValueError:
        pass
    finally:
        print "Please enter a valid entry!"

您遇到的另一个问题是此行:

if menuselect == 1 or 2: break

Python将其解释为

if (menuselect == 1) or 2: break

这意味着它检查menuselect是否为1,如果为false,则检查2是否为true。 在python中,非零数字将解释为true,因此此条件将始终为true。

将此更改为

if menuselect in [1, 2]: break

或更长

if menuselect == 1 or menuselect == 2: break

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM