求助 最近在学 Python 被一道题难住了。。
2014-07-11 03:07:26 +08:00
O21
# -*- 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 条回复
multiple1902
2014-07-11 03:44:16 +08:00
你可以直接给出链接的:
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
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
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
2014-07-11 04:21:14 +08:00
解决了 用了 ip_s = IP.find("{}".format(ip_why))
用了format 格式化输出 就可以了
multiple1902
2014-07-11 04:29:21 +08:00
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
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
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
2014-07-11 04:52:27 +08:00
我发现他这个模块本身就是这样。。。 乱码 我怎么能把他转换过来。
Sylv
2014-07-11 05:25:20 +08:00
@
O21 输出的这个不是乱码,而是 unicode 汉字在 python 内部的存储格式,之所以会输出这个是因为你最后用 %r 对结果进行格式化了,相当于用 repr() 方法处理了输出结果转化为供解释器读取的形式,简单来说 repr() 输出的结果是给 python 看的,而 %s 才是将结果格式化为供人阅读的
ipconfiger
2014-07-11 10:31:10 +08:00
看着没有缩进的Python代码真是蛋紧啊
O21
2014-07-11 11:53:33 +08:00
@
multiple1902 ip_s = IP.find("%r" % ip_why) 这样会返回一个空的值~~囧囧IP.find( ip_why)没问题
multiple1902
2014-07-11 11:59:37 +08:00
对啊不奇怪啊,我说了 "%r" % some_string 的结果左右会有引号,IP 相关的东西我没想出跟引号有什么联系。
对了,饭要一口一口地吃。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/122065
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.