toozaa 发表于 2020-11-19 15:51:57

python第15讲课后作业动动手问题

想改进一下程序加入一个输入限制条件使输入只能是数字类型,但是运行之后导致运行显示两遍不知道是哪里的问题
我的代码如下:char='abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ'
q=True
while q:
    word=input('请输入转换的数字:')
    for each in word:
       if each in char:
         print('请重新输入!')
         break
       if word!='Q':
         word=int(word)   
         print('十进制 -> 十六进制 : %d -> 0x%x' %(word,word))
         print('十进制 -> 八进制 : %d -> 0o%o' %(word,word))
         print('十进制 -> 二进制 :%d->' % word,bin(word))
       else:
         q=False

运行结果如下:

sunrise085 发表于 2020-11-19 16:07:56

本帖最后由 sunrise085 于 2020-11-19 16:09 编辑

你的这个for循环目的是啥?
你输入78的时候,word是字符串‘78’
然后用for循环遍历这个字符串,当然会循环两遍啦
你若输入 65535 ,那么结果会输出5遍

而且你的这个程序不可能执行到else那里,因为若word中有字母,就break跳出了,若是只有数字则会执行if。

2012277033 发表于 2020-11-19 16:26:46

按照你完整的代码来看,应该是你搞错了缩进char='abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ'
q=True
while q:
    word=input('请输入转换的数字:')
    for each in word:
       if each in char:
         print('请重新输入!')
         break
    if word!='Q':
       word=int(word)   
       print('十进制 -> 十六进制 : %d -> 0x%x' %(word,word))
       print('十进制 -> 八进制 : %d -> 0o%o' %(word,word))
       print('十进制 -> 二进制 :%d->' % word,bin(word))
    else:
       q=False

而且你这个判断太死了,如果输入了中文和特殊符号,肯定报错的,可以改成这样q=True
while q:
    word=input('请输入转换的数字:')
    if not word.isdigit():
       print('请重新输入!')
       continue
    if word!='Q':
       word=int(word)   
       print('十进制 -> 十六进制 : %d -> 0x%x' %(word,word))
       print('十进制 -> 八进制 : %d -> 0o%o' %(word,word))
       print('十进制 -> 二进制 :%d->' % word,bin(word))
    else:
       q=False

逃兵 发表于 2020-11-19 16:28:29

运行两遍的原因是你使用了for循环,输入的内容有多少个元素就会循环多少遍
另外你的逻辑是做一个判断列表,输入的内容是在列表中时,重新输入
输入的内容不在列表时转化成整型
输入大写"Q"时终止

没有判断特殊符号等情况
做了一些修改

q=True
while q:
    word=input('请输入转换的数字:')
    if word != 'Q':
      try:
            word = int(word)
            print('十进制 -> 十六进制 : %d -> 0x%x' %(word,word))
            print('十进制 -> 八进制 : %d -> 0o%o' %(word,word))
            print('十进制 -> 二进制 :%d->' % word,bin(word))
            break

      except:
            print('请重新输入!')
    else:
      break

jackz007 发表于 2020-11-19 16:32:45

本帖最后由 jackz007 于 2020-11-19 16:36 编辑

      你不能把打印数值也纳入到 for each in word 的循环体内,怎么也得放到循环结束才能最后决断应该怎么办。
q = True
while q:
    s = input('请输入转换的数字:') . strip()
    if s . isdigit() :
      word = int(s)   
      print('十进制 -> 十六进制 : %d -> 0x%x' %(word,word))
      print('十进制 -> 八进制 : %d -> 0o%o' %(word,word))
      print('十进制 -> 二进制 :%d->' % word,bin(word))
    else:
      if s == 'Q' :
            q = False
      else:
            print('请重新输入!')

toozaa 发表于 2020-11-20 10:23:16

非常感谢大家的回复,有的问题自己看好多遍都反应不过来大家一指点就立刻明白了,非常感谢非常感谢!

孤妓与酒 发表于 2021-2-25 15:10:13

2012277033 发表于 2020-11-19 16:26
按照你完整的代码来看,应该是你搞错了缩进

而且你这个判断太死了,如果输入了中文和特殊符号,肯定报错 ...

我发现你这样修改之后Q停止就失效了
页: [1]
查看完整版本: python第15讲课后作业动动手问题