内部函数

Excel VBA和Python中都提供了很多内部函数,使用它们,可以很方便地完成各种任务。

常见的内部函数

【Excel VBA】

Excel VBA中常见的内部函数主要有数学函数、日期时间函数、随机函数、数据类型转换函数和字符串处理函数等几种。这些函数在前面各章节中陆续有介绍。

表10-1中为Excel VBA提供的数学函数。

表10-1 Excel VBA提供的数学函数

函 数 说 明
Abs 求绝对值
Exp 求e为底的幂值
Sqr 求平方根,参数大于等于0
Log 求自然对数,要求参数大于0
Sng 求参数的符号,参数大于0,返回1;参数等于0,返回0;参数小于0,返回-1
Sin 求正弦值
Cos 求余弦值
Tan 求正切值
Atn 求余切值

表10-2中为Excel VBA提供的日期时间函数。

表10-2 Excel VBA提供的日期时间函数

函 数 说 明
Date 返回系统日期
Time 返回系统时间
Year 返回系统当前年份
Month 返回系统当前月份
Day 返回系统当前日期
Weekday 返回系统当前星期
Hour 返回系统的小时数,0-23
Minute 返回系统的分钟数,0-59
Second 返回系统的秒数,0-59

字符串函数请参见第6章内容。数据类型转换函数请参见第3章内容。

Excel VBA中用Rnd函数生成随机数,为了生成不重复的随机数,用Randomize函数生成随机数种子。

下面的代码随机测试一些Excel VBA函数。示例文件的存放路径为Samples\ch10\Excel VBA\内部函数.xlsm。

code.vba
Sub Test()
  Const PI = 3.1415926
  '数学函数
  Debug.Print Exp(2)
  Debug.Print Sin(PI / 4)
  '日期时间函数
  Debug.Print Date
  Debug.Print Year(Now)
  '随机数函数
  Randomize
  Debug.Print Rnd()
End Sub

运行过程,在立即窗口中输出测试函数的计算结果。

code.vba
7.38905609893065
 .707106771713121
2021/9/1
 2021
 .1633657

【Python】

Python中的内部函数包括数据类型转换函数、数据操作函数、数据输入输出函数、文件操作函数和数学计算函数等。

数据类型转换函数包括bool, int, float,complex, str, list,tuple, dict等,介绍变量的数据类型的时候都已经介绍过,不再赘述。

数据操作函数包括type, format, range, slice, len等,除slice外都介绍过。slice函数定义一个切片对象,指定切片方式。将这个切片对象作为参数传递给一个可迭代对象,实现该可迭代对象的切片。

下面创建一个列表,创建第1个切片对象取前6个元素,第2个切片对象在2-8范围内隔1个数取1个数,然后分别用这两个切片对象对列表进行切片。

code.python
>>> a=list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> slice1=slice(6)  #取前6个元素
>>> a[slice1]
[0, 1, 2, 3, 4, 5]
>>> slice2=slice(2,9,2)  #2-8范围内每隔1个数取1个数
>>> a[slice2]
[2, 4, 6, 8]

数据输入输出函数包括input和print函数等,介绍过。文件操作函数如file和open,用于打开文件。

数学计算函数如表10-3所示。

表10-3 数学计算内部函数

函 数 说 明 函 数 说 明
abs 求绝对值 round 对浮点数进行圆整
eval 计算给定表达式 sum 求和
max 求最大值 sorted 排序
min 求最小值 filter 过滤
pow 幂运算

下面举几个例子说明数学计算函数的使用。

code.python
>>> abs(-3)    #绝对值
3
>>> pow(3,2)    #求3的平方
9
>>> round(2.78)    #对2.78进行圆整
3
>>> a=list(range(-5,5))    #创建1个列表
>>> a
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
>>> max(a)    #求列表元素的最大值
4
>>> min(a)    #求列表元素的最小值
-5
>>> sum(a)    #求列表元素的和
-5
>>> sorted(a,reverse=True)    #对列表元素逆序排列
[4, 3, 2, 1, 0, -1, -2, -3, -4, -5]
>>> def filtertest(a):    #定义一个函数,过滤规则为列表中的元素值大于0
		return a>0
>>> b=filter(filtertest,a)    #用函数定义的规则对列表a进行过滤
>>> list(b)    #以列表显示过滤结果
[1, 2, 3, 4]

Python标准模块函数

Python内置有很多标准模块,每个标准模块中有很多封装好的函数,用于提供一定的功能。下面主要介绍math模块、cmath模块和random模块,它们提供数学计算、复数运算和随机数生成的功能。

一、math模块的数学函数

math模块提供大量数学函数,包括一般数学操作函数、三角函数、对数指数函数、双曲函数、数论函数和角度弧度转换函数等。

使用math模块的数学函数之前需要先导入math模块,即

code.python
>>> import math

使用dir函数,可以列出math模块提供的全部数学函数。

code.python
>>> dir(math)
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']

部分函数的说明如表10-4所示

表10-4 math模块函数

函 数 说 明 函 数 说 明
math.ceil(x) 返回大于或者等于x的最小整数 math.sqrt(x) 返回x的平方根
math.fabs(x) 返回x的绝对值 math.sin(x) 返回x的正弦值
math.floor(x) 返回小于或等于x的最大整数 math.cos(x) 返回x的余弦值
math.fsum(iter) 返回可迭代对象的元素的和 math.tan(x) 返回x的正切值
math.gcd(*ints) 返回给定整数参数的最大公约数 math.atan(x) 返回x的反正切值
math.isfinite(x) x不是无穷大或缺失值,返回True,否则False math.asin(x) 返回x的反正弦值
math.isinf(x) x是无穷大,返回True,否则False math.acos(x) 返回x的反余弦值
math.isnan(x) x是NaN,返回True,否则False math.sinh(x) 返回x的双曲正弦值
math.isqrt(n) 返回n的整数平方根(平方根向下取整),n>=0 math.cosh(x) 返回x的双曲余弦值
math.lcm(*ints) 返回给定整数参数的最小公倍数 math.tanh(x) 返回x的双曲正切值
math.trunc(x) 返回x的截尾整数 math.asinh(x) 返回x的反双曲正弦值
math.exp(x) 返回e的x次幂 math.acosh(x) 返回x的反双曲余弦值
math.log(x[,base]) 返回x的自然对数 math.atanh(x) 返回x的反双曲正切值
math.log2(x) 返回x以2为底的对数 math.dist(p,q) 返回p和q两点之间的距离
math.log10(x) 返回x以10为底的对数 math.degrees(x) x从弧度转换为角度
math.pow(x,y) 返回x的y次幂 math.radians(x) x从角度转换为弧度

二、cmath模块的复数运算函数

使用cmath模块提供的函数进行复数运算。导入cmath模块,用dir函数列出该模块的所有函数。

code.python
>>> import cmath
>>> dir(cmath)
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'cos', 'cosh', 'e', 'exp', 'inf', 'infj', 'isclose', 'isfinite', 'isinf', 'isnan', 'log', 'log10', 'nan', 'nanj', 'phase', 'pi', 'polar', 'rect', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau']

大部分函数的意义与实数运算的相同,只是参数是复数。

三、random模块的随机数函数

random模块提供各种随机数生成函数。使用该模块,首先导入random模块:

code.python
>>> import random as rd

使用random方法生成0-1之间的随机数。

code.python
>>> rd01 = rd.random()
>>> print(rd01)
0.8929443975828429

使用randrange方法从指定序列中随机选取1个数。该方法可以指定序列起点、终点和步长。下面指定序列为10到50,步长为2,然后从这个序列里面随机取1个数。

code.python
>>> print(rd.randrange(10,50,2))
26

使用循环,可以连续生成。下面连续生成10个取自该序列的随机数,并组成1个列表。

code.python
>>> lst=[]
>>> for i in range(10):
		lst.append(rd.randrange(10,50,2))
>>> lst
[14, 12, 46, 36, 40, 34, 18, 46, 22, 30]

使用uniform方法生成指定范围内满足均匀分布的随机数。下面生成10个1-2之间的满足均匀分布的随机数,组成1个列表。

code.python
>>> lst=[]
>>> for i in range(10):
		a=rd.uniform(1,2)
		lst.append(float("%0.3f"%a))
>>> lst
[1.59, 1.974, 1.589, 1.918, 1.904, 1.666, 1.418, 1.024, 1.429, 1.643]

使用choice方法可以从指定可迭代对象中随机选取1个数。下面创建一个列表,然后用choice方法从中随机选取1个数。

code.python
>>> lst = [1,2,5,6,7,8,9,10]
>>> print(rd.choice(lst))
9

使用shuffle方法将可迭代对象中的数据进行置乱,即随机排序。

code.python
>>> rd.shuffle(lst)
>>> lst
[2, 7, 5, 1, 8, 6, 10, 9]

使用sample方法从指定序列中随机选取指定大小的样本。下面从列表lst中随机取6个数组成新的样本。

code.python
>>> samp=rd.sample(lst, 6)
>>> samp
[6, 1, 5, 2, 8, 7]