2020-07-17 Python学习笔记22 内置模块
一些关于自己学习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关 思维导图