V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
O21
V2EX  ›  问与答

求助 最近在学 Python 被一道题难住了。。

  •  
  •   O21 · 2014-07-11 03:07:26 +08:00 · 3726 次点击
    这是一个创建于 3799 天前的主题,其中的信息可能已经有所发展或是发生改变。
    # -*- coding: utf-8 -*-
    #第21节课练习

    def add(a,b):
    print "ADDING %d + %d"%(a,b)
    return a + b

    def subtract(a,b):
    print"SUBTRACTING %d - %d"%(a,b)
    return a - b

    def multiply(a,b):
    print "MULTIPLYING %d * %d"%(a,b)
    return a * b

    def divide(a,b):
    print "DIVIDING %d / %d"%(a,b)
    return a / b

    print "Let's do some math with just functions!"

    age = add(30,5)
    height = subtract(78,4)
    weight = multiply(90,2)
    iq = divide(100,2)

    print "Age: %d,Height:%d,Weight:%d,IQ:%d"%(age,height,weight,iq)

    #
    print "Here is a puzzle."

    what = add(age,subtract(height,multiply(weight,divide(iq,2))))


    print "That becomes:",what,"Can you do it by hand"
    ###############################################################

    上面是我练习的代码 对着写的

    现在问题来了 书上让我用 别的办法写
    what = add(age,subtract(height,multiply(weight,divide(iq,2))))

    得到同样的效果。。

    这行代码看的我尤其的晕

    我大概理解的就是
    给what 赋值 add函数

    add函数调用 age变量,跟subtract函数
    也就是 age+subtract

    而subtract也调用了 height,multiply 也就是
    height - multiply

    而 multiply 也调用了 weight变量 跟 divide函数
    那么 multiply = weight * divide

    而 divide 调用了 变量 iq 跟 2
    也就是 iq / 2

    那可不可以写成

    print_one = multiply(weight,divide(iq,2))
    print_two = subtract(height,print_one)
    print_three = add(age,print_two)

    这样写是可以运行。。不过我想问下对不对。。
    12 条回复    2014-07-11 11:59:37 +08:00
    multiple1902
        1
    multiple1902  
       2014-07-11 03:44:16 +08:00   ❤️ 1
    你可以直接给出链接的: http://learnpythonthehardway.org/book/ex21.html

    你的基本想法是对的,也就是「表达式可以用它的值去取代」,这和数学里的「表达式」的性质是一样的。具体到术语和描述,我个人觉得有点乱 —— 而这些其实是基本概念啊。比如「调用」(call)这个词特指的是运行一个函数 / 过程 / 方法,而不是用某个变量。你可以说调用 add 函数时,参数分别是 age 以及调用 subtract 函数得到的返回值。

    大概明白你写 age + subtract 或者 height - multiply 的意思,但是不要这么写,因为 subtract 和 multiply 都不是变量或者值。即使是数学上,f(x) := x 的情况下,f(3) = 3 也不能简写成 f = 3。subtract(...) 的结果依赖于它的参数(这还是纯函数的情况,不是所有的函数的值都只依赖参数的),要写就写全。
    O21
        2
    O21  
    OP
       2014-07-11 04:05:56 +08:00
    @multiple1902 你写的我大概看懂了。。第二段没太看懂 我数学不太好~~ 问下
    print_one = multiply(weight,divide(iq,2))
    print_two = subtract(height,print_one)
    print_three = add(age,print_two)

    这样写算不算奇葩啊。。我新手不知道 怎么写才对。。
    O21
        3
    O21  
    OP
       2014-07-11 04:10:06 +08:00
    我刚自己折腾一个IP查询的。。 怎么都输出不出来=,=
    我用的这个 源码 https://github.com/lxyu/17monip

    然后我按照他的格式
    >>> import IP
    >>> IP.find("www.baidu.com")
    '中国\t浙江\t杭州'

    我写的
    # -*- coding: utf-8 -*
    import IP

    ip_why = raw_input("请输入网址:\t")
    ip_s = IP.find("%r")%ip_why

    print "ip:%r"%ip_s

    然后输出############################
    Traceback (most recent call last):
    File "ip.py", line 5, in <module>
    ip_s = IP.find("%r")%ip_why
    TypeError: unsupported operand type(s) for %: 'NoneType' and 'str'
    O21
        4
    O21  
    OP
       2014-07-11 04:21:14 +08:00
    解决了 用了 ip_s = IP.find("{}".format(ip_why))

    用了format 格式化输出 就可以了
    multiple1902
        5
    multiple1902  
       2014-07-11 04:29:21 +08:00   ❤️ 1
    ip_s = IP.find(ip_why)

    这个可以吗?我没看懂这里用格式化的意义。

    这行 ip_s = IP.find("%r")%ip_why 直接的问题在于,%ip_why 应该放在小括号里面,也就是这样:

    ip_s = IP.find("%r" % ip_why)

    但这样 ip_s 的头尾会有引号。如果用 %s 那 "%s" % ip_why 应该也就是 ip_why 的值。我不懂为什么会需要这些格式化的控制。
    siteshen
        6
    siteshen  
       2014-07-11 04:38:27 +08:00
    @O21 你看看你的调用和示例的调用区别在哪里?
    IP.find("www.baidu.com") 这里函数是IP.find,参数是"www.baidu.com";
    ip_s = IP.find("%r") % ip_why 这语句大体相当于下面两条语句:
    ip_addr = IP.find("%r") # 函数是 IP.find,参数是"%r"
    ip_s = ip_addr % ip_why # % 有两种用途:1. 求模(a%b a, b均为数字);2. 格式化字符串(a%b, a为字符串, b为任意对象);

    你可以分别执行这两步,看看是哪里出错了:你的期望结果和实际结果,再去想想结果为什么不一样。
    O21
        7
    O21  
    OP
       2014-07-11 04:50:36 +08:00
    @multiple1902 你的可以。非常感谢 我感觉一下开窍了。。。 不过输出字符还是这样
    :u'\u4e2d\u56fd\t\u6d59\u6c5f\t\u676d\u5dde'

    我已经写了编码了啊 print ip_c.decode('utf-8')

    肿么还是不行。。
    O21
        8
    O21  
    OP
       2014-07-11 04:52:27 +08:00
    我发现他这个模块本身就是这样。。。 乱码 我怎么能把他转换过来。
    Sylv
        9
    Sylv  
       2014-07-11 05:25:20 +08:00 via iPhone   ❤️ 1
    @O21 输出的这个不是乱码,而是 unicode 汉字在 python 内部的存储格式,之所以会输出这个是因为你最后用 %r 对结果进行格式化了,相当于用 repr() 方法处理了输出结果转化为供解释器读取的形式,简单来说 repr() 输出的结果是给 python 看的,而 %s 才是将结果格式化为供人阅读的
    ipconfiger
        10
    ipconfiger  
       2014-07-11 10:31:10 +08:00
    看着没有缩进的Python代码真是蛋紧啊
    O21
        11
    O21  
    OP
       2014-07-11 11:53:33 +08:00
    @multiple1902 ip_s = IP.find("%r" % ip_why) 这样会返回一个空的值~~囧囧IP.find( ip_why)没问题
    multiple1902
        12
    multiple1902  
       2014-07-11 11:59:37 +08:00
    对啊不奇怪啊,我说了 "%r" % some_string 的结果左右会有引号,IP 相关的东西我没想出跟引号有什么联系。

    对了,饭要一口一口地吃。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1077 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:40 · PVG 03:40 · LAX 11:40 · JFK 14:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.