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-05-27 14:34:33 +08:00 · 4400 次点击
    这是一个创建于 3837 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚看到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-05-27 14:56:55 +08:00
    判断是否包含字母,或者用正则表达式。
    imn1
        2
    imn1  
       2014-05-27 15:08:28 +08:00
    isinstance 是判断类型,不是内容判断
    input输入的就是string类型,除非你做转换,如 a = int(raw_input('pls enter something: '))
    但写了转换也没必要判断了
    66beta
        3
    66beta  
       2014-05-27 15:09:08 +08:00
    没学过python,我猜测是默认是string,所以你要判断a是什么东西,就像楼上说的正则
    pythonbeginner
        4
    pythonbeginner  
    OP
       2014-05-27 15:10:08 +08:00
    @imn1 类型,内容

    这两个对我似乎还有点抽象,难道不是判断“输入内容的类型”么?
    pythonbeginner
        5
    pythonbeginner  
    OP
       2014-05-27 15:11:40 +08:00
    @66beta 正则我还没学到那里去,不过如果只判断是否包含字母肯定是不完整的。比如我可能输入符号,或者汉字,或者其他什么诡异的东西。
    66beta
        6
    66beta  
       2014-05-27 15:15:04 +08:00
    @pythonbeginner 这个不用正则还真想不到,总不能一个个字符判断吧
    vob636
        7
    vob636  
       2014-05-27 15:29:13 +08:00   ❤️ 1
    搞什么input……直接变量赋值,目的是测试类型,你非搞一些没有关系的其他的东西……初学者就容易这样,学什么就关注一点,你应该明白你不知道的多了……没必要一开始就铺张开
    Sylv
        8
    Sylv  
       2014-05-27 15:31:37 +08:00
    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-05-27 15:31:47 +08:00
    这样行不。。虽然有点蛋疼

    >>> def test(a):
    ... try:
    ... try:
    ... b = int(a)
    ... print("int")
    ... except ValueError:
    ... b = float(a)
    ... print("float")
    ... except ValueError:
    ... print "string"
    pythonbeginner
        10
    pythonbeginner  
    OP
       2014-05-27 15:38:38 +08:00
    @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-05-27 15:46:31 +08:00
    @Sylv 功能实现了。

    其中的 int(),float(),是让程序自己尝试能不能成功将输入的值转换称 int 或 float 且不报错的对么?
    jiang42
        12
    jiang42  
       2014-05-27 15:51:37 +08:00   ❤️ 1
    @pythonbeginner
    多看看str的库
    isdigit
    isnumeric
    isdecimal
    imn1
        13
    imn1  
       2014-05-27 15:54:48 +08:00
    @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-05-27 15:55:07 +08:00   ❤️ 1
    raw_input 这个函数的返回值只会是字符串
    alexkh
        15
    alexkh  
       2014-05-27 16:02:30 +08:00
    把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-05-27 16:06:11 +08:00   ❤️ 1
    窃以为这个例子很烂,给人造成毫无意义的迷惑.
    vob636
        17
    vob636  
       2014-05-27 17:08:35 +08:00
    @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-05-27 17:30:56 +08:00
    总结来说,两种方式,主动判断
    @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-05-27 17:37:37 +08:00
    @imn1

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

    input 才会『动态』识别输入类型
    pythonbeginner
        23
    pythonbeginner  
    OP
       2014-05-27 17:48:01 +08:00
    @ffffwh
    @rrfeng

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

    @jiang42

    隐约感到这个好点,但没用成功。
    rrfeng
        24
    rrfeng  
       2014-05-27 17:56:02 +08:00
    @pythonbeginner

    input() 输入 string 需要 ‘str’
    ffffwh
        25
    ffffwh  
       2014-05-27 17:56:09 +08:00
    用input()的话string要加引号。。
    你知道怎么回事就行了,,,不用太纠结
    rrfeng
        26
    rrfeng  
       2014-05-27 17:56:22 +08:00
    @pythonbeginner
    Google python input 和 raw_input
    leiz
        27
    leiz  
       2014-05-27 18:18:38 +08:00
    @jiang42 这位已经把问题说得很清楚了

    LZ混淆了两个概念,类型和字符语义。
    你的出发点是希望通过程序来判别字符本身的涵义来推导类型,但是程序里用的是直接判断类型的处理方式。
    直接用@jiang42说的几个方法就能解决问题。
    imn1
        28
    imn1  
       2014-05-27 18:33:32 +08:00
    @pythonbeginner 我知道你是0基础,不需要一直强调这点,0基础应该先看变量和数据类型而不是先看if语句怎么写
    pythonbeginner
        29
    pythonbeginner  
    OP
       2014-05-27 18:34:07 +08:00
    @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-05-27 19:58:44 +08:00
    @pythonbeginner 就是说无论你输入什么(例如“我是字符串”,“123456”,“abcdef”,等等)系统都是把这些内容当做string类型存起来,与内容无关。这个例子不能多想,你不如想想这样的(功能不同但是思想类似)问题:
    输入一个字符串到a,判断输出这个字符串的长度。结构是类似的,都是对于字符串内容的判断,但至少不会把不同的变量类型混杂进去。你提到的例子里虽然有int,float等等,但是涉及到的变量类型只有string。
    我建议你现在暂时跳过这个问题,或者再理解理解变量类型的知识。
    kqz901002
        31
    kqz901002  
       2014-05-27 20:07:49 +08:00
    @pythonbeginner int()类似C的强制类型转换
    scola
        32
    scola  
       2014-05-27 20:33:42 +08:00 via Android
    同意楼上说的,不清楚问题时建议拆分开,先不用raw_input,直接赋值变量测试,自然知道问题在哪里了
    pythonbeginner
        33
    pythonbeginner  
    OP
       2014-05-27 20:48:25 +08:00
    @creamiced 谢谢,其实我能够理解只要通过raw_input()输入的内容都是 string 类型的,且我也知道它与内容无关,这我在主贴中已经说过了。

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

    谢谢大家,结贴。
    kfll
        34
    kfll  
       2014-05-28 12:39:23 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3184 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 13:07 · PVG 21:07 · LAX 05:07 · JFK 08:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.