这里有很多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)