Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块。
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。
一般有三种命名空间:
命名空间查找顺序:
假设我们要使用变量 runoob,则 Python 的查找顺序为:局部的命名空间去 -> 全局命名空间 -> 内置命名空间。
如果找不到变量 runoob,它将放弃查找并引发一个 NameError 异常:
命名空间的生命周期:
命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。
因此,我们无法从外部命名空间访问内部命名空间的对象。
【例子】
# var1 是全局名称
var1 = 5
def some_func():
# var2 是局部名称
var2 = 6
def some_inner_func():
# var3 是内嵌的局部名称
var3 = 7
print(var1)
some_inner_func()
some_func()
5
练习题:
1、怎么查出通过 from xx import xx导⼊的可以直接调⽤的⽅法?
Ans:
通过dir()函数
内置的函数 dir()
可以找到模块内定义的所有名称。以一个字符串列表的形式返回。
例如:了解collections模块。
import collections
dir(collections)
['ChainMap',
'Counter',
'OrderedDict',
'UserDict',
'UserList',
'UserString',
'_Link',
'_OrderedDictItemsView',
'_OrderedDictKeysView',
'_OrderedDictValuesView',
'__all__',
'__builtins__',
'__cached__',
'__doc__',
'__file__',
'__getattr__',
'__loader__',
'__name__',
'__package__',
'__path__',
'__spec__',
'_chain',
'_collections_abc',
'_count_elements',
'_eq',
'_heapq',
'_iskeyword',
'_itemgetter',
'_nt_itemgetters',
'_proxy',
'_recursive_repr',
'_repeat',
'_starmap',
'_sys',
'abc',
'defaultdict',
'deque',
'namedtuple']
2、了解Collection模块,编写程序以查询给定列表中最常见的元素。
题目说明:
输入:language = [‘PHP’, ‘PHP’, ‘Python’, ‘PHP’, ‘Python’, ‘JS’, ‘Python’, ‘Python’,‘PHP’, ‘Python’]
输出:Python
Ans:
from collections import Counter
language = ['PHP', 'PHP', 'Python', 'PHP', 'Python', 'JS', 'Python', 'Python','PHP', 'Python']
def most_element(language):
""" Return a list of lines after inserting a word in a specific line. """
return Counter(language).most_common(1)[0][0]
most_element(language)
'Python'
class datetime(date):
def __init__(self, year, month, day, hour, minute, second, microsecond, tzinfo)
pass
def now(cls, tz=None):
pass
def timestamp(self):
pass
def fromtimestamp(cls, t, tz=None):
pass
def date(self):
pass
def time(self):
pass
def year(self):
pass
def month(self):
pass
def day(self):
pass
def hour(self):
pass
def minute(self):
pass
def second(self):
pass
def isoweekday(self):
pass
def strftime(self, fmt):
pass
def combine(cls, date, time, tzinfo=True):
pass
File "", line 2
def __init__(self, year, month, day, hour, minute, second, microsecond, tzinfo)
^
SyntaxError: invalid syntax
【例子】
import datetime
dt = datetime.datetime(year=2020, month=6, day=25, hour=11, minute=23, second=59)
print(dt) # 2020-06-25 11:23:59
print(dt.timestamp()) # 1593055439.0
dt = datetime.datetime.fromtimestamp(1593055439.0)
print(dt) # 2020-06-25 11:23:59
print(type(dt)) #
dt = datetime.datetime.now()
print(dt) # 2020-06-25 11:11:03.877853
print(type(dt)) #
2020-06-25 11:23:59
1593055439.0
2020-06-25 11:23:59
2020-08-08 11:42:18.027180
符号 | 说明 |
---|---|
%a | 本地简化星期名称(如星期一,返回 Mon) |
%A | 本地完整星期名称(如星期一,返回 Monday) |
%b | 本地简化的月份名称(如一月,返回 Jan) |
%B | 本地完整的月份名称(如一月,返回 January) |
%c | 本地相应的日期表示和时间表示 |
%d | 月内中的一天(0-31) |
%H | 24小时制小时数(0-23) |
%I | 12小时制小时数(01-12) |
%j | 年内的一天(001-366) |
%m | 月份(01-12) |
%M | 分钟数(00-59) |
%p | 本地A.M.或P.M.的等价符 |
%S | 秒(00-59) |
%U | 一年中的星期数(00-53)星期天为星期的开始 |
%w | 星期(0-6),星期天为星期的开始 |
%W | 一年中的星期数(00-53)星期一为星期的开始 |
%x | 本地相应的日期表示 |
%X | 本地相应的时间表示 |
%y | 两位数的年份表示(00-99) |
%Y | 四位数的年份表示(0000-9999) |
%Z | 当前时区的名称(如果是本地时间,返回空字符串) |
%% | %号本身 |
#【例子】如何将 datetime 对象转换为任何格式的日期?
import datetime
dt = datetime.datetime(year=2020, month=6, day=25, hour=11, minute=51, second=49)
s = dt.strftime("'%Y/%m/%d %H:%M:%S")
print(s) # '2020/06/25 11:51:49
s = dt.strftime('%d %B, %Y, %A')
print(s) # 25 June, 2020, Thursday
'2020/06/25 11:51:49
25 June, 2020, Thursday
##【练习】如何将给定日期转换为 "mmm-dd, YYYY" 的格式?
import datetime
d1 = datetime.date(2010, 9, 28)
print(d1.strftime('%b-%d,%Y'))
# Sep-28,2010
Sep-28,2010
#【例子】datetime 对象包含很多与日期时间相关的实用功能。
import datetime
dt = datetime.datetime(year=2020, month=6, day=25, hour=11, minute=51, second=49)
print(dt.date()) # 2020-06-25
print(type(dt.date())) #
print(dt.time()) # 11:51:49
print(type(dt.time())) #
print(dt.year) # 2020
print(dt.month) # 6
print(dt.day) # 25
print(dt.hour) # 11
print(dt.minute) # 51
print(dt.second) # 49
print(dt.isoweekday()) # 4
2020-06-25
11:51:49
2020
6
25
11
51
49
4
在处理含有字符串日期的数据集或表格时,我们需要一种自动解析字符串的方法,无论它是什么格式的,都可以将其转化为 datetime 对象。这时,就要使用到 dateutil 中的 parser 模块。
#【例子】如何在 python 中将字符串解析为 datetime对象?
from dateutil import parser
s = '2020-06-25'
dt = parser.parse(s)
print(dt) # 2020-06-25 00:00:00
print(type(dt)) #
s = 'March 31, 2010, 10:51pm'
dt = parser.parse(s)
print(dt) # 2010-03-31 22:51:00
print(type(dt)) #
2020-06-25 00:00:00
2010-03-31 22:51:00
# 练习】计算以下列表中连续的天数。
import numpy as np
from dateutil import parser
dateString = ['Oct, 2, 1869', 'Oct, 10, 1869', 'Oct, 15, 1869', 'Oct, 20, 1869', 'Oct, 23, 1869']
dates = [parser.parse(i) for i in dateString]
td = np.diff(dates)
print(td)
[datetime.timedelta(days=8) datetime.timedelta(days=5)
datetime.timedelta(days=5) datetime.timedelta(days=3)]
#【例子】如何在 Python 中获取当前日期和时间?
import datetime
d = datetime.date(2020, 6, 25)
print(d) # 2020-06-25
print(type(d)) #
d = datetime.date.today()
print(d) # 2020-06-25
print(type(d)) #
2020-06-25
2020-08-08
# 【练习】如何统计两个日期之间有多少个星期六?
import datetime
d1 = datetime.date(1869, 1, 2)
d2 = datetime.date(1869, 10, 2)
dt = (d2 - d1).days
print(dt)
print(d1.isoweekday()) # 6
print(dt // 7 + 1) # 40
273
6
40
#【例子】如何使用 datetime.time() 类?
import datetime
t = datetime.time(12, 9, 23, 12980)
print(t) # 12:09:23.012980
print(type(t)) #
12:09:23.012980
#【练习】如何将给定日期转换为当天开始的时间?
import datetime
date = datetime.date(2019, 10, 2)
dt = datetime.datetime(date.year, date.month, date.day)
print(dt) # 2019-10-02 00:00:00
dt = datetime.datetime.combine(date, datetime.time.min)
print(dt) # 2019-10-02 00:00:00
2019-10-02 00:00:00
2019-10-02 00:00:00
timedelta
表示具体时间实例中的一段时间。你可以把它们简单想象成两个日期或时间之间的间隔。
它常常被用来从 datetime
对象中添加或移除一段特定的时间。
#【例子】如何使用 datetime.timedelta() 类?
import datetime
td = datetime.timedelta(days=30)
print(td) # 30 days, 0:00:00
print(type(td)) #
print(datetime.date.today()) # 2020-07-01
print(datetime.date.today() + td) # 2020-07-31
dt1 = datetime.datetime(2020, 1, 31, 10, 10, 0)
dt2 = datetime.datetime(2019, 1, 31, 10, 10, 0)
td = dt1 - dt2
print(td) # 365 days, 0:00:00
print(type(td)) #
td1 = datetime.timedelta(days=30) # 30 days
td2 = datetime.timedelta(weeks=1) # 1 week
td = td1 - td2
print(td) # 23 days, 0:00:00
print(type(td)) #
30 days, 0:00:00
2020-08-08
2020-09-07
365 days, 0:00:00
23 days, 0:00:00
【练习】
距离你出生那天过去多少天了?
距离你今年的下一个生日还有多少天?
将距离你今年的下一个生日的天数转换为秒数。
#【参考答案】
from dateutil import parser
import datetime
bDay = 'Oct 2, 1969'
dt1 = parser.parse(bDay).date()
dt2 = datetime.date.today()
dt3 = datetime.date(dt2.year, dt1.month, dt1.day)
print(dt1) # 1969-10-02
print(dt2) # 2020-07-01
print(dt3) # 2020-10-02
td = dt2 - dt1
print(td.days) # 18535
td = dt3 - dt2
print(td.days) # 93
print(td.days * 24 * 60 * 60) # 8035200
print(td.total_seconds()) # 8035200.0
1969-10-02
2020-08-08
2020-10-02
18573
55
4752000
4752000.0