Python中生成器,迭代器,以及一些經常使用的內置函數.

知識點總結

生成器

生成器的本質就是迭代器.python

迭代器:Python中提供的已經寫好的工具或者經過數據轉化得來的.面試

生成器:須要咱們本身用Python代碼構建的數組

建立生成器的三種方法:緩存

  1. 經過生成器函數
  2. 經過生成器推導式
  3. python內置函數或者模塊提供

生成器函數函數

yield:一個yield對應一個next,next超過yield數量,就會報錯,與迭代器同樣.工具

yield與return的區別:源碼分析

  1. return通常在函數中只設置一個,他的做用是終止函數,並傳給函數的執行者返回值
  2. yield在生成器中能夠設置多個,他並不會終止函數,next會獲取對應yield生成的元素
列表推導式

推導式的兩種模式:編碼

  1. 循環模式:[變量(加工的變量) for 變量 in iterable]code

  2. 篩選模式:[變量(加工的變量) for 變量 in iterable if 循環]orm

    循環模式:

    1. 將10之內全部整數的平方寫入列表。

      l1 = [i*i for i in range(1,11)]
      print(l1)
    2. 100之內全部的偶數寫入列表

      l1 = [i for i in range(2,101,2)]
      print(l1)
    3. 從python1期到python100期寫入列表lst

      lst = [f'python{i}' % i for i in range(1,19)]
      print(lst)

    篩選模式:

    1. 將這個列表中大於3的元素留下來。

      l1 = [4, 3, 2, 6, 5, 5, 7, 8] 
      
      print([i for i in l1 if i > 3])
    2. 三十之內能夠被三整除的數。

      multiples = [i for i in range(30) if i % 3 is 0]
      print(multiples)
    3. 過濾掉長度小於3的字符串列表,並將剩下的轉換成大寫字母

      l = ['wusir', 'laonanhai', 'aa', 'b', 'taibai']
      print([i.upper() for i in l if len(i) > 3])
    4. 找到嵌套列表中名字含有兩個‘e’的全部名字(有難度

      names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
               ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
      
      print([name for lst in names for name in lst if name.count('e') >= 2])  # 注意遍歷順序,這是實現的關鍵
    生成器表達式
    1. 生成器表達式和列表推導式的語法上如出一轍,只是把[]換成()就好了。好比將十之內全部數的平方放到一個生成器表達式中

      gen = (i**2 for i in range(10))
      print(gen)
      # 結果: <generator object <genexpr> at 0x0000026046CAEBF8>
    2. 生成器表達式也能夠進行篩選

      # 獲取1-100內能被3整除的數
      gen = (i for i in range(1,100) if i % 3 == 0)
      for num in gen:
          print(num)

    生成器表達式和列表推導式的區別:

    1. 列表推導式比較耗內存,全部數據一次性加載到內存。而.生成器表達式遵循迭代器協議,逐個產生元素。
    2. 獲得的值不同,列表推導式獲得的是一個列表.生成器表達式獲取的是一個生成器
    3. 列表推導式一目瞭然,生成器表達式只是一個內存地址。
    其餘推導式
    1. 字典推導式

      lst1 = ['jay','jj','meet']
      lst2 = ['周杰倫','林俊杰','郭寶元']
      dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
      print(dic)
    2. 集合推導式

      lst = [1,2,3,-1,-3,-7,9]
      s = {abs(i) for i in lst}
      print(s)

內置函數

  1. 普通講:

    all()  any()  bytes() callable() chr() complex() divmod() eval() exec() format() frozenset() globals() hash() help() id() input() int()  iter() locals() next()  oct()  ord()  pow()    repr()  round()
  2. 重點講:

    abs() enumerate() filter()  map() max()  min() open()  range() print()  len()  list()  dict() str()  float() reversed()  set()  sorted()  sum()    tuple()  type()  zip()  dir()
  3. 將來講

    classmethod()  delattr() getattr() hasattr()  issubclass()  isinstance()  object() property()  setattr()  staticmethod()  super()

    eval:執行字符串類型的代碼,並返回最終結果。

    eval('2 + 2')  # 4
    n=81
    eval("n + 4")  # 85
    eval('print(666)')  # 666

    exec:執行字符串類型的代碼。

    s = '''
    for i in [1,2,3]:
        print(i)
    '''
    exec(s)

    hash:獲取一個對象(可哈希對象:int,str,Bool,tuple)的哈希值。

    print(hash(12322))
    print(hash('123'))
    print(hash('arg'))
    print(hash('alex'))
    print(hash(True))
    print(hash(False))
    print(hash((1,2,3)))
    
    '''
    -2996001552409009098
    -4637515981888139739
    2528502973977326415
    '''

    help:函數用於查看函數或模塊用途的詳細說明。

    print(help(list))
    print(help(str.split))

    callable:函數用於檢查一個對象是不是可調用的。若是返回True,object仍然可能調用失敗;但若是返回False,調用對象ojbect絕對不會成功。

    name = 'alex'
    def func():
        pass
    print(callable(name))  # False
    print(callable(func))  # True

    int:函數用於將一個字符串或數字轉換爲整型。

    print(int())  # 0
    print(int('12'))  # 12
    print(int(3.6))  # 3
    print(int('0100',base=2))  # 將2進制的 0100 轉化成十進制。結果爲 4

    float:函數用於將整數和字符串轉換成浮點數。

    complex:函數用於建立一個值爲 real + imag * j 的複數或者轉化一個字符串或數爲複數。若是第一個參數爲字符串,則不須要指定第二個參數。。

    print(float(3))  # 3.0
    print(complex(1,2))  # (1+2j)

    bin:將十進制轉換成二進制並返回。

    oct:將十進制轉化成八進制字符串並返回。

    hex:將十進制轉化成十六進制字符串並返回。

    print(bin(10),type(bin(10)))  # 0b1010 <class 'str'>
    print(oct(10),type(oct(10)))  # 0o12 <class 'str'>
    print(hex(10),type(hex(10)))  # 0xa <class 'str'>

    divmod:計算除數與被除數的結果,返回一個包含商和餘數的元組(a // b, a % b)。

    round:保留浮點數的小數位數,默認保留整數。

    pow:求xy次冪。(三個參數爲xy的結果對z取餘)

    print(divmod(7,2))  # (3, 1)
    print(round(7/3,2))  # 2.33
    print(round(7/3))  # 2
    print(round(3.32567,3))  # 3.326
    print(pow(2,3))  # 兩個參數爲2**3次冪
    print(pow(2,3,3))  # 三個參數爲2**3次冪,對3取餘。

    bytes:用於不一樣編碼之間的轉化。

    s = '你好'
    bs = s.encode('utf-8')
    print(bs)
    s1 = bs.decode('utf-8')
    print(s1)
    bs = bytes(s,encoding='utf-8')
    print(bs)
    b = '你好'.encode('gbk')
    b1 = b.decode('gbk')
    print(b1.encode('utf-8'))

    ord:輸入字符找該字符編碼的位置

    chr:輸入位置數字找出其對應的字符

    #ord 輸入字符找該字符編碼的位置
    print(ord('a'))
    print(ord('中'))
    
    chr 輸入位置數字找出其對應的字符
    print(chr(97))
    print(chr(20013))

    repr:返回一個對象的string形式(原形畢露)。

    # %r  原封不動的寫出來
    # name = 'taibai'
    # print('我叫%r'%name)
    
    # repr 原形畢露
    print(repr('{"name":"alex"}'))
    print('{"name":"alex"}')

    all:可迭代對象中,全都是True纔是True

    any:可迭代對象中,有一個True 就是True

    # all  可迭代對象中,全都是True纔是True
    # any  可迭代對象中,有一個True 就是True
    print(all([1,2,True,0]))
    print(any([1,'',0]))

匿名函數

  1. 匿名函數,顧名思義就是沒有名字的函數,那麼什麼函數沒有名字呢?這個就是咱們之後面試或者工做中常常用匿名函數 lambda,也叫一句話函數。

    函數名 = lambda 參數:返回值

  2. 此函數不是沒有名字,他是有名字的,他的名字就是你給其設置的變量,好比func.

  3. lambda 是定義匿名函數的關鍵字,至關於函數的def.

    func = lambda a,b,*args,sex= 'alex',c,**kwargs: kwargs
    print(func(3, 4,c=666,name='alex')) 
    # {'name': 'alex'}
    # 全部類型的形參均可以加,可是通常使用匿名函數只是加位置參數,其餘的用不到。
  4. lambda 後面直接加形參,形參加多少均可以,只要用逗號隔開就行。

  5. 返回值在冒號以後設置,返回值和正常的函數同樣,能夠是任意數據類型.匿名函數無論多複雜.只能寫一行.且邏輯結束後直接返回數據.

內置函數2
  1. 重點講解:

    print() 屏幕輸出。

    ''' 源碼分析
    def print(self, *args, sep=' ', end='\n', file=None): # known special case of print
        """
        print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
        file:  默認是輸出到屏幕,若是設置爲文件句柄,輸出到文件
        sep:   打印多個值之間的分隔符,默認爲空格
        end:   每一次打印的結尾,默認爲換行符
        flush: 當即把內容輸出到流文件,不做緩存
        """
    '''
    ​
    print(111,222,333,sep='*')  # 111*222*333
    ​
    print(111,end='')
    print(222)  #兩行的結果 111222
    ​
    f = open('log','w',encoding='utf-8')
    print('寫入文件',fle=f,flush=True)

    int():pass

    str():pass

    bool():pass

    set(): pass

    list() 將一個可迭代對象轉換成列表

    tuple() 將一個可迭代對象轉換成元組

    dict() 經過相應的方式建立字典。

    int():pass

    str():pass

    bool():pass

    set(): pass

    list() 將一個可迭代對象轉換成列表

    tuple() 將一個可迭代對象轉換成元組

    dict() 經過相應的方式建立字典。

    list
    l1 = list('abcd')
    print(l1)  # ['a', 'b', 'c', 'd']
    tu1 = tuple('abcd')
    print(tu1)  # ('a', 'b', 'c', 'd')

    abs() 返回絕對值

    i = -5
    print(abs(i))  # 5

    sum() 求和

    print(sum([1,2,3]))
    print(sum((1,2,3),100))

    min() 求最小值

    print(min([1,2,3]))  # 返回此序列最小值
    ​
    ret = min([1,2,-5,],key=abs)  # 按照絕對值的大小,返回此序列最小值
    print(ret)
    # 加key是能夠加函數名,min自動會獲取傳入函數中的參數的每一個元素,而後經過你設定的返回值比較大小,返回最小的傳入的那個參數。
    print(min(1,2,-5,6,-3,key=lambda x:abs(x)))  # 能夠設置不少參數比較大小
    dic = {'a':3,'b':2,'c':1}
    print(min(dic,key=lambda x:dic[x]))
    ​
    # x爲dic的key,lambda的返回值(即dic的值進行比較)返回最小的值對應的鍵

    max() 最大值與最小值用法相同。

    reversed() 將一個序列翻轉, 返回翻轉序列的迭代器 reversed 示例:

    l = reversed('你好')  # l 獲取到的是一個生成器
    print(list(l))
    ret = reversed([1, 4, 3, 7, 9])
    print(list(ret))  # [9, 7, 3, 4, 1]

    bytes() 把字符串轉換成bytes類型

    s = '你好太白'
    bs = s.encode('utf-8')
    print(bs)
    結果:b'\xe4\xbd\xa0\xe5\xa5\xbd\xe6\xad\xa6\xe5\xa4\xa7'
    ​
    s1 = bs.decode('utf-8')
    print(s1)
    結果: 你好太白
    ​
    ​
    s = '你好'
    bs = bytes(s,encoding='utf-8')
    print(bs)
    # 將字符串轉換成字節
    ​
    bs1 = str(bs,encoding='utf-8')
    print(bs1)
    # 將字節轉換成字符串

    zip() 拉鍊方法。函數用於將可迭代的對象做爲參數,將對象中對應的元素打包成一個個元組,

    而後返回由這些元祖組成的內容,若是各個迭代器的元素個數不一致,則按照長度最短的返回

    lst1 = [1,2,3]
    ​
    lst2 = ['a','b','c','d']
    ​
    lst3 = (11,12,13,14,15)
    ​
    for i in zip(lst1,lst2,lst3):
    ​
        print(i)
    ​
    結果:
    ​
    (1, 'a', 11)
    ​
    (2, 'b', 12)
    ​
    (3, 'c', 13)

    sorted排序函數

    語法:sorted(iterable,key=None,reverse=False)
    
    iterable : 可迭代對象
    
    key: 排序規則(排序函數),在sorted內部會將可迭代對象中的每個元素傳遞給這個函數的參數.根據函數運算的結果進行排序
    
    reverse :是不是倒敘,True 倒敘 False 正序
    
    lst = [1,3,2,5,4]
    lst2 = sorted(lst)
    print(lst)    #原列表不會改變
    print(lst2)   #返回的新列表是通過排序的
    
    
    lst3 = sorted(lst,reverse=True)
    print(lst3)   #倒敘
    
    結果:
    [1, 3, 2, 5, 4]
    [1, 2, 3, 4, 5]
    [5, 4, 3, 2, 1]
    
    字典使用sorted排序
    
    dic = {1:'a',3:'c',2:'b'}
    print(sorted(dic))   # 字典排序返回的就是排序後的key
    
    結果:
    [1,2,3]
    
    
    
    
    和函數組合使用
    
    # 定義一個列表,而後根據一元素的長度排序
    lst = ['天龍八部','西遊記','紅樓夢','三國演義']
    
    # 計算字符串的長度
    def func(s):
        return len(s)
    print(sorted(lst,key=func))
    
    # 結果:
    # ['西遊記', '紅樓夢', '天龍八部', '三國演義']
    
    
    和lambda組合使用
    
    lst = ['天龍八部','西遊記','紅樓夢','三國演義']
    
    print(sorted(lst,key=lambda s:len(s)))
    
    結果:
    ['西遊記', '紅樓夢', '天龍八部', '三國演義']
    
    
    lst = [{'id':1,'name':'alex','age':18},
        {'id':2,'name':'wusir','age':17},
        {'id':3,'name':'taibai','age':16},]
    
    # 按照年齡對學生信息進行排序
    
    print(sorted(lst,key=lambda e:e['age']))
    
    結果:
    [{'id': 3, 'name': 'taibai', 'age': 16}, {'id': 2, 'name': 'wusir', 'age': 17}, {'id': 1, 'name': 'alex', 'age': 18}]

    filter篩選過濾

    語法: filter(function,iterable)
    
    function: 用來篩選的函數,在filter中會自動的把iterable中的元素傳遞給function,而後根據function返回的True或者False來判斷是否保留此項數據
    
    iterable:可迭代對象
    
    lst = [{'id':1,'name':'alex','age':18},
            {'id':1,'name':'wusir','age':17},
            {'id':1,'name':'taibai','age':16},]
    
    ls = filter(lambda e:e['age'] > 16,lst)
    
    print(list(ls))
    
    結果:
    [{'id': 1, 'name': 'alex', 'age': 18},
     {'id': 1, 'name': 'wusir', 'age': 17}]

    map

    映射函數
    
    語法: map(function,iterable) 能夠對可迭代對象中的每個元素進映射,分別取執行function
    
    計算列表中每一個元素的平方,返回新列表
    
    lst = [1,2,3,4,5]
    ​
    def func(s):
    ​
        return  s*s
    ​
    mp = map(func,lst)
    ​
    print(mp)
    ​
    print(list(mp))
    
    
    
    
    改寫成lambda
    
    lst = [1,2,3,4,5]
    ​
    print(list(map(lambda s:s*s,lst)))
    
    
    
    
    計算兩個列表中相同位置的數據的和
    
    lst1 = [1, 2, 3, 4, 5]
    ​
    lst2 = [2, 4, 6, 8, 10]
    ​
    print(list(map(lambda x, y: x+y, lst1, lst2)))
    ​
    結果:
    ​
    [3, 6, 9, 12, 15]

    reduce

    from functools import reduce
    def func(x,y):
        return x + y
    ​
    # reduce 的使用方式:
    # reduce(函數名,可迭代對象)  # 這兩個參數必須都要有,缺一個不行
    ​
    ret = reduce(func,[3,4,5,6,7])
    print(ret)  # 結果 25
    reduce的做用是先把列表中的前倆個元素取出計算出一個值而後臨時保存着,
    接下來用這個臨時保存的值和列表中第三個元素進行計算,求出一個新的值將最開始
    臨時保存的值覆蓋掉,而後在用這個新的臨時值和列表中第四個元素計算.依次類推
    ​
    注意:咱們放進去的可迭代對象沒有更改
    以上這個例子咱們使用sum就能夠徹底的實現了.我如今有[1,2,3,4]想讓列表中的數變成1234,就要用到reduce了.
    普通函數版
    from functools import reduce
    ​
    def func(x,y):
    ​
        return x * 10 + y
        # 第一次的時候 x是1 y是2  x乘以10就是10,而後加上y也就是2最終結果是12而後臨時存儲起來了
        # 第二次的時候x是臨時存儲的值12 x乘以10就是 120 而後加上y也就是3最終結果是123臨時存儲起來了
        # 第三次的時候x是臨時存儲的值123 x乘以10就是 1230 而後加上y也就是4最終結果是1234而後返回了
    ​
    l = reduce(func,[1,2,3,4])
    print(l)
    ​
    ​
    匿名函數版
    l = reduce(lambda x,y:x*10+y,[1,2,3,4])
    print(l)
    
    
    
    
    在Python2.x版本中recude是直接 import就能夠的, Python3.x版本中須要從functools這個包中導入
    
    龜叔本打算將 lambda 和 reduce 都從全局名字空間都移除, 輿論說龜叔不喜歡lambda 和 reduce
    
    最後lambda沒刪除是由於和一我的寫信寫了好多封,進行交流而後把lambda保住了.
相關文章
相關標籤/搜索