Reference: Working with External Libraries
Click me!
本节将讨论python中库的导入以及介绍部分常用的库和它们所返回的对象。
1. 导入(imports)
我们之前有学过数据类型、自定义内置函数等,但python中最美好的事情大概是它所自带的库了吧;
有一些库称为“标准库”,可以轻松调用;但有一些库必须使用
”imports“
导入;
我们来看一个例子:
import math # 导入math
print("It's math! It has type {}".format(type(math)))
输出:
It's math! It has type
解析:
math
是一个模块。模块是指所有变量的集合。
我们可以用dir()函数去查看math模块中所存在的所有变量:
>>> import math # 每次使用math前,都别忘了导入哦
>>> dir(math)
现在知道了每个模块中都含有很多变量,那么怎么调用呢?
那就是
模块名称 . 变量名
;如调用pi的值:math.pi;
>>> import math
>>> "pi to 4 significant digits = {:.4}".format(math.pi)
"pi to 4 significant digits = 3.142"
除了pi,经常用到的还有math.log(),使用格式:math.log(底数, 对数):
>>> import math
>>> math.log(8,2)
3.0
2. 其他import语法
1、有时候,可能某个模块经常需要被用到,但是有些模块名称特别长,特别难记;这时候可以给模块起个容易记的名字,
调用格式为 import 模块名称 as 自定义名称
,as 相当于给模块重命名:
>>> import math as mt # ‘mt'是自定义名称
>>> example.pi
3.141592653589793
虽然是可以重命名,但是在python中还是有一些常用的简称的,例如:
import numpy as np
import pandas as pd
2、那能不能直接把模块名字省去,也就是直接引用pi即可?答案是可以!
>>> from math import *
>>> pi
3.141592653589793
“import * ”
可以允许你直接调用模块里的变量。
但是,不能同时调用两个 ”import * “,这样会报错;
>>> from math import *
>>> from numpy import *
>>> log(8,2)
TypeError: return arrays must be of ArrayType
为啥会这样呢?
因为math和numpy库里都包含了log这个函数,但是却不同的意思;而且numpy是第二次导入的,因此numpy的log函数的结果会覆盖掉math的结果;
最好的妥协就是用啥写啥,建议不要使用 * ,因为可能会导致报错;
from math import log,pi
from numpy import asarray
3. 子模块(Submodules)
之前讲过,模块中含有很多可以引用的变量,但模块还可以引用其他模块的变量;
看个例子:
>>> import numpy
>>> "numpyrandom is a", type(numpy.random)
('numpyrandom is a', )
从上述例子可知,numpy是一个模块,而random就是numpy的子模块了;我们来看看具体是怎么用的吧:
>>> rolls = numpy.random.randint(low = 1, high = 6, size = 3) #含有3个参数,数值范围为1-6,长度为3;
array([5, 5, 1])
4. 不同的对象
例如,当你用到图形库
“matplotlib”
的时候,
“matplotlib”
会提供很多对象,如子图、表格、刻度线、批注等;而在这个过程中,需要
“pandas”
函数协助提供 DataFrame和Series。
三种工具可以帮助你理解陌生的对象:
1、type() # 这是啥?
>>> type(rolls)
numpy.ndarray
2、dir() # 这个可以怎么用
>>> dir(rolls)
>>> rolls.mean() #求平均值
3.6666666666666665
>>> rolls.tolist() #转换为list
[5, 5, 1]
3、help() # 查看更多
rolls.ravel() 可以将多维数组转换为一位数组;
4、运算符
>>> rolls + 100 # 加法运算
array([105, 105, 101])
>>> rolls < 3 #判断是否小于3
array([ False, False, True])
将数列转换为数组:
>>> a = [[1,2],[3,4]]
>>> b = numpy.asarray(a) # 转换为数组
>>> b
array([[1, 2],
[3, 4]])
>>> b[1,-1] # 获取numpy数组第二行的最后一个元素
4
>>> b[0,0] # 获取numpy数组第一行的第一个元素
1
>>> type(b)
# ndarray是指多维数据
解析:
b[0,0]这种用法仅适用于numpy数组,并不适用于list。
5. tensorflow - 用于深度学习的python库
tensorflow是一个常用于深度学习的python库;
看个例子:
import tensorflow as tf
# 创建两个常数,而且都是1
a = tf.constant(1)
b = tf.constant(1)
# 尝试把他们相加
a + b
输出:
所以并不是所有的1+1都等于2哦~
根据python中tensorflow的doc.string显示:这只是提供了一种在模块tensorflow(tf.Session)中计算这些值的方法
# 获取南美人口超过100万的行
df[(df['population'] > 10**6) & (df['continent'] == 'South America')]
为什么会这样呢?
有没有想过为什么当你调用dir()的时候,会出现双下划线的名字,如 ”_ _ doc_ _";
这其实跟操作符超载有关,python程序员如果想要定义运算符的行为时,都需要以双下划线开头和结尾的特殊名称来实现。
例如:
x in [1, 2, 3]
其实上述表达调用的列表方法是
“_
contains
_"
;完整的表述是:
[1, 2, 3]._
contains
_(x)
但是很明显完整的表述很冗长且长得很丑。。。