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关 思维导图
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343