1. 程式人生 > >Python小知識 | 這些技能你不會?(二)

Python小知識 | 這些技能你不會?(二)

Python小知識

最近在看《零壓力學Python》,鞏固一下基礎知識,意外收穫到很多常用卻不一定被注意的小知識,分享給大家,學到東西了點贊支援哦~
第一篇:點選這裡檢視第一篇python小技能
個人微信公眾號,歡迎關注領取學習資源
極簡XksA

[點選並拖拽以移動]

一、推導式

列表推導式是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相同了,也就是我們能在函式裡操作全域性變量了。

靈活應用這些基本操作,讓你的工作學習事半功倍。