青少年Python编程系列30:Python常用内置标准库入门

上节课我们讲了Python中的内置函数。除了内置函数外,还有很多非常有用的函数都放在一些内置标准库中,我们需要引入这些库后才可以使用,这里我们挑一些非常常用的内置库给大家讲解。我们正式进入这节课的内容吧。

一、math库

从math库的名字,我们就可以看出来这里面的函数都是跟数学计算相关的函数。很多时候我们做一些计算的时候需要引入math库。考虑到部分函数超出小学和初中阶段知识的范围,我这里做一些简单的讲解。

1.1 math库中的常量

在math库中定义了几个数学上的常量,分别是math.pi、math.e、math.inf、math.nan。我们分别介绍一下这几个常量。

math.pi就是圆周率,数学上写作π,在数学课上老师让大家记忆π≈3.14,在Python中它的精度高一些,取值为3.141592653589793

>>> import math
>>> math.pi
3.141592653589793

math.e是自然对数,对数的概念在高中数学上会讲到,这里做一个了解。在数学上写作e,e≈2.718。在Python中取值为2.718281828459045

>>> import math
>>> math.e
2.718281828459045

math.inf是无穷大,无穷大的概念在大学高等数学里面会讲到,数学上写做∞,它不是一个我们正常看到的数字。math.nan代表非合法浮点数,也是一个抽象的数。这两个常量仅仅做一个了解,它们的类型都是浮点数。

>>> import math
>>> math.inf
inf
>>> type(math.inf)
<class 'float'>
>>> math.nan
nan
>>> type(math.nan)
<class 'float'>

1.2 floor()函数和ceil()函数

floor()函数和ceil()函数分别对应我们数学上学到的取近似值的“去尾法”和“进一法”,参数为一个浮点数,返回值为一个整数。

>>> import math
>>> math.floor(3.8)
3
>>> math.floor(3.2)
3
>>> math.ceil(3.8)
4
>>> math.ceil(3.2)
4

在解决实际问题时,我们经常需要用到“去尾法”和“进一法”。比如说船的荷载重量÷体重=限载人数,我们需要去尾;水果数量÷每筐放的水果数量=需要筐子的数量,我们需要进一。

1.3 sqrt()函数

sqrt()函数可以计算一个数的平方根,平方根是初中数学的知识。如果小学阶段接触到这个知识,可以理解为已知一个正方形的面积,求正方形的边长。比如,面积为9㎡的正方形,边长是3m;面积为3㎡的正方形,边长≈1.732m。

我们看具体的使用:

>>> import math
>>> math.sqrt(4)
2.0
>>> math.sqrt(2)
1.4142135623730951

1.4 radians()函数和degrees()函数

了解这两个函数之前,我们先要了解一下弧度的概念。在小学和初中阶段,一个角的大小我们都是使用角度表示的。一周是360°,一条直线是180°,直角是90°……角的大小还有另一种单位,叫做弧度。在弧度制中,一周是2π,一条直线是π,直角是π/2。radians()函数时将角度转换为弧度、degrees()函数是将弧度转换为角度。

我们看具体的使用:

>>> import math
>>> math.radians(90)
1.5707963267948966
>>> math.radians(180)
3.141592653589793
>>> math.degrees(math.pi)
180.0
>>> math.degrees(math.pi / 2)
90.0

1.5 sin()函数、cos()函数和tan()函数

这三个函数分别叫正弦、余弦、正切,都是三角函数。初中的同学在数学课可能已经学过这个函数,没学过的不要紧,这里做一个简单的介绍。

一个直角三角形,一个角的大小相同的情况下,三条边之间的比值也是固定的。与角相对的直角边称为对边、与角相邻的直角边称为邻边、与直角相对的边称为斜边

sin() - 正弦:对边与斜边长度的比值

cos() - 余弦:邻边与斜边长度的比值

tan() - 正切:对边与邻边长度的比值


这三个函数的使用非常简单,但是要注意,参数是角的弧度值,不是角度值。 如果我们知道的是角度,还要使用radians()函数做转换。

>>> import math
>>> math.sin(math.radians(30))
0.49999999999999994
>>> math.cos(math.radians(30))
0.8660254037844387
>>> math.tan(math.radians(30))
0.5773502691896257

这三个函数在有数学基础,并且熟练掌握turtle画图的情况下,可以画出很多复杂漂亮的图形。

math库中除了以上函数外,还有pow()函数与内置函数pow()完全相同,fabs()函数可以计算绝对值,与内置函数abs()的区别在于math库中的fabs()的返回值永远为浮点数。其他关于求阶乘、最小公约数、最大公倍数等等函数使用较少这里不做讲解了,有兴趣的同学可以自己查看官方文档。还有求对数、自然对数等等超出初中阶段数学知识太多,这里也不做讲解了。

二、random库

random库是一个用于生成随机数的内置库,当我们程序中需要使用到随机取一个数的值的时候,我们就需要用到这个库。随机数有很多种不同的取法,分别使用不同的函数来实现。这里面我们来做一个介绍。

2.1 random()函数

random()函数可以生成一个0.0到1.0之间的随机小数。我们看一下它的使用:

>>> import random as r
>>> r.random()
0.6433657372034377
>>> r.random()
0.9585189984282626

每次使用得到的随机数都不一样。

2.2 randint()函数

randint()函数可以生成一个区间在a和b两个数之间的随机整数。函数需要给两个参数,开始值和结束值。随机数的取值范围包含开始值和结束值。我们看它的使用方法:

>>> import random as r
>>> r.randint(1, 10)
5
>>> r.randint(1, 10)
5
>>> r.randint(1, 10)
4
>>> r.randint(1, 10)
7

2.3 randrange()函数

randrange()函数可以在a和b之间以一定步长取随机整数。函数必须给两个参数,起始值和结束值,第三个参数步长为可选参数,默认值为1。随机数的取值范围包含开始值不包含结束值。我们看它的用法:

>>> import random
>>> random.randrange(0, 100, 10)
20
>>> random.randrange(0, 100, 10)
70
>>> random.randrange(0, 100, 10)
40

2.4 uniform()函数

uniform()函数可以生成在区间a和b之间的随机浮点数。函数需要给定两个参数,起始值和结束值。随机数的取值范围包含开始值和结束值。我们看它的使用方法:

>>> import random
>>> random.uniform(1, 100)
63.29831379003603
>>> random.uniform(1, 100)
47.44958448512939
>>> random.uniform(1, 100)
49.63903419250868

2.5 choice()函数

choice()函数可以从序列中随机选取元素。函数的参数为一个可迭代对象。我们看它的用法:

>>> import random
>>> a = [2, 3, 4, 5, 6, 7, 8]
>>> random.choice(a)
2
>>> random.choice(a)
7
>>> random.choice(a)
3

2.6 shuffle()函数

shuffle()函数可以将序列进行随机打乱次序。函数的参数为一个列表。我们看它的用法:

>>> import random
>>> a = [2, 3, 4, 5, 6, 7, 8]
>>> random.shuffle(a)
>>> print(a)
[2, 7, 3, 4, 8, 6, 5]
>>> random.shuffle(a)
>>> print(a)
[7, 6, 3, 4, 5, 8, 2]

2.7 seed()函数

seed()函数可以生成一个随机数的种子,我们生成随机数可以不生成种子,系统会自动以系统时间作为种子。如果我们指定了随机数种子,种子相同的情况下生成的随机数也相同。我们看具体的例子:

>>> import random
>>> random.seed(1) # 种子为1
>>> random.random()
0.13436424411240122
>>> random.seed(2) # 种子为2
>>> random.random()
0.9560342718892494
>>> random.seed(1) # 种子为1
>>> random.random()
0.13436424411240122

从上面的代码中我们可以看出,当种子相同时,生成的随机数也是相同的。

三、综合应用实例

刚刚讲了这么多,我们结合随机库、海龟画图和函数递归调用,可以画出非常漂亮的画。而且程序每次运行后画出来的画都不一样哦!我们来看一下樱花树的例子:

import random
import turtle

__Pen = turtle.Pen()

# “画树”函数
# 参数分别是树枝长度、画笔


def tree(branchLen, t):
    if (branchLen > 3):
        if (8 <= branchLen and branchLen <= 12) :
            if (random.randint(0, 2) == 0) :
                t.pencolor('snow')
            else :
                t.pencolor('lightcoral')
            t.pensize((branchLen / 3))
        elif (branchLen < 8) :
            if (random.randint(0, 1) == 0) :
                t.pencolor('snow')
            else :
                t.pencolor('lightcoral')
            t.pensize((branchLen / 2))
        else :
            t.pencolor('sienna')
            t.pensize((branchLen / 10))
        t.forward(branchLen)
        a = (1.5 * (random.random()))
        t.right((20 * a))
        b = (1.5 * (random.random()))
        tree(branchLen - 10 * b, t)
        t.left((40 * a))
        tree(branchLen - 10 * b, t)
        t.right((20 * a))
        t.penup()
        t.backward(branchLen)
        t.pendown()

# 绘制树下花瓣,参数分别是画板数、画笔

def petal(m, t):
    for i in range(m):
        a = (200 - 400 * (random.random()))
        b = (10 - 20 * (random.random()))
        t.penup()
        t.forward(b)
        t.left(90)
        t.forward(a)
        t.pendown()
        t.pencolor('lightcoral')
        t.circle(1)
        t.penup()
        t.backward(a)
        t.right(90)
        t.backward(b)

def main():
    t = turtle.Pen()
    __Pen.hideturtle()
    t.speed(0)
    turtle.bgcolor('wheat')
    t.left(90)
    t.penup()
    t.backward(150)
    t.pendown()
    t.pencolor('sienna')
    tree(60, t)
    petal(100, t)
    turtle.done()

main()

四、课后思考题

1、编程题

编写一个猜数字的游戏。程序随机生成一个1到100之间的整数。用户输入一个整数,根据用户输入输入的数字并提示“猜大了”或者“猜小了”。用户输入正确答案时提示“恭喜你猜对了”,程序运行结束。

2、编程题

使用海龟画图在屏幕的任意位置画五角星,五角星的个数为20个。五角星每条边的长度为30到80之间的随机数;五角星的线条颜色为红色(red)、绿色(green)、黄色(yellow)、紫色(violet)、蓝色(blue)、紫罗兰(purple)、麦黄色(wheat)、橙色(orange)中的随机一种颜色。

五、上节课思考题答案

1、C

2、错(返回值类型是元组,不是列表)

3、参考代码:

def transit(license):
    last = license[-1]
    return (last != '1' and last != '6')

licenses = ['省A23321', '省A87212', '省A66528', '省A01767', '省A54234', '省A32179']
trans = list(filter(transit, licenses))
print(trans)

4、参考代码:

def double(n):
    return 2 * n

s = list(map(int, input().split()))
ds = list(map(double, s))
print(ds)
举报
评论 0