Python小知識 | 這些技能你不會?(二)
Python小知識
最近在看《零壓力學Python》,鞏固一下基礎知識,意外收穫到很多常用卻不一定被注意的小知識,分享給大家,學到東西了點贊支援哦~
第一篇:點選這裡檢視第一篇python小技能
個人微信公眾號,歡迎關注領取學習資源
[點選並拖拽以移動]
一、推導式
列表推導式是Python基礎,好用,而又非常重要的功能,也是最受歡迎的Python特性之一。本質上可以把列表推導式理解成一種集合了變換和篩選功能的函式,通過這個函式把一個列表轉換成另一個列表的過程。
(1) 普通推導式
# 簡單列表推導式
list_test = [i for i in range(5)]
print(list_test)
# 生成偶數(1-10之間)
list_test = [i for i in range(1,11) if i%2==0]
print(list_test)
# 生成奇數(1-10之間)
list_test = [i for i in range(1,11) if i%2!=0]
print(list_test)
# 生成平方數(1-10之間)
list_test = [pow(i,2) for i in range(1,11)]
print(list_test)
'''
result:
[0, 1, 2, 3, 4]
[2, 4, 6, 8, 10]
[1, 3, 5, 7, 9]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
'''
(2)二維推導式
# 2-19所有的合數
list_test0 = {j for i in range(2,20) for j in range(i*i,20,i)}
print(list_test0)
# 2-19所有的質數
list_test1 = [i for i in range(2,20) if i not in list_test0]
print(list_test1)
'''
result:
{4, 6, 8, 9, 10, 12, 14, 15, 16, 18}
[2, 3, 5, 7, 11, 13, 17, 19]
'''
Python中還有字典推導式、元組推導式、集合推導式等,與列表推導式使用方式大致相同。
列表推導式的使用非常廣泛,從實際使用經驗來看,列表推導式使用的頻率是非常高的,也是相當好用的。不過對於多層for迴圈,複雜篩選條件的,使用列表推導式不一定好,因為這樣雖然節省了程式碼量,但同時讓人讀起來和理解起來更加困難,這個時候建議直接用多個普通for迴圈方式實現就可以了。
二、enumerate 和 format 函式
(1)enumerate 函式
基本介紹:enumerate() 函式用於將一個可遍歷的資料物件(如列表、元組或字串)組合為一個索引序列,同時列出資料和資料下標,一般用在 for 迴圈當中。
enumerate(sequence, start=0)
sequence -- 一個序列、迭代器或其他支援迭代物件。
start -- 下標起始位置,預設為0。
- 基本使用
list_test = ['hello','world','!']
for i in enumerate(list_test):
# print(type(i)) result : <class 'tuple'>
print(i)
result :
(0, 'hello')
(1, 'world')
(2, '!')
'''
從上面可以看出,列舉後的,迭代出的單個物件為元組(tuple)。
- 索引與值分開
for index,values in enumerate(list_test):
# 注意:我這裡 index是int型別的,所以用了str()轉換成str型別
print(str(index)+':'+values)
result :
0:hello
1:world
2:!
(2)format函式
基本介紹:一種格式化字串的函式 ,它增強了字串格式化的功能。
基本語法是通過 {} 和 : 來代替以前的 % 。
format 函式可以接受不限個引數,位置可以不按順序。
- 基本操作
# 不設定指定位置,按預設順序
str_test0 = '你好{}{}!'.format(',','極簡XksA')
print(str_test0)
'''
result:
你好,極簡XksA!
'''
# 設定指定位置,按預設順序
str_test1 = 'Hell0{1}{0}!'.format('XksA',',')
print(str_test1)
'''
result:
Hell0,XksA!
'''
# 解析字典引數
dict_test = {'name':'XksA','age':21}
str_test2 = '我是{name},今年{age}歲!'.format(**dict_test)
print(str_test2)
'''
result:
我是XksA,今年21歲!
'''
# 選擇列表/元組引數
list_test = ['you','XksA'] # ('you','XksA')
str_test3 = 'Do {0[0]} like {0[1]}?'.format(list_test)
print(str_test3)
'''
result:
Do you like XksA?
'''
- format的騷操作
table_head = ['id','name','age']
content = [[1,'XksA',21],[2,'Python',17],[3,'Java',13]]
head = '{0[0]:^8}{0[1]:^8}{0[2]:^8}'.format(table_head)
print(head)
for i in content:
content_test = '{0[0]:^8}{0[1]:^8}{0[2]:^8}'.format(i)
print(content_test)
'''
result :
id name age
1 XksA 21
2 Python 17
3 Java 13
'''
- 語法解析
格式設定 | 基本含義 |
---|---|
{:>n} | 將欄位寬度設定為n,欄位打印出來時向左對齊 |
{:<n} | 將欄位寬度設定為n,欄位打印出來時向右對齊 |
{:^n} | 將欄位寬度設定為n,欄位打印出來時居中顯示 |
三、檔案操作
(1)open函式
python open() 函式用於開啟一個檔案,建立一個 file 物件,相關的方法才可以呼叫它進行讀寫。
open(name, mode, buffering)
nam為必填引數,其他選填
name : 一個包含了你要訪問的檔名稱的字串值。
mode : mode 決定了開啟檔案的模式:只讀,寫入,追加等。
所有可取值見如下的完全列表。這個引數是非強制的,預設檔案訪問模式為只讀(r)。
buffering : 如果 buffering 的值被設為 0,就不會有寄存。
如果 buffering 的值取 1,訪問檔案時會寄存行。
如果將 buffering 的值設為大於 1 的整數,表明了這就是的寄存區的緩衝大小。
如果取負值,寄存區的緩衝大小則為系統預設。
(2)讀寫檔案
a.原檔案內容:
b.檔案目錄:I:\123.txt
c.讀檔案
with open(r'I:\123.txt') as file:
# 讀檔案
content = file.read()
print(content)
'''
result :
hello world!我來自中國!
'''
注意:這裡也可以直接open生成IO流物件,不用with,但這個時候使用完,一定要記得close掉IO流,避免資源浪費。
d.寫檔案
with open(r'I:\123.txt',mode='r+') as file:
# 寫檔案
file.write('歡迎關注極簡XksA,Python學習樂園~')
# 寫完後再讀
content = file.read()
print(content)
'''
result :
歡迎關注極簡XksA,Python學習樂園~
'''
注意:在寫檔案時,必須標註寫格式"a+",“r+”,"wb+“等,不然無法寫入,如果不修改mode,預設為"r”,只讀,強制寫入會報錯io.UnsupportedOperation: not writable
。
(3)基本讀寫格式表
四、區域性變數與全域性變數
(1)區域性變數與全域性變數
區域性變數只對該變數所在函式有效,不會影響或修改函式外面的同名變數,所以可以看作,區域性變數優先於全域性變數被使用。
示例:
g_test = 10
def sum():
a0 = 9
g_test = 10-a0
print("區域性變數g_test值為:"+str(g_test))
sum()
print("全域性變數g_test值為:"+str(g_test))
'''
result:
區域性變數g_test值為:1
全域性變數g_test值為:10
'''
可以明顯看出,此時函式域與全域性域中g_test
不相同,雖然我們在函式sum
裡修改了g_test
的值,但對全域性變數g_test
並沒有影響。
(2)global關鍵字
global關鍵字,被global標記的變量表示為全域性變數,另外global不會建立指定的變數,因此我們還是需要在某個地方建立該變數,可在全域性域中給變數賦值定義,也可以在函式域中賦值定義。
示例:
g_test = 10 # 全域性變數
def sum():
global g_test # 註明後面出現的g_test為全域性變數
g_test = 4 # 全域性變數
print("函式域中g_test值為:"+str(g_test))
sum()
print("全域性域中g_test值為:"+str(g_test))
'''
result:
函式域中g_test值為:4
全域性域中g_test值為:4
'''
可以明顯看出,此時函式域與全域性域中g_test
相同了,也就是我們能在函式裡操作全域性變量了。
靈活應用這些基本操作,讓你的工作學習事半功倍。