- 原文部落格地址: Python資料型別詳解03
- 第一篇Python資料型別詳解01中主要介紹了
Python
中的一些常用的資料型別的基礎知識 - 第二篇Python資料型別詳解02文章中, 詳細介紹了數字(
Number
)和字串的一些函式和模組的使用 - 這篇文章主要介紹一些
Python
中的一序列(列表/元組/字典)
一. 列表(List)
先回顧下上一篇Python資料型別詳解01文章中介紹的列表的基礎知識
# List 列表
list1 = [12, 34, 3.14, 5.3, `titan`]
list2 = [10, `jun`]
# 1.完整列表
print(list1)
# 2.列表第一個元素
print(list1[0])
# 3.獲取第2-3個元素
print(list1[1:2])
# 4.獲取第三個到最後的所有元素
print(list1[2:])
# 5.獲取最後一個元素
print(list1[-1])
# 6.獲取倒數第二個元素
print(list1[-2])
# 7.獲取最後三個元素
print(list1[-3:-1])
# 8.合併列表
print(list1 + list2)
# 9.重複操作兩次
print(list2 * 2)
複製程式碼
1.新增和刪除列表元素
對列表的資料項進行修改或更新,你也可以使用append()方法來新增列表項
list1 = [] ## 空列表
list1.append(`Google`) ## 使用 append() 新增元素
list1.append(`Baidu`)
print(list1)
//輸出:
[`Google`, `Baidu`]
複製程式碼
使用 del
語句來刪除列表的元素
del list1[1]
//輸出:
[`Google`]
複製程式碼
2.列表指令碼操作符
列表對 + 和 星號 的操作符與字串相似。+ 號用於組合列表,星號 號用於重複列表
# 1. 指令碼操作符
list1 = [1, 2, 3]
# 元素個數
print(len(list1))
# 重複
list2 = [2] * 3
print(list2)
# 是否包含某元素
if (3 in list1):
print(`3在列表內`)
else:
print(`3不在列表內`)
# 遍歷列表
for x in list1 :
print(x)
# 輸出結果:
3
[2, 2, 2]
3在列表內
1
2
3
複製程式碼
3. 列表函式&方法
下面將會列出在列表中常用的函式和方法
函式表示式 | 輸出結果 | 描述 |
---|---|---|
len(list1) |
3 | 列表元素個數 |
max([1, 2, `s`]) |
s | 返回列表元素的最大值 |
min([1, 2, `s`]) |
1 | 返回列表元素的最小值 |
list((`q`, 1) |
[`q`, 1] |
將元組轉換為列表 |
list1.append(2) |
[1, 2, 3, 2] | 在列表末尾新增新的物件 |
list1.count(2) |
2 | 統計某個元素在列表中出現的次數 |
list1.index(3) |
2 | 從列表中找出某個值第一個匹配項的索引位置 |
list1.insert(1, `jun`) |
[1, `jun`, 2, 3, 2] | 將物件插入列表的指定位置 |
list1.remove(3) |
[1, `jun`, 2, 2] | 移除列表中某個值的第一個匹配項 |
list1.reverse() |
[2, 2, `jun`, 1] | 對列表的元素進行反向排列 |
list1.sort() |
[2, 2, `jun`, 1] | 對原列表進行排序, 如果指定引數,則使用比較函式指定的比較函式 |
extend()方法
用於在列表末尾一次性追加另一個序列(元組和列表)中的多個值(用新列表擴充套件原來的列表)
list3 = [12, `as`, 45]
list4 = (23, `ed`)
list3.extend(list4)
print(list3)
//輸出:
[12, `as`, 45, 23, `ed`]
複製程式碼
pop()方法
用於移除列表中的一個元素(預設最後一個元素),並且返回該元素的值
list.pop(obj=list[-1])
//使用
list3 = [12, `as`, 45, 23, `ed`]
print(list3)
print(list3.pop())
print(list3)
print(list3.pop(2))
print(list3)
//輸出:
ed
[12, `as`, 45, 23]
45
[12, `as`, 23]
複製程式碼
二. 元組
先回顧一下上篇文章介紹的元組的基礎知識
# 元組
tuple1 = (12, 34, 3.14, 5.3, `titan`)
tuple2 = (10, `jun`)
# 1.完整元組
print(tuple1)
# 2.元組一個元素
print(tuple1[0])
# 3.獲取第2-3個元素
print(tuple1[2:3])
# 4.獲取第三個到最後的所有元素
print(tuple1[2:])
# 5.獲取最後一個元素
print(tuple1[-1])
# 6.獲取倒數第二個元素
print(tuple1[-2])
# 7.獲取最後三個元素
print(tuple1[-3:-1])
# 8.合併元組
print(tuple1 + tuple2)
# 9.重複操作兩次
print(tuple2 * 2)
複製程式碼
1. 元組運算子
與列表的運算子和操作類似, 如下:
# 計算元素個數
print(len((1, 2, 3)))
# 合併元組
tuple1 = (1, 2) + (4, 5)
print(tuple1)
# 重複
tuple2 = (`jun`,) * 3
print(tuple2)
# 檢測是否包含某元素
if (2 in tuple1):
print(`2在該元組內`)
else:
print(`不在元組內`)
# 遍歷元組
for x in tuple1:
print(x)
//輸出:
3
(1, 2, 4, 5)
(`jun`, `jun`, `jun`)
2在該元組內
1
2
4
5
複製程式碼
2. 元組內建函式
tuple1 = (1, 2, 4, 5)
# 元組中元素最大值
print(max(tuple1))
# 元組中元素最小值
print(min(tuple1))
# 列表轉換為元組
print(tuple([`a`, `d`, `f`]))
//輸出:
5
1
(`a`, `d`, `f`)
複製程式碼
三. 字典
先看看上文中介紹到的字典的相關基礎知識, 需要注意的是: 鍵必須不可變,所以可以用數字,字串或元組充當,所以用列表就不行
# 字典
dict1 = {`name`: `jun`, `age`: 18, `score`: 90.98}
dict2 = {`name`: `titan`}
# 完整字典
print(dict2)
# 1.修改或新增字典元素
dict2[`name`] = `brother`
dict2[`age`] = 20
dict2[3] = `完美`
dict2[0.9] = 0.9
print(dict2)
# 2.根據鍵值獲取value
print(dict1[`score`])
# 3.獲取所有的鍵值
print(dict1.keys())
# 4.獲取所有的value值
print(dict1.values())
# 5.刪除字典元素
del dict1[`name`]
print(dict1)
# 6.清空字典所有條目
dict1.clear()
print(dict1)
# 7.刪除字典
dict3 = {2: 3}
del dict3
# 當該陣列唄刪除之後, 在呼叫會報錯
# print(dict3)
複製程式碼
1. 內建函式
dic1 = {`name`: `titan`, `age`:20}
# 計算字典元素個數,即鍵的總數
print(len(dic1))
# 字典(Dictionary) str() 函式將值轉化為適於人閱讀的形式,以可列印的字串表示
print(str(dic1))
# 返回輸入的變數型別,如果變數是字典就返回字典型別
print(type(dic1))
//輸出:
2
{`name`: `titan`, `age`: 20}
<class `dict`>
複製程式碼
2. 內建方法
copy()方法
copy()
函式返回一個字典的淺複製- 直接賦值和
copy
的區別
dict1 = {`user`:`runoob`,`num`:[1,2,3]}
dict2 = dict1 # 淺拷貝: 引用物件
dict3 = dict1.copy() # 淺拷貝:深拷貝父物件(一級目錄),子物件(二級目錄)不拷貝,還是引用
# 修改 data 資料
dict1[`user`]=`root`
dict1[`num`].remove(1)
# 輸出
print(dict1)
print(dict2)
print(dict3)
# 輸出結果
{`num`: [2, 3], `user`: `root`}
{`num`: [2, 3], `user`: `root`}
{`num`: [2, 3], `user`: `runoob`}
複製程式碼
例項中 dict2
其實是 dict1
的引用(別名),所以輸出結果都是一致的,dict3
父物件進行了深拷貝,不會隨dict1
修改而修改,子物件是淺拷貝所以隨 dict1
的修改而修改
fromkeys()方法
fromkeys()
函式用於建立一個新字典,- 引數一: 以序列
seq
中元素做字典的鍵 - 引數二:
value
為字典所有鍵對應的初始值(可選引數)
dict.fromkeys(seq[, value])
# 使用
dic2 = dict.fromkeys([`name`, `titan`])
print(dic2)
dic3 = dict.fromkeys([`name`, `titan`], 20)
print(dic3)
# 輸出:
{`name`: None, `titan`: None}
{`name`: 20, `titan`: 20}
複製程式碼
get() 和 setdefault()方法
get()
函式返回指定鍵的值,如果值不在字典中返回預設值setdefault()
和get()
方法類似, 如果鍵不存在於字典中,將會新增鍵並將值設為預設值(同事也會把鍵值對新增到字典中)- 引數一: 字典中要查詢的鍵。
- 引數二: 如果指定鍵的值不存在時,返回該預設值值(可選引數)
dict.get(key, default=None)
# 使用
dic5 = {`name`: `titan`, `age`:20}
print(dic5.get(`name`))
print(dic5.get(`Sex`, `man`))
print(dic5.setdefault(`name`))
print(dic5.setdefault(`Sex`, `man`))
print(dic5)
# 輸出結果:
titan
man
titan
man
{`name`: `titan`, `age`: 20, `Sex`: `man`}
複製程式碼
update()方法
把字典的鍵/值對更新到另一個字典裡(合併字典)
dict.update(dict2)
# 使用
dic6 = {`sex`: `new`}
dic5.update(dic6)
print(dic5)
# 輸出:
{`name`: `titan`, `age`: 20, `Sex`: `man`, `sex`: `new`}
複製程式碼
pop() 和 popitem() 方法
pop()
: 刪除字典給定鍵 key 所對應的值,返回值為被刪除的值。key值必須給出。 否則,返回default值popitem()
: 隨機返回並刪除字典中的一對鍵和值。
如果字典已經為空,卻呼叫了此方法,就報出KeyError異常
pop(key[,default])
popitem()
# 使用
print(dic5.pop(`Sex`))
print(dic5)
print(dic5.popitem())
print(dic5)
# 輸出:
man
{`name`: `titan`, `age`: 20, `sex`: `new`}
(`sex`, `new`)
{`name`: `titan`, `age`: 20}
複製程式碼
其他方法
dic2 = {`name`: `titan`, `age`:20}
# 判斷鍵是否存在於字典中, 在True, 不在False
print(dic2.__contains__(`name`))
# 以列表返回可遍歷的(鍵, 值) 元組陣列
print(dic2.items())
# 刪除字典內所有元素
dic2.clear()
print(dic2)
# 輸出結果:
True
dict_items([(`name`, `titan`), (`age`, 20)])
{}
複製程式碼
四. 日期和時間
Python
提供了一個time
和calendar
- 模組可以用於格式化日期和時間。
- 時間間隔是以秒為單位的浮點小數。
- 每個時間戳都以自從1970年1月1日午夜(曆元)經過了多長時間來表示
- 在介紹時間之前, 先介紹一下什麼時間元組
屬性 | 描述 | 取值 |
---|---|---|
tm_year | 4位數年 | 2018 |
tm_mon | 月 | 1 到 12 |
tm_mday | 日 | 1到31 |
tm_hour | 小時 | 0 到 23 |
tm_min | 分鐘 | 0 到 59 |
tm_sec | 秒 | 0 到 61 (60或61 是閏秒) |
tm_wday | 禮拜幾 | 0到6 (0是週一) |
tm_yday | 一年的第幾日 | 1 到 366(儒略曆) |
tm_isdst | 夏令時 | -1, 0, 1, -1是決定是否為夏令時的旗幟 |
獲取時間的簡單示例
# 日期和時間
import time
# 當前時間戳
ticks = time.time()
print(ticks)
# 本地時間
localTime = time.localtime()
print(localTime)
# 格式化時間
print(time.asctime(localTime))
# 輸出結果:
1524051644.320941
time.struct_time(tm_year=2018, tm_mon=4, tm_mday=18, tm_hour=19, tm_min=40, tm_sec=44, tm_wday=2, tm_yday=108, tm_isdst=0)
Wed Apr 18 19:40:44 2018
複製程式碼
1.格式化日期
先看幾個簡單示例
# 1.格式化日期
# 格式化成 2018-04-18 19:49:44 形式
newDate1 = time.strftime(`%Y-%m-%d %H:%M:%S`, time.localtime())
print(newDate1)
# 格式化成 Wed Apr 18 19:50:53 2018 形式
newDate2 = time.strftime(`%a %b %d %H:%M:%S %Y`, time.localtime())
print(newDate2)
# 將時間字串轉化為時間戳
timeNum = time.mktime(time.strptime(newDate2, "%a %b %d %H:%M:%S %Y"))
print(timeNum)
# 輸出結果:
2018-04-18 19:52:21
Wed Apr 18 19:52:21 2018
1524052341.0
複製程式碼
- 這裡介紹下上面用到的相關
Python
中時間和日期相關的格式化符號%y
: 兩位數的年份表示(00-99)%Y
: 四位數的年份表示(000-9999)%m
: 月份(01-12)%d
: 月內中的一天(0-31)%H
: 24小時制小時數(0-23)%I
: 12小時制小時數(01-12)%M
: 分鐘數(00=59)%S
: 秒(00-59)%a
: 本地簡化星期名稱%A
: 本地完整星期名稱%b
: 本地簡化的月份名稱%B
: 本地完整的月份名稱%c
: 本地相應的日期表示和時間表示%j
: 年內的一天(001-366)%p
: 本地A.M.或P.M.的等價符%U
: 一年中的星期數(00-53)星期天為星期的開始%w
: 星期(0-6),星期天為星期的開始%W
: 一年中的星期數(00-53)星期一為星期的開始%x
: 本地相應的日期表示%X
: 本地相應的時間表示%Z
: 當前時區的名稱%%
: %號本身
2. Time 模組
Time
模組包含了以下內建函式,既有時間處理相的,也有轉換時間格式的
Time模組的屬性
timezone
: 當地時區(未啟動夏令時)距離格林威治的偏移秒數(>0,美洲;<=0大部分歐洲,亞洲,非洲)tzname
: 包含一對根據情況的不同而不同的字串,分別是帶夏令時的本地時區名稱,和不帶的
print(time.timezone)
print(time.tzname)
# 輸出結果
-28800
(`CST`, `CST`)
複製程式碼
altzone()方法
返回格林威治西部的夏令時地區的偏移秒數。如果該地區在格林威治東部會返回負值(如西歐,包括英國)。對夏令時啟用地區才能使用
print(time.altzone)
# 輸出結果:
-28800
複製程式碼
asctime()方法
接受時間元組並返回一個可讀的形式為"Tue Dec 11 18:07:14 2008"
(2008年12月11日 週二18時07分14秒)的24個字元的字串
localTime = time.localtime()
print(localTime)
# 格式化時間
print(time.asctime(localTime))
# 輸出結果:
time.struct_time(tm_year=2018, tm_mon=4, tm_mday=18, tm_hour=19, tm_min=40, tm_sec=44, tm_wday=2, tm_yday=108, tm_isdst=0)
Wed Apr 18 19:40:44 2018
複製程式碼
ctime() 和 gmtime() 和 localtime()方法
ctime
: 把一個時間戳(按秒計算的浮點數)轉化為time.asctime()
的形式。gmtime
: 將一個時間戳轉換為UTC時區(0時區)的struct_time
(struct_time是在time
模組中定義的表示時間的物件)localtime
: 類似gmtime
,作用是格式化時間戳為本地的時間- 如果引數未給或者為None的時候,將會預設
time.time()
為引數
time.ctime([ sec ])
time.gmtime([ sec ])
time.localtime([ sec ])
# 使用
print(time.ctime())
print(time.ctime(time.time() - 100))
print(time.gmtime())
print(time.gmtime(time.time() - 100))
print(time.localtime())
print(time.localtime(time.time() - 100))
# 輸出結果:
Wed Apr 18 20:18:19 2018
Wed Apr 18 20:16:39 2018
time.struct_time(tm_year=2018, tm_mon=4, tm_mday=18, tm_hour=12, tm_min=25, tm_sec=44, tm_wday=2, tm_yday=108, tm_isdst=0)
time.struct_time(tm_year=2018, tm_mon=4, tm_mday=18, tm_hour=12, tm_min=24, tm_sec=4, tm_wday=2, tm_yday=108, tm_isdst=0)
time.struct_time(tm_year=2018, tm_mon=4, tm_mday=19, tm_hour=9, tm_min=45, tm_sec=19, tm_wday=3, tm_yday=109, tm_isdst=0)
time.struct_time(tm_year=2018, tm_mon=4, tm_mday=19, tm_hour=9, tm_min=43, tm_sec=39, tm_wday=3, tm_yday=109, tm_isdst=0)
複製程式碼
gmtime()方法
- 接收
struct_time
物件作為引數,返回用秒數來表示時間的浮點數 - 如果輸入的值不是一個合法的時間,將觸發
OverflowError
或ValueError
- 引數: 結構化的時間或者完整的9位元組元素
time.mktime(t)
# 使用
t = (2018, 4, 19, 10, 10, 20, 2, 34, 0)
print(time.mktime(t))
print(time.mktime(time.localtime()))
# 輸出結果:
1524103820.0
1524104835.0
複製程式碼
sleep()方法
推遲呼叫執行緒,可通過引數secs
指秒數,表示程式推遲的時間
time.sleep(t)
# 使用
print(time.ctime())
time.sleep(3)
print(time.ctime())
# 輸出結果:
Thu Apr 19 10:29:51 2018
Thu Apr 19 10:29:54 2018
複製程式碼
strftime()方法
- 接收以時間元組,並返回以可讀字串表示的當地時間,格式由引數
format
決定, 上面已經簡單介紹過了 - 引數
format
— 格式字串 - 引數
t
— 可選的引數t是一個struct_time
物件
time.strftime(format[, t])
# 使用
newDate1 = time.strftime(`%Y-%m-%d %H:%M:%S`, time.localtime())
print(newDate1)
# 輸出結果:
2018-04-19 10:35:22
複製程式碼
strptime()方法
- 函式根據指定的格式把一個時間字串解析為時間元組
- 引數一: 時間字串
- 引數二: 格式化字串
time.strptime(string[, format])
# 使用
structTime= time.strptime(`20 Nov 2018`, `%d %b %Y`)
print(structTime)
# 輸出結果:
time.struct_time(tm_year=2018, tm_mon=11, tm_mday=20, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=324, tm_isdst=-1)
複製程式碼
tzset()方法
根據環境變數TZ重新初始化時間相關設定, 標準TZ環境變數格式:
std offset [dst [offset [,start[/time], end[/time]]]]
複製程式碼
std
和dst
: 三個或者多個時間的縮寫字母。傳遞給time.tzname
.offset
: 距UTC
的偏移,格式:[+|-]hh[:mm[:ss]] {h=0-23, m/s=0-59}
。start[/time]
,end[/time]
:DST
開始生效時的日期。格式為m.w.d
— 代表日期的月份、週數和日期。w=1
指月份中的第一週,而w=5
指月份的最後一週。start
和end
可以是以下格式之一:Jn
: 儒略日n (1 <= n <= 365)
。閏年日(2月29)不計算在內。n
: 儒略日(0 <= n <= 365)
。 閏年日(2月29)計算在內Mm.n.d
: 日期的月份、週數和日期。w=1
指月份中的第一週,而w=5
指月份的最後一週。time
:(可選)DST
開始生效時的時間(24 小時制)。預設值為 02:00(指定時區的本地時間)
# 沒有返回值
time.tzset()
# 使用
import time
import os
os.environ[`TZ`] = `EST+05EDT,M4.1.0,M10.5.0`
time.tzset()
print time.strftime(`%X %x %Z`)
os.environ[`TZ`] = `AEST-10AEDT-11,M10.5.0,M3.5.0`
time.tzset()
print time.strftime(`%X %x %Z`)
# 輸出結果為:
13:00:40 02/17/09 EST
05:00:40 02/18/09 AEDT
複製程式碼
3. 日曆(Calendar)模組
- 此模組的函式都是日曆相關的,例如列印某月的字元月曆。
- 星期一是預設的每週第一天,星期天是預設的最後一天。
- 介紹一下
Calendar
模組的相關函式
# 返回當前每週起始日期的設定, 預設情況下,首次載入caendar模組時返回0,即星期一
print(calendar.firstweekday())
# 是閏年返回True,否則為false
# calendar.isleap(year)
print(calendar.isleap(2016))
# 返回在Y1,Y2兩年之間的閏年總數
# calendar.leapdays(y1,y2)
print(calendar.leapdays(2015, 2021))
# 返回一個元組, 第一個元素是該月的第一天是星期幾(0-6, 0是星期日), 第二個元素是該月有幾天
# calendar.monthcalendar(year,month)
print(calendar.monthrange(2018, 4))
# 返回給定日期是星期幾(0-6, 0是星期一)
# calendar.weekday(year,month,day)
print(calendar.weekday(2018, 4, 19))
# 設定每週的起始日期
# calendar.setfirstweekday(weekday) 無返回值
calendar.setfirstweekday(3)
print(calendar.firstweekday())
# 輸出結果:
0
True
2
(6, 30)
3
3
複製程式碼
calendar
和 prcal
方法
返回一個多行字串格式的year年年曆,3個月一行,間隔距離為c
。 每日寬度間隔為w
字元。每行長度為21* W+18+2* C
。l
是每星期行數
calendar.calendar(year,w=2,l=1,c=6)
calendar.prcal(year,w=2,l=1,c=6)
//使用
year18 = calendar.calendar(2018)
print(year18)
print(calendar.prcal(2018))
複製程式碼
month
和 prmonth
方法
返回一個多行字串格式的year
年month
月日曆,兩行標題,一週一行。每日寬度間隔為w
字元。每行的長度為7* w+6
。l
是每星期的行數
calendar.month(year,month,w=2,l=1)
calendar.prmonth(year,month,w=2,l=1)
//使用
monthTime = calendar.month(2018, 4)
print(monthTime)
print(calendar.prmonth(2018, 4))
複製程式碼
timegm
方法
和time.gmtime
相反:接受一個時間元組形式,返回該時刻的時間戳(1970紀元後經過的浮點秒數)
calendar.timegm(tupletime)
# 使用
print(calendar.timegm(time.localtime()))
# 輸出結果
1524150128
複製程式碼
- 到這裡,
Python
相關的資料型別(數字, 字串, 元組, 列表和字典)基本都介紹完畢了 Python
中的常用的時間格式和時間相關的模組(time
和calendar
)也都介紹完了- 文章中有些地方可能也不是很全面, 會繼續努力
- 另外, 在
Python
中,其他處理日期和時間的模組還有:datetime模組 和 dateutil模組 - 這兩個模組這裡也不再詳細介紹了,
Python
相關文章後期會持續更新……