为什么我import math之后,使用sqrt还需要写math.sqrt,而abs可以直接用,加了math.abs反而报错?
3 回答
已采纳
清波
TA贡献165条经验 获得超90个赞
首先,这个猿问是我在站内消息中 主动(不要脸)要过来的,为了方便后来者查阅(骗积分)。
开题,这其实是一个命名空间的问题。但是需要看我回答的人可能都是初学者,所以我就不讲命名空间了,直接解答本题,尽量少扯别的(不可能。。)。
初学者很容易被 内置函数,模块里的方法和 某些对象(特别是内置的数据类型)的方法扰乱, 一个一个讲:
内置函数:
## abs() 就是Python 的内置函数(built-in functions),简称BIF 这样的函数有多少呢? 没数过, 用法就是直接写: print abs(-11) 11 ## 说一个调出所有内置函数的方法,可以打印出来慢慢看: for i in dir(__builtins__): print i ## 小写字母开头的都是, 可以挨个 help(xx) 学习了。 当然有一些我们熟悉的,比如说 len() zip() range() ## 题主之所以混淆,是因为这个绝对值,怎么看都是BIF 从Math 家领养过来的。。。
模块里的方法:
## 就用math 模块吧, sqrt就是 math 模块里面的一个方法(函数), 引用不同,调用方法不同: ## (1) 引用整个模块,把模块作为一个家庭,引入整个模块的意思就好比,我们聚会, math是一个家庭, ## 我们请来他们全家(感觉想骂人),这时候我们称呼math的家人(方法,如sqrt)的时候, 就会说:“math 家的sqrt” ## 对应代码如下: import math print math.sqrt(4) 2.0 ## (2) 从模块中单独引入该方法(函数), 这个就好比 我们从 math家 直接请来了 sqrt 一个人,如此,称呼他的时候 ## 就无需带着家族了,直接喊他的名字就好,代码如下: from math import sqrt print sqrt(1) 1.0 ## (3) 引用模块中的所有方法(函数),这个跟第一点引入整个模块不同,这次我们虽然也请了math全家,但是却是 ## 每一个人都下了请柬,同样称呼的时候也无需带着家族名号了,代码如下: from math import * print sqrt(1) 1.0 print log(8,2) ## math 中满眼的三角函数,恕我无能,我认为最简单的就是这个了。。 3.0 ## (4) 引入模块中的某方法并给予别名, 这就好比我们开了个假面舞会,或者cosplay大会,从math家请了一位,并且 ## 告诉他,你今晚扮演 蝙蝠侠,代码如下: from math import sqrt as kaifang print kaifang(16) ## 以我近30年的拼音功力 起的名字 >_< 。 4.0 ## (5) 引入整个模块 并赋予这个模块别名,这个跟上面那个差不多了,这次是给他们全家(文明)改名。代码如下: import math as shuxue print shuxue.sqrt(16) ## 作为英语渣,看到这句,我也想杀了我自己。。。 4.0 ## 小贴士,如果想知道某些模块含有那些方法, 首先 import xxx 然后 help(xxx) 就好了。 ## 总结,我擦 扯了这么多,算了不总结了。。。
内置数据类型的方法:
## 以字符串为例, 首先help(str) 看方法,然后我下面随便用几个。 s='abcdefc' print s.upper() ## 大写所有 'ABCDEF' print s.index('c') ## 返回 参数 所处的第一个index, 有其他参数可以调整 2 ## 查看某对象的方法: help(对象名), 内置数据类型如 help(list), tuple, set , dict, bool, int, float 等等 ## 总结,某些对象或者 内置数据类型(也是对象)的方法调用 就是 Object.method() (对象.方法名())
我 —————— 真—————— 能—————— 扯—————— !!!———————— !!!
添加回答
举报
0/150
提交
取消