程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python的高級特性:切片、迭代、列表生成式、生成器、迭代器。

編輯:Python

切片

L = ['a','b','c','e','f']
#取前三個
print(L[0:3])
print(L[:3])
#取後面兩個
print(L[-2:])
print(L[-2:-1])
#生成List
L = list(range(20))
#前10個數 沒兩個取一個
print(L[0:10:2])
#復制
print(L[:])
#字符串切片
S = "ABCDEFG"
print(S[0:2])
print(S[::2])

[Running] python -u "c:\Users\HP\Desktop\學習文檔\AI\AI學習github\test.py"
['a', 'b', 'c']
['a', 'b', 'c']
['e', 'f']
['e']
[0, 2, 4, 6, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
AB
ACEG
[Done] exited with code=0 in 0.084 seconds

迭代

L = ['a','b','c','e','f'] #定義一個鏈表
T = ('g','h','j','k','l') #定義一個元組
#迭代
for ch in L:
print(ch)
for ch in T:
print(ch)
#定義一個字典
D = {
'a':1,'b':2,'c':3}
for key in D: #迭代key
print(key)
for value in D.values(): #迭代value 
print(value)
for value in D.items(): #迭代item
print(value)
#如何判斷是否可以進行迭代
#方法是通過collections.abc模塊的Iterable類型判斷:
from collections.abc import Iterable
print(isinstance(D, Iterable))
print(isinstance(L, Iterable))
print(isinstance(T, Iterable))
print(isinstance(123, Iterable))
#同時引用兩個變量
for x, y in [(1, 1), (2, 4), (3, 9)]:
print(x, y)
[Running] python -u "c:\Users\HP\Desktop\學習文檔\AI\AI學習github\test.py"
a
b
c
e
f
g
h
j
k
l
a
b
c
1
2
3
('a', 1)
('b', 2)
('c', 3)
True
True
True
False
1 1
2 4
3 9
[Done] exited with code=0 in 0.116 seconds

列表生成式

# 生成列表
L = list(range(10))
print(L)
# 生成x*x 結果的列表
L = [x * x for x in range(1, 11)]
print(L)
# 篩選偶數的結果 注意:跟在for後面的if是一個篩選條件,不能帶else
L = [x * x for x in range(1, 11) if x % 2 == 0]
print(L)
#生成全排列 
L = [x+y+z for x in "123" for y in "456" for z in "789" ]
print(L)
#將所有字符串轉換為整型
L1 = [int(x) for x in L]
print(L1)
#訪問當前目錄
import os
L = [d for d in os.listdir('.')]
print(L)
#所有字符串變成小寫
L = ['Hello', 'World', 'IBM', 'Apple']
L1 = [s.lower() for s in L]
print(L1)
#可以篩選的列表生成式
L = [x if x%2==0 else -x for x in range(1,20)]
print(L)
#篩選字符
L1 = ['Hello', 'World', 18, 'Apple', None]
L2 = [s.lower() for s in L1 if isinstance(s,str)]
print(L2)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[4, 16, 36, 64, 100]
['147', '148', '149', '157', '158', '159', '167', '168', '169', '247', '248', '249', '257', '258', '259', '267', '268', '269', '347', '348', '349', '357', '358', '359', '367', '368', '369']
[147, 148, 149, 157, 158, 159, 167, 168, 169, 247, 248, 249, 257, 258, 259, 267, 268, 269, 347, 348, 349, 357, 358, 359, 367, 368, 369]
['ai-edu', 'test.py']
['hello', 'world', 'ibm', 'apple']
[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10, -11, 12, -13, 14, -15, 16, -17, 18, -19]
['hello', 'world', 'apple']

生成器

#要創建一個generator,有很多種方法。第一種方法很簡單,只要把一個列表生成式的[]改成(),就創建了一個generator
#generator保存的是算法,每次調用next(g),就計算出g的下一個元素的值,直到計算到最後一個元素,沒有更多的元素時,拋出StopIteration的錯誤。
G = (x * x for x in range(10))
for i in G:
print(i)
#斐波那契數列
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'
fib(10)
#generator函數:要把fib函數變成generator函數,只需要把print(b)改為yield b就可以了
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
F = fib(10)
print(F)
for i in F:
print(i)
#楊輝三角形
def triangles():
L = [1]
while True:
yield L
L=[1]+[L[n] + L[n+1] for n in range(len(L)-1)]+[1]
n = 0
results = []
for t in triangles():
results.append(t)
n = n+1
if n == 10:
break
for i in results:
print(i)
#注意 調用generator函數會創建一個generator對象,多次調用generator函數會創建多個相互獨立的generator。
[Running] python -u "c:\Users\HP\Desktop\學習文檔\AI\AI學習github\test.py"
0
1
4
9
16
25
36
49
64
81
1
1
2
3
5
8
13
21
34
55
<generator object fib at 0x000002034C2C4890>
1
1
2
3
5
8
13
21
34
55
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
[Done] exited with code=0 in 0.083 seconds

迭代器

可以直接作用於for循環的對象統稱為可迭代對象:Iterable。
一類是集合數據類型,如list、tuple、dict、set、str等;
一類是generator,包括生成器和帶yield的generator function。

from collections.abc import Iterable
from typing import Iterator
print(isinstance([],Iterable)) #列表
print(isinstance({
},Iterable)) #元組
print(isinstance((),Iterable)) #字典
print(isinstance("ABC",Iterable)) #字符串
print(isinstance((x for x in range(10)),Iterable)) # 列表生成式
print(isinstance(100,Iterable)) #整數 False
# 注意: 生成器都是Iterator對象,但list、dict、str雖然是Iterable,卻不是Iterator。
# 把list、dict、str等Iterable變成Iterator可以使用iter()函數:
print(isinstance([],Iterable))
print(isinstance([],Iterator))
#生成器都是Iterator對象,但list、dict、str雖然是Iterable,卻不是Iterator。
#把list、dict、str等Iterable變成Iterator可以使用iter()函數:
print(isinstance([],Iterator))
print(isinstance(iter([]),Iterator))
[Running] python -u "c:\Users\HP\Desktop\學習文檔\AI\AI學習github\test.py"
True
True
True
True
True
False
True
False
False
True
[Done] exited with code=0 in 0.094 seconds

你可能會問,為什麼list、dict、str等數據類型不是Iterator?

這是因為Python的Iterator對象表示的是一個數據流,Iterator對象可以被next()函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration錯誤。可以把這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函數實現按需計算下一個數據,所以Iterator的計算是惰性的,只有在需要返回下一個數據時它才會計算。

Iterator甚至可以表示一個無限大的數據流,例如全體自然數。而使用list是永遠不可能存儲全體自然數的。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved