1. 程式人生 > >python基礎3—叠代器 | 切片

python基礎3—叠代器 | 切片

rip ble pytho append fib ice 另一個 ++ cas

這裏有很多python特有的東西,非常有意思,以前只接觸過C, C++, Java, Javascript,沒想到還可以這樣玩

# ------------------slice-------------------- #
# slice 切片 從數組切出另一個數組
li = list(range(10))
print(li)   # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# [start, end, step]  || (start - end) 要和 step的正負號一致

print(li[2:5])    # [2, 3, 4]
print(li[:4])    #
[0, 1, 2, 3] print(li[5:]) # [5, 6, 7, 8, 9] print(li[0:20:3]) # [0, 3, 6, 9] # how about minus print(li[5:-2]) # [5, 6, 7] print(li[9:0:-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1] print(li[9:0:1]) # [] print(li[9::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] print(li[::-2]) # [9, 7, 5, 3, 1]
# a new object print(li) re_li = li[::-1] # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] print(re_li) # ------------------comprehension-------------------- # # comprehension 推導列表 # simple case li = [] for i in range(10): li.append(i) print(li) li = list(range(10)): print(li) li = [1] * 10 print
(li) # 淺拷貝 li_2d = [[0] * 3 ] * 3 print(li_2d) li_2d[0][0] = 100 print(li_2d) #深拷貝 li_2d = [ [0] * 3 for i in range(3)] print(li_2d) li_2d[0][0] = 100 print(li_2d) li = (x for x in range(10)) print(type(li)) # generator print(li) # generator object for i in range(10): # way1 print(next(li)) for i in li: # way2 print(i) li = [x for x in range(10)] print(type(li)) # list print(li) # [1, 2, 3, 4] li = {x for x in range(3)} print(type(li)) # set print(li) # {0, 1, 2} s = {x for x in range(10) if x%2==0 } print(type(s)) # set print(s) # {0, 8, 2, 4, 6} s = [ x%2==0 for x in range(10)] print(type(s)) # list print(s) # [True, False, Ture, False,Ture, False, Ture, False, Ture, False] d = {x: x % 2 == 0 for x in range(10)} print(type(d)) # list print(d) # {0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False} # so ‘x for x in range(10)‘ is a comprehension # generator 將真正的計算推遲到使用時 不一次性生成很多元素,省內存 # 2.7 版本時一次性生成100W個數字,在3.5版本並不是真正生成100W個數字而是在next取值時才生成 print(type(range(10))) # type # 平方表 square_table = [] for i in range(50000): square_table.append(i * i) for i in range(5): print(square_table[i]) square_generator = ( x * x for x in range(50000)) print(type(square_generator)) # generator for i in range(5): print(next(square_generator)) def fib(limit): n, a, b = 0 , 0 , 1 while n < limit: yield b a, b = b, a + b n += 1 pass import traceback f = fib(5) print(type(f)) print(next(f)) print(next(f)) print(next(f)) print(next(f)) print(next(f)) try: print(next(f)) except StopIteration: traceback.print_exc() for i in fib(5): print(i) # Iterable Iterator # 可叠代 和 叠代器不一樣的概念, 可叠代表示可以用for循環, 而叠代器是用來使用next()不斷返回下一個值,采用惰性計算 # 生成器一定是叠代器 使用一個生成一個 看下面的fib例子 from collections import Iterable from collections import Iterator print(isinstance([1,2,3], Iterable)) # True print(isinstance({}, Iterable)) # True print(isinstance(123, Iterable)) # False print(isinstance(abc, Iterable)) # True print(isinstance([1, 2, 3], Iterator)) # False g = (x * x for x in range(10)) print(type(g)) # <type ‘generator‘> print(isinstance(g, Iterable)) # True print(isinstance(g, Iterator)) # True for i in g: print(i) def fib(limit): n, a, b = 0 , 0 , 1 while n < limit: yield b a, b = b, a + b n += 1 pass f = fib(5) print(type(f)) print(isinstance(f, Iterable)) # True print(isinstance(f, Iterator)) # True for i in f: print(i)

python基礎3—叠代器 | 切片