python學習-基礎-高階特性
阿新 • • 發佈:2019-01-14
高階特性
print(list(range(1, 100, 2)))
- 切片
#切片 字串,物件,陣列都可以使用 print(list(range(1, 100, 2))) list1 = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] # 取陣列前n個元素 0 - (n-1), 取出前3個元素,如果第一個索引是0,還可以省略: print(list1[:3]) print(list1[1:3]) print(list1[-2:-1]) list2 = list(range(1, 100)) # 取前10個,每隔2個取一個 print(list2[:10:2]) # 所有數,戈2個取一個 print(list2[::2]) # 這樣會直接複製一個list list3 = list2[:] # print(list3) # 去除左右空格 def trim (s): while s[:1] == ' ': s = s[1:] trim(s) while s[-1:] == ' ': s = s[0:-1] trim(s) return s
- 迭代 for in
#迭代 for in # 物件,陣列,字串都可以 # 物件 如果要同時迭代key和value,可以用for k, v in d.items() , 如果要迭代value,可以用for value in d.values() # 陣列,如果想要下標,可以使用enumerate函式: for i, value in enumerate(['A', 'B', 'C']): # 判斷是否可以迭代 from collections import Iterable isinstance('abc', Iterable) # str是否可迭代 isinstance([1,2,3], Iterable) # list是否可迭代 isinstance(123, Iterable) # 整數是否可迭代 # 迭代陣列 返回tuple for x, y in [(1, 1), (2, 4), (3, 9)]: print(x, y) # 查詢最大最小的值 def findMinAndMax(L): if not L: return(None, None) max = min = L[0] for n in L: if max < n: max = n if min > n: min = n return (min, max)
- 列表生成式
# 生成[1x1, 2x2, 3x3, ..., 10x10]怎麼做 # list4 = [] # for x in range(1, 11): # list4.append(x * x) # 或者 list4 = [ x * x for x in range(1, 11)] print(list4) # 兩層迴圈 print([m + n for m in 'ABC' for n in 'XYZ']) # for迴圈後面還可以加上if判斷,這樣我們就可以篩選出僅偶數的平方: #[x * x for x in range(1, 11) if x % 2 == 0] # 列出當前目錄下所有檔案和目錄 # d = {'x': 'A', 'y': 'B', 'z': 'C' } # for k, v in d.items(): # print(k, '=', v) # [k + '=' + v for k, v in d.items()] 生成陣列 # L = ['Hello', 'World', 'IBM', 'Apple'] # [s.lower() for s in L] import os print([d for d in os.listdir('.')]) # 請修改列表生成式,通過新增if語句保證列表生成式能正確地執行: list5 = ['Hello', 'World', 18, 'Apple', None] list6 = [x.lower() for x in list5 if isinstance(x, str)] print(list6)
- 生成器 generator
# 生成器 generator。
# 如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不必建立完整的list,從而節省大量的空間。在Python中,這種一邊迴圈一邊計算的機制,稱為生成器
g1 = (x * x for x in range(10))
print(g1)
print(next(g1))
print(next(g1))
# 正確的方式,應該使用for迴圈
for n in g1:
print(n)
#
# 斐波拉契數列 generator函式
def fib(max):
n, a, b = 0, 0, 1
while n < max:
#print(b)
yield b
# 賦值語句:
a, b = b, a + b
n = n + 1
return 'done'
# 普通函式直接呼叫
# fib(6)
# 生成器函式 for 迴圈, 不然只能通過next函式一次一次的呼叫,如果呼叫次數多了,會報錯
for n in fib(6):
print(n)
# 楊輝三角
def triangles(n):
l = [1]
while True:
yield l
# 第一次中間是空陣列
l = [1] + [l[x] + l[x + 1] for x in range(len(l) - 1)] + [1]
if len(l) > n:
break
for linevalue in triangles(10):
print(linevalue)
- 迭代器
# 迭代器
# for迴圈的資料型別有以下幾種:
# 一類是集合資料型別,如list、tuple、dict、set、str等;
# 一類是generator,包括生成器和帶yield的generator function。
# 這些可以直接作用於for迴圈的物件統稱為可迭代物件:Iterable。
# 可以使用isinstance()判斷一個物件是否是Iterable 列舉物件:
from collections import Iterable, Iterator
print(isinstance([], Iterable))
isinstance({}, Iterable)
isinstance('abc', Iterable)
print(isinstance((x for x in range(10)), Iterable))
# # 可以被next()函式呼叫並不斷返回下一個值的物件稱為迭代器:Iterator。
# # 可以使用isinstance()判斷一個物件是否是Iterator物件:
print(isinstance((x for x in range(10)), Iterator)) # True
print(isinstance([], Iterator)) # Flase
# 但是可以通過iter()函式轉為Iterator
print(isinstance(iter([]), Iterator))
# Python的for迴圈本質上就是通過不斷呼叫next()函式實現的
# 首先獲得Iterator物件:
# it = iter([1, 2, 3, 4, 5])
# # 迴圈:
# while True:
# try:
# # 獲得下一個值:
# x = next(it)
# except StopIteration:
# # 遇到StopIteration就退出迴圈
# break
# 等同於
# for x in [1, 2, 3, 4, 5]:
# pass