循环时错误地打破了python?

时间:2014-02-14 03:18:01

标签: 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:
[...]

2 个答案:

答案 0 :(得分:3)

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

if 1 == menuselect:

注意:另外,不要在Python 2.x中使用input函数来获取用户的输入(出于安全考虑)。请改用raw_input并手动将结果转换为int,如此

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

注2:您可能希望在in条件下使用break运算符(这里是正确的,因为您正在检查{{1}的值是否正确}是可能的值之一),像这样

menuselect

因为

if menuselect in (1, 2): break

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

编辑要绕过异常部分,当输入字符串而不是整数时,您可以像这样使用2

try..except

答案 1 :(得分:1)

你遇到的另一个问题是:

if menuselect == 1 or 2: break

Python将其解释为

if (menuselect == 1) or 2: break

表示检查menuselect是否为1,如果为false,则检查2是否为真。在python中,非零数字被解释为true,因此这种情况将始终为真。

将此更改为

if menuselect in [1, 2]: break

或更长的

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