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。
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
运行过程,在立即窗口中输出测试函数的计算结果。
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个数,然后分别用这两个切片对象对列表进行切片。
>>> 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 | 幂运算 |
下面举几个例子说明数学计算函数的使用。
>>> 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模块,即
>>> import math
使用dir函数,可以列出math模块提供的全部数学函数。
>>> 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函数列出该模块的所有函数。
>>> 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模块:
>>> import random as rd
使用random方法生成0-1之间的随机数。
>>> rd01 = rd.random()
>>> print(rd01)
0.8929443975828429
使用randrange方法从指定序列中随机选取1个数。该方法可以指定序列起点、终点和步长。下面指定序列为10到50,步长为2,然后从这个序列里面随机取1个数。
>>> print(rd.randrange(10,50,2))
26
使用循环,可以连续生成。下面连续生成10个取自该序列的随机数,并组成1个列表。
>>> 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个列表。
>>> 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个数。
>>> lst = [1,2,5,6,7,8,9,10]
>>> print(rd.choice(lst))
9
使用shuffle方法将可迭代对象中的数据进行置乱,即随机排序。
>>> rd.shuffle(lst)
>>> lst
[2, 7, 5, 1, 8, 6, 10, 9]
使用sample方法从指定序列中随机选取指定大小的样本。下面从列表lst中随机取6个数组成新的样本。
>>> samp=rd.sample(lst, 6)
>>> samp
[6, 1, 5, 2, 8, 7]