美文网首页
2020-07-17 Python学习笔记22 内置模块

2020-07-17 Python学习笔记22 内置模块

作者: 建渐升辉 | 来源:发表于2020-07-17 22:58 被阅读0次

    一些关于自己学习Python的经历的内容,遇到的问题和思考等,方便以后查询和复习。

    声明:本人学习是在扇贝编程通过网络学习的,相关的知识、案例来源于扇贝编程。如果使用请说明来源。

    练习:打印当前时间

    用 time 和 datetime 模块。要求:

    打印现在的时间;

    暂停 3 秒;

    再次打印现在的时间。

    import time  #最初忘记导入时间了,结果停3秒报错,说没有定义

    from datetime import datetime

    print('现在的时间是:%s' %datetime.now()) #最初我只是要求打出现在的时间

    time.sleep(3)   # time和datetime都是内置模块,使用需要导入

    print('现在的时间是:%s' %datetime.now())  #字符串格式化输出

    现在的时间是:2020-07-10 16:17:02.336350

    现在的时间是:2020-07-10 16:17:05.340135

    https://docs.python.org/zh-cn/3/library/index.html

    内置函数和常量的网址

    练习:随机选择函数

    刚刚我们讲过 random.choice() 方法可以从非空序列中随机返回一个元素,但条条大路通罗马,你能在不使用 random.choice() 的情况下,实现一个自己的 choice() 函数吗?

    提示:随机返回一个元素只需随机生成一个范围在 0 到序列长度减 1 的索引,然后通过该索引获取对应的元素即可。

    import random

    choice = []

    def choice(seq):

      #写一个你自己的 choice() 函数

     global choinc

     choice = choice[random.randint(0, 4)]

    print(choice(['🍉', '🍑', '🥝', '🍇']))

    我定义了一个空列表,然后用choice作为变量,结果系统老是说局部变量什么什么的。总之不对。这样肯定不对,choice是变量又是列表。

    import random

    # 答案一

    def choice(seq):

      return seq[random.randint(0, len(seq)-1)]

    # 答案二(Python 官方实现方式)

    def choice(seq):

      return seq[int(random.random()*len(seq))]

    print(choice(['🍉', '🍑', '🥝', '🍇']))

    答案其实很简单,直接返回结果就可以了

    但是这个里面的逻辑我没有看懂,seq不是变量吗,加入返回的是seq[2],那么打印的是choice(seq[2])?而程序中是print(choice((['🍉', '🍑', '🥝', '🍇'] )),这二者是等同的吗?

    疑问

    练习:剪刀、石头、布

    你肯定玩过“石头、剪刀、布”的游戏,学完了 random 模块后,我们来写一个 Python 版的“石头、剪刀、布”,然后和电脑玩一次“石头、剪刀、布”吧!

    import random

    choices = ['石头', '剪刀', '布']

    winner = random.choice(['石头', '剪刀', '布'])

    print('电脑的选择是:',winner)

    your_choice = input('请输入石头、剪刀或布')

    print('我的选择是:',your_choice)

    这个里面比较难的,也是比较关键的是在列表中随机选择,参考文中讲解的例子,我写出随机选择的的语句。

    现在的程序能显示电脑的选择、以及我的选择。如何判断输赢呢?

    我有些不知所措。

    看了答案,有了惊喜

    答案就能根据双方的选择做出输赢判断,这个真好。

    import random

    choices = ['石头', '剪刀', '布']

    win = [

      ['石头', '剪刀'],  # 所有可能赢的状况,每种情况是一个列表,列表中的元素是列表

      ['剪刀', '布'],     # 注意各个元素之间用英文逗号隔开

      ['布', '石头']

      ]

    your_choice = input('请输入石头、剪刀或布')

    if your_choice in choices:  #这是游戏的前提条件

     computer_choice = random.choice(choices) # 电脑的选择也符合要求,前提条件

      if[your_choice,

    computer_choice]in win:  if 条件,还能这么用,列表在列表里

       print('你出了%s,电脑出了%s,你赢了!'% (your_choice, computer_choice))

     elif your_choice == computer_choice:

       print('你出了%s,电脑出了%s,平局!'% (your_choice, computer_choice))

     else:

       print('你出了%s,电脑出了%s,你输了!'% (your_choice, computer_choice))

    else:

     print('输入有误')

    先把可能的赢的情况列举出来,每种情况作为一个列表,所有列表合在一起,作为一个大的列表,所有赢的空间。

    加入电脑和你的选择都在可选的范围内,这个是游戏的前提条件,然后比较

    赢的情况、平局的情况和输的情况,

    两个选择合在一起作为一个元组,用在输出格式化中。

    最后还有输入有误的情况,这个一般可能考虑不到。

    内置模块I

    time 模块

    time.sleep(3) 这个方法我们在第一课就见到过,它用于暂停程序的执行,参数为秒。它可以用于防止程序执行过快,比如爬取数据时降低爬取速率防止被封等。

    import time #使用之前需要先导入,即使是内置模块

    # 获取当前时间的 Unix 时间戳

    print(time.time())

    # 输出:1558329240.201314

    Unix 时间戳对计算机来说稍微计算一下就知道现在是什么时间了,但对人类来说可读性就大打折扣了,所以还有对人类友好的ctime() 方法:

    print(time.ctime())

    # 输出:Mon May 2013:14:00 2019

    datetime 模块

    datetime 模块包括很多函数和类,这些函数和类均用于日期和时间的解析、格式化以及计算。老师今天只给你介绍其中的几个,更多的内容等你需要时再自行探索。

    # 导入 datetime 模块中的 datetime 对象

    from datetime import datetime   #导入datetime变量

    # 获取当前时间

    print(datetime.now())

    # 输出:2019-05-2013:14:00.201314

    # 将 Unix 时间戳转换成时间

    print(datetime.fromtimestamp(1558329240.201314))

    # 输出:2019-05-2013:14:00.201314

    注意,datetime 模块里有一个同名的 datetime 类,因此我们要写成 from datetime import datetime。

    datetime.now() 和 time.ctime() 类似,都是获取人类可读的时间格式,只是 datetime.now() 没有星期几的信息。

    有些时候我们拿到 Unix 时间戳却不知道具体时间,可以使用 datetime.fromtimestamp() 方法来将其转换成人类可读的时间格式。

    有些时候我们还要进行日期的计算,比如 5 天前是几月几号,10 天后又是几月几号等。这在 Python 中实现起来也不难,我们来看个例子:

    from datetime importdatetime, timedelta

    print(datetime.now() - timedelta(days=5))

    # 输出:2019-05-1513:14:00.201314

    timedelta() 在日期计算中很实用,上面代码中的 timedelta(days=5) 表示 5 天,用现在的时间减去 5 天就能得到5 天前的日期。同理,如果加上 5 天就能得到5 天后的日期了。

    你应该注意到了,调用timedelta() 时传的是关键字参数 days=5,表示 5 天。其实除了天之外,timedelta() 还支持传入周、时、分、秒、毫秒和微秒,我们来看看这些参数名都是什么:

    from datetime import datetime, timedelta

    # 周(weeks)

    print(datetime.now() - timedelta(weeks=2))

    # 输出:2019-05-0613:14:00.201314

    # 时(hours)

    print(datetime.now() + timedelta(hours=2))

    # 输出:2019-05-2015:14:00.201314

    # 分(minutes)

    print(datetime.now() + timedelta(minutes=2))

    # 输出:2019-05-2013:16:00.201314

    # 秒(seconds)

    print(datetime.now() + timedelta(seconds=2))

    # 输出:2019-05-2013:14:02.201314

    # 毫秒(milliseconds)

    print(datetime.now() + timedelta(milliseconds=2))

    # 输出:2019-05-2013:14:00.203314

    # 微秒(microseconds)

    print(datetime.now() + timedelta(microseconds=2))

    # 输出:2019-05-2013:14:00.201316

    如果你英文还不错,这些参数对你来说肯定很简单吧!还有,timedelta() 可以支持同时传入多个参数,比如计算两个半小时前的时间:

    from datetime import datetime, timedelta

    print(datetime.now() - timedelta(hours=2, minutes=30))

    # 输出:2019-05-2010:44:00.201314

    在进行日期计算、时间计算的时候,前面都是datetime.now(),后面都是timedelta,只是时间参数变化

    内置模块II

    random 模块

    random 模块之前也有提及,今天我们来正式学习它。从模块名称我们就能猜出它应该和 随机 有关,random 模块本身很简单,我们直接来看几个例子:

    # 导入 random 模块

    import random

    # 随机生成0-1 之间的浮点数,包括 0,不包括 1

    print(random.random())

    # 输出:0.878022926133

    # 随机生成 0-5 之间的整数,包括 0 和 5

    print(random.randint(0,

    5))

    # 输出:3

    # 随机生成 0-5 之间的浮点数,包括 0 和5

    print(random.uniform(0, 5))

    # 输出:4.86369987147

    # 从非空序列中随机返回一个元素

    print(random.choice([1, 2, 3]))

    # 输出:2

    random.random() 可以生成 0-1 之间的随机小数,包括 0,不包括 1。这是最基本的生成随机数的方法,同时 random 模块还帮我们封装了一些更好用的方法——random.randint()、random.uniform() 和 random.choice()。

    random.randint(m, n) 可以生成一个随机整数,该整数大于等于 m,小于等于 n。random.uniform(m,

    n) 也是类似的,只不过生成的是随机小数,该小数大于等于 m,小于等于 n。

    注意:random.randint() 和 random.uniform() 生成的随机数是包含后面一个数的,这点和 random.random() 还有分片不同。

    random.choice() 可以从一个非空序列中随机返回一个元素,常常用于抽奖:

    import random

    winner = random.choice(['小贝', '闻闻', '黄帮主'])

    print('大奖得主是' +winner)

    # 输出:大奖得主是黄帮主

    需要注意的是,参数一定得是非空序列,否则将会报错:

    import random

    random.choice([])

    # 报错:IndexError:Cannot choose from an empty sequence

    random.shuffle() 用于将序列的所有元素随机排序。

    math 模块

    math 模块从名称也可知是和数学相关的,在做一些数学计算时会用到,这里简单介绍一下:

    # 导入 math 模块

    import math

    # 向上取整

    print(math.ceil(2.3))

    # 输出:3

    # 向下取整

    print(math.floor(2.3))

    # 输出:2

    # 取平方根

    print(math.sqrt(4))

    # 输出:2.0

    # 数学常数π

    print(math.pi)

    # 输出:3.14159265359

    # 数学常数e

    print(math.e)

    # 输出:2.71828182846

    上面这些方法是比较常用的,同时 math 模块里还有很多其他方法和常数。对数学计算有需要的同学可以查看文档了解更多,文档地址是:

    https://docs.python.org/zh-cn/3/library/math.html

    自学模块

    讲了这么多模块及其用法,你肯定会觉得:要记住这么多东西真是太难了!其实,像常用模块、常用函数之类的并不需要花大量时间去记,忘记了就查,用多了之后就不经意间记住了。

    除了在学习交流群中寻求小伙伴的帮助外,我希望你能先独立思考、培养独立解决问题的能力。现如今获取知识非常便捷,我们只需使用搜索引擎搜索对应的关键字即可。

    比如当我们不知道 choice 方法怎么用时,我们可以用 Python choice 用法 作为关键字进行搜索。

    比如你连 random 模块都不知道,却想用 Python 生成随机数。我们可以用 Python 如何生成随机数 作为关键字进行搜索。

    又比如当我们遇到不明白的报错时,我们可以用 Python + 报错信息 作为关键字进行搜索。

    第22关 思维导图

    相关文章

      网友评论

          本文标题:2020-07-17 Python学习笔记22 内置模块

          本文链接:https://www.haomeiwen.com/subject/bahohktx.html