0 基础编程初学者,问个 Python 问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
pythonbeginner
V2EX    Python

0 基础编程初学者,问个 Python 问题

  •  
  •   pythonbeginner 2014 年 5 月 27 日 4866 次点击
    这是一个创建于 4318 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚看到python简明教程的 if 段

    问题如下:

    #! /usr/bin/python
    # Filename: check_type.py

    a = raw_input('pls enter something: ')

    if isinstance(a, int):

    print 'it is an integer'

    if isinstance(a, float):

    print 'it is a float'

    if isinstance(a, str):

    print 'it is a string'

    在上面这段代码中,无论输入什么内容,都会得出 it is a string 的结论(这个原因我知道,应该就是 raw_input()输出的都是string吧...),如何让它能够按照程序的意思来呢?
    34 条回复    2014-05-28 12:39:23 +08:00
    wliment
        1
    wliment  
       2014 年 5 月 27 日
    判断是否包含字母,或者用正则表达式。
    imn1
        2
    imn1  
       2014 年 5 月 27 日
    isinstance 是判断类型,不是内容判断
    input输入的就是string类型,除非你做转换,如 a = int(raw_input('pls enter something: '))
    但写了转换也没必要判断了
    66beta
        3
    66beta  
       2014 年 5 月 27 日
    没学过python,我猜测是默认是string,所以你要判断a是什么东西,就像楼上说的正则
    pythonbeginner
        4
    pythonbeginner  
    OP
       2014 年 5 月 27 日
    @imn1 类型,内容

    这两个对我似乎还有点抽象,难道不是判断“输入内容的类型”么?
    pythonbeginner
        5
    pythonbeginner  
    OP
       2014 年 5 月 27 日
    @66beta 正则我还没学到那里去,不过如果只判断是否包含字母肯定是不完整的。比如我可能输入符号,或者汉字,或者其他什么诡异的东西。
    66beta
        6
    66beta  
       2014 年 5 月 27 日
    @pythonbeginner 这个不用正则还真想不到,总不能一个个字符判断吧
    vob636
        7
    vob636  
       2014 年 5 月 27 日   1
    搞什么input……直接变量赋值,目的是测试类型,你非搞一些没有关系的其他的东西……初学者就容易这样,学什么就关注一点,你应该明白你不知道的多了……没必要一开始就铺张开
    Sylv
        8
    Sylv  
       2014 年 5 月 27 日
    a = raw_input('pls enter something: ')
    try:
    -> int(a)
    -> print 'it is an integer'
    except:
    -> try:
    -> -> float(a)
    -> -> print 'it is a float'
    -> except:
    -> -> print 'it is a string'
    mulog
        9
    mulog  
       2014 年 5 月 27 日
    这样行不。。虽然有点蛋疼

    >>> def test(a):
    ... try:
    ... try:
    ... b = int(a)
    ... print("int")
    ... except ValueError:
    ... b = float(a)
    ... print("float")
    ... except ValueError:
    ... print "string"
    pythonbeginner
        10/span>
    pythonbeginner  
    OP
       2014 年 5 月 27 日
    @vob636 其实目的是为了给自己出题。因为我原本给自己出的题是这个样子的:

    #! /usr/bin/python
    # Filename: check_type.py

    a = raw_input('pls enter something: ')
    running = True

    while running:

    if isinstance(a, str):

    print "You entered a string, pls try again."

    running = False


    if isinstance(a, int):

    print a + 1

    if isinstance(a, float):

    print a - 1
    pythonbeginner
        11
    pythonbeginner  
    OP
       2014 年 5 月 27 日
    @Sylv 功能实现了。

    其中的 int(),float(),是让程序自己尝试能不能成功将输入的值转换称 int 或 float 且不报错的对么?
    jiang42
        12
    jiang42  
       2014 年 5 月 27 日   1
    @pythonbeginner
    多看看str的库
    isdigit
    isnumeric
    isdecimal
    imn1
        13
    imn1  
       2014 年 5 月 27 日
    @pythonbeginner
    isinstance('1', int)
    false
    isinstance('1', str)
    true
    isinstance(1, int)
    true
    isinstance('1.1', float)
    false
    isinstance('1.1', str)
    true
    isinstance(1.1, float)
    true

    isinstance 判断的是type,你可能要看看手册关于类型的部分
    input 输入的都是相当于带引号的,就是都是字串类型,无论输入什么内容
    我感觉你是从php转过来的?
    wenLiangcan
        14
    wenLiangcan  
       2014 年 5 月 27 日   1
    raw_input 这个函数的返回值只会是字符串
    alexkh
        15
    alexkh  
       2014 年 5 月 27 日
    把a = raw_input('pls enter something: ')
    改为
    a = input('pls enter something: ')
    即可。

    官方文档中对于input()的描述是:等同于eval(raw_input(prompt)),通常情况下都使用raw_input()。
    也就是说input()其实也是通过raw_input()来实现的。
    guoqiao
        16
    guoqiao  
       2014 年 5 月 27 日   1
    窃以为这个例子很烂,给人造成毫无意义的迷惑.
    vob636
        17
    vob636  
       2014 年 5 月 27 日
    @pythonbeginner 一般的话……
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    __author__ = 'florije'

    if __name__ == '__main__':
    running = True
    while running:
    var = raw_input('pls enter something: ')
    # todo deeply setting something
    try:
    result = int(var)
    running = False
    result += 1
    print result
    except Exception:
    try:
    result = float(var)
    running = False
    result -= 1
    print result
    except Exception:
    print "neither int or float"
    if isinstance(var, str):
    print "You entered a string, pls try again."
    else:
    print "Are you joking?"
    lu18887
        18
    lu18887  
       2014 年 5 月 27 日
    总结来说,两种方式,主动判断
    @wliment 说的正则表达式!
    被动判断(通过类型转换失败抛出异常)如
    @mulog 所说。
    我推荐第一种方式,第二种不是很靠谱,比如可以把float强制转换成 int却不抛出异常等等,这种行为依赖于语言的实现太多。 正则表达式又要小小的学习一下了!
    http://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
    http://baike.baidu.com/view/94238.htm
    正则表达式还分标准正则表达式和跟特定语言相关的正则表达式的,不过基本大同小异。你可以GOOGLE一下 PYTHON 正则表达式
    顺便推荐一个正则表达式校验工具 REGEX BUDDY
    pythonbeginner
        19
    pythonbeginner  
    OP
       2014 年 5 月 27 日
    @imn1

    1、你这样也是不行的,输入字符串会报错
    2、我是0基础学习,什么程序都不懂。
    pythonbeginner
        20
    pythonbeginner  
    OP
       2014 年 5 月 27 日
    sorry,刚才 @ 错了,第一句应该回复 @alexkh
    ffffwh
        21
    ffffwh  
       2014 年 5 月 27 日
    这里改用input()而不是raw_input()吧。
    rrfeng
        22
    rrfeng  
       2014 年 5 月 27 日
    raw_input 永远是 str

    input 才会『动态』识别输入类型
    pythonbeginner
        23
    pythonbeginner  
    OP
       2014 年 5 月 27 日
    @ffffwh
    @rrfeng

    但是用 input 之后,如果我输入字母(string),程序会报错。

    @jiang42

    隐约感到这个好点,但没用成功。
    rrfeng
        24
    rrfeng  
       2014 年 5 月 27 日
    @pythonbeginner

    input() 输入 string 需要 ‘str’
    ffffwh
        25
    ffffwh  
       2014 年 5 月 27 日
    用input()的话string要加引号。。
    你知道怎么回事就行了,,,不用太纠结
    rrfeng
        26
    rrfeng  
       2014 年 5 月 27 日
    @pythonbeginner
    Google python input 和 raw_input
    leiz
        27
    leiz  
       2014 年 5 月 27 日
    @jiang42 这位已经把问题说得很清楚了

    LZ混淆了两个概念,类型和字符语义。
    你的出发点是希望通过程序来判别字符本身的涵义来推导类型,但是程序里用的是直接判断类型的处理方式。
    直接用@jiang42说的几个方法就能解决问题。
    imn1
        28
    imn1  
       2014 年 5 月 27 日
    @pythonbeginner 我知道你是0基础,不需要一直强调这点,0基础应该先看变量和数据类型而不是先看if语句怎么写
    pythonbeginner
        29
    pythonbeginner  
    OP
       2014 年 5 月 27 日
    @leiz

    "你的出发点是希望通过程序来判别字符本身的涵义来推导类型,但是程序里用的是直接判断类型的处理方式。"

    好抽象。我问的问题其实很简单,就是我知道我的代码有错,我只想知道怎么能够让我的代码正确(能够按照我想要的结果运行)。

    你说的我“望通过程序来判别字符本身的涵义来推导类型”,这个我完全不理解,"字符"本身应该就是没有任何涵义的吧?

    我确实是0基础学习,什么php、c神马的都是一丁点都不会,决定自学python,是因为看到很多人说 python 确实是一种很适合程序入门的语言。我目前能够理解的也不过是 if、print 等这类极度简单的。因此,@jang42 所说的库,我还没懂。反正我像下面这样写是不对的:

    #! /usr/bin/python
    # Filename: check_type.py

    a = raw_input('pls enter something: ')

    if a.isnumeric():

    ->print 'it is a numeric'

    if a.isdecimal():

    ->print 'it is a decimal'

    if a.isdigit():

    ->print 'it is a digit'
    ~
    creamiced
        30
    creamiced  
       2014 年 5 月 27 日
    @pythonbeginner 就是说无论你输入什么(例如“我是字符串”,“123456”,“abcdef”,等等)系统都是把这些内容当做string类型存起来,与内容无关。这个例子不能多想,你不如想想这样的(功能不同但是思想类似)问题:
    输入一个字符串到a,判断输出这个字符串的长度。结构是类似的,都是对于字符串内容的判断,但至少不会把不同的变量类型混杂进去。你提到的例子里虽然有int,float等等,但是涉及到的变量类型只有string。
    我建议你现在暂时跳过这个问题,或者再理解理解变量类型的知识。
    kqz901002
        31
    kqz901002  
       2014 年 5 月 27 日
    @pythonbeginner int()类似C的强制类型转换
    scola
        32
    scola  
       2014 年 5 月 27 日 via Android
    同意楼上说的,不清楚问题时建议拆分开,先不用raw_input,直接赋值变量测试,自然知道问题在哪里了
    pythonbeginner
        33
    pythonbeginner  
    OP
       2014 年 5 月 27 日
    @creamiced 谢谢,其实我能够理解只要通过raw_input()输入的内容都是 string 类型的,且我也知道它与内容无关,这我在主贴中已经说过了。

    发这个帖子的目的,是想看看“如果我就是要做这样一道题”,它有什么方案。当然,@sylv 已经给出了正确答案(虽然必然不是唯一答案),由于我现在还没学到 "try" 和 "except" 语句,尚不能理解他这段程序,但它的这段代码确实让我解决了"如果我就是要做这样一道题"的问题。我现在确实决定跳过这个问题。

    谢谢大家,结贴。
    kfll
        34
    kfll  
       2014 年 5 月 28 日
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1033 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 22:37 PVG 06:37 LAX 15:37 JFK 18:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86