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 "<ipython-input-50-1322861e9312>", 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)) # <class 'datetime.datetime'>
dt = datetime.datetime.now()
print(dt) # 2020-06-25 11:11:03.877853
print(type(dt)) # <class 'datetime.datetime'>
2020-06-25 11:23:59
1593055439.0
2020-06-25 11:23:59
<class 'datetime.datetime'>
2020-08-08 11:42:18.027180
<class 'datetime.datetime'>
符號 | 說明 |
---|---|
%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())) # <class 'datetime.date'>
print(dt.time()) # 11:51:49
print(type(dt.time())) # <class 'datetime.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
<class 'datetime.date'>
11:51:49
<class 'datetime.time'>
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)) # <class 'datetime.datetime'>
s = 'March 31, 2010, 10:51pm'
dt = parser.parse(s)
print(dt) # 2010-03-31 22:51:00
print(type(dt)) # <class 'datetime.datetime'>
2020-06-25 00:00:00
<class 'datetime.datetime'>
2010-03-31 22:51:00
<class 'datetime.datetime'>
# 練習】計算以下列表中連續的天數。
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)) # <class 'datetime.date'>
d = datetime.date.today()
print(d) # 2020-06-25
print(type(d)) # <class 'datetime.date'>
2020-06-25
<class 'datetime.date'>
2020-08-08
<class 'datetime.date'>
# 【練習】如何統計兩個日期之間有多少個星期六?
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)) # <class 'datetime.time'>
12:09:23.012980
<class 'datetime.time'>
#【練習】如何將給定日期轉換爲當天開始的時間?
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)) # <class 'datetime.timedelta'>
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)) # <class 'datetime.timedelta'>
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)) # <class 'datetime.timedelta'>
30 days, 0:00:00
<class 'datetime.timedelta'>
2020-08-08
2020-09-07
365 days, 0:00:00
<class 'datetime.timedelta'>
23 days, 0:00:00
<class 'datetime.timedelta'>
【練習】
距離你出生那天過去多少天了?
距離你今年的下一個生日還有多少天?
將距離你今年的下一個生日的天數轉換爲秒數。
#【參考答案】
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