1. 程式人生 > 其它 >python-生成器物件-常見內建函式

python-生成器物件-常見內建函式

目錄

異常捕獲(二)

try:
    name
except Exception as e:
    print("程式碼錯誤")
else:
    print('程式碼正常才會執行了')
finally:
    print('程式碼不管是否異常都會執行')

# 斷言
name = 'jason'
assert isinstance(name, str)

# 主動丟擲異常
raise ZeroDivisionError('除數不能為0')

for迴圈本質

d = {'name': 'jason', 'age': 18}
res = d.__iter__()  # StopIteration的異常,該異常是在迴圈物件窮盡所有元素時的報錯

# while實現迴圈列印
while True:
    try:
        print(res.__next__())
    except StopIteration as e:
        break

# for迴圈列印
for i in d:
    print(i)

迭代取值與索引取值對比

  • 迭代取值

    1. 不依賴索引進行取值
    2. 取值的順序都是固定的從左到右,無法重複獲取
  • 索引取值

    1. 可以重複取值
    2. 需要提供有序容器型別才可取值(不是通用方式)

生成器物件

生成器其實就是自定義迭代器

# 定義階段就是一個普通函式
def my_generator():
    print('first')
    yield 11 
    print('second')
    yield 22

"""
當函式體內含有yield關鍵字 那麼在第一次呼叫函式的時候
並不會執行函式體程式碼 而是將函式變成了生成器(迭代器)
"""

res = my_generator()  # 呼叫函式不執行函式體程式碼,而是將函式變成生成器(迭代器)
print(res)  # <generator object my_generator at 0x7fcc5f7d3888>
ret = res.__next__()  # 每執行一個__next__程式碼往下執行到yield停止 返回後面的資料
print(ret)  # first \n 11
ret = res.__next__()  # 再次執行__next__接著上次停止的地方繼續往後 遇到yield再停止
print(ret)  # second \n 22

自定義range功能

def my_range(start, stop=None, step=1):
    if not stop:
        stop, start = start, 0
    while start < stop:
        yield start
        start += step


for i in my_range(2, 10, 2):
    print(i)

yield傳值

def generator_func1(age):
    print('age is %s ' % age)
    while True:
        name = yield
        print('%s NB' % name)


res = generator_func1(18)  # 不會執行函式體程式碼,而是轉換成生成器
res.__next__()
res.send('json')  # 給yield傳值
res.send('xxx')  # 再次給yield傳值

yeild與return對比

相同點:可以返回值,支援多個並且組織成元組
不同點:
    yield:
      1. 函式體程式碼遇到yield不會結束,會'停住'
      2. yield可以將函式變成生成器,並且支援外界傳值
    return:
      1. 函式體程式碼遇到return直接結束

生成器表示式

# 列表生成式
l1 = [11, 22, 33, 44, 55, 66]
res = [i + 1 for i in l1 if i != 44]
print(res)  # [12, 23, 34, 56, 67]

# 生成器表示式
'''生成器表示式內部的程式碼只有在迭代取值的時候才會執行'''

res1 = (i + 1 for i in l1 if i != 44)  
print(res1)  # <generator object <genexpr> at 0x7fbbb7e96ca8>
print(res1.__next__())  # 12 
print(res1.__next__())  # 23
print(res1.__next__())  # 24
  • 筆試題

    # 求和
    def add(n, i):
        return n + i
    # 呼叫之前是函式 呼叫之後是生成器
    def test():
        for i in range(4):
            yield i
    g = test()  # 初始化生成器物件
    for n in [1, 10]:
        g = (add(n, i) for i in g)
        """
        第一次for迴圈
            g = (add(n, i) for i in g)
        第二次for迴圈
            g = (add(10, i) for i in (add(10, i) for i in g))
        """
    res = list(g)
    print(res)
    
    #A. res=[10,11,12,13]
    #B. res=[11,12,13,14]
    C. res=[20,21,22,23]
    #D. res=[21,22,23,24]
    

常見內建函式

1. abs()  # 取絕對值
   print(abs(-10))  # 10
  
2. all()  any()
   l = [11, 22, 0]
   print(all(l))  # 所有元素為True才是True
   print(any(l))  # 所有元素有一個為True就是True
  
3. bin()  oct()  hex() 
   print(bin(12))  # 0b1100  二進位制
   print(oct(12))  # 0o14  八進位制
   print(hex(12))  # 0xc  十六進位制
  
4. bytes()  str()
   res = '測試'
   ret1 = bytes(res, 'utf8')
   print(ret1)  # b'\xe6\xb5\x8b\xe8\xaf\x95'
   ret2 = str(ret1, 'utf8')
   print(ret2)  # 測試
  
5. callable()  # 是否看呼叫(看是否能加括號執行)
   i = 1
	 def f():
       pass
   print(callable(i), callable(f))  # Flse True
  
6. chr()  ord()
   print(chr(65))  # A  按照ASICC碼錶的數字列印字元
   print(ord('A'))  # 65  按照ASICC碼錶的字元列印數字
    
7. complex()  複數
   print(complex(123))  # (123+0j)
  
8. dir()  # 檢視當前物件可以呼叫的名字
   def f():
       pass
   print(dir(f))
  
9. divmode()  # 接收兩個數字型別引數,返回一個包含商和餘數的元組(a // b, a % b)
   print(divmode(101, 10))  # (10 1)
   應用:
      # 生成頁數
      num, more = divmod(201, 10)
      if more:
          num += 1
      print('總共需要%s頁' % num)
      
10. eval()  exec()  # 將字串內的內容載入執行
    s1 = "print('hello')"
    s2 = '''
    for i in range(10):
        print(i)
    '''
    eval(s1)  # 只能執行簡單的內容
    exec(s2)  # 可以執行復雜的內容
    
11. isinstance()  # 判斷是否屬於某個資料型別
    i = 1
		print(isinstance(i, int))  # True
    
12. pow() 
		print(pow(4, 3))  # 64  4**3
  
13. round()
		print(round(4.5))  # 4
		print(round(4.6))  # 5
 
14. sum()  # 求和
    l = [11, 22, 33, 44]
    print(sum(l))  # 110 將列表 l 中的元素求和