生成器 推導式 內建函式

周華麗發表於2019-07-19

今日總結

  1. 生成器

    生成器的本質就是一個迭代器

    生成器和迭代器的區別:

    ​ 生成器是 python 自帶的

    ​ 生成器是程式設計師寫的

  2. 生成器

  • 節省空間-------惰性機制
  • 不能逆行
  • 一次性
  • 一個 next 對應一個 yield
  • yield 能夠返回內容,還能夠返回多次
  • yield 能夠臨時停止迴圈
  • yield 能夠記錄執行的位置
  • yield from —— 將一個可迭代物件的元素逐個返回
  1. 定義一個生成器

    基於函式

    函式體中存在 yield 就是一個生成器

    函式名 ( ) 就是產生一個生成器

推導式

list : [ ] [ 變數(加工後的變數) for 迴圈 加工條件]

dic : {} {鍵 : 值 for 迴圈 加工條件}

set : { } {變數 (加工後的變數) for 迴圈 加工條件 }

生成迭代器 : ( 變數 (加工後的變數) for 迴圈 加工條件)

內建函式

生成器

迭代器:python 中內建的一種節省空間的工具

生成器的本質是一個迭代器

迭代器和生成器額區別 : 一個是 python 自帶的,一個是程式設計師自己寫的

def func():
    if 3 > 2:
        yield "你好"
    if 4 > 2:
        yield "我好"
    yield "大家好"
g = func()
print(g.__next__())
print(g.__next__())
print(g.__next__())

#
你好
我好
大家好

下面這樣的結果也是一樣的
def func():
    if 3 > 2:
        yield "你好"
    if 4 > 2:
        yield "我好"
    yield "大家好"
g = func()
for i in g:
    print(i)

# for 迴圈的本質
while True:
    try:
        print(g.__next__())
    except StopIteration :
        break
def foo():
    for i in range(10):
        pass
        yield i
    count = 1
    while True:
        yield count
        count += 1
g = foo()
print(next(g))
print(next(g))
print(next(g))

# 或者for i in g
      print(i)
這裡是新的坑


def foo():
    for i in range(10):
        pass
        yield i
    count = 1
    while True:
        yield count
        count += 1
print(foo().__next__())
print(foo().__next__())    #記住這個是呼叫新的生成器

#
0
0
send()   只是瞭解


def func():
    a = yield "是send"
    print(a)
    yield "你好"
g = func()
print(g.send(None))  #send  第一次只能是 None
print(g.send(123))

生成器應用場景

def func():
    lst = []
    for i in range(1000000):
        lst.append(i)
    return lst
print(func())   #這個結果實在是太強大了,雞蛋太多  所以找只雞 想吃就下一個


所以參考下面的程式碼


def func():
    for i in range(100000):
        yield i
g = func()
for i in range(50):     #想吃幾個拿幾個
    print(next(g))

def func():
    lst1 = ["牛肉羊","雞蛋羹","玉米","火腿腸","米飯","拉麵"]
    for i in lst1:
        yield i
g = func()
print(next(g))
print(next(g))
#
牛肉羊
雞蛋羹
def func():
    lst1 = ["牛肉羊","雞蛋羹","玉米","火腿腸","米飯","拉麵"]
    lst2 = ["小浣熊","蘋果","梨子","桃子","西瓜","芒果"]
    yield from lst1
    yield from lst2
g = func()
print(next(g))
print(next(g))


結果

牛肉羊
雞蛋羹
def func():
    lst1 = ["牛肉羊","雞蛋羹","玉米","火腿腸","米飯","拉麵"]
    lst2 = ["小浣熊","蘋果","梨子","桃子","西瓜","芒果"]
    yield from lst1
    yield from lst2
g = func()
print(next(g))
print(next(g))             #是先走完 lst1   然後再走 lst2
for i in g :
    
#結果

牛肉羊
雞蛋羹
玉米
火腿腸
米飯
拉麵
小浣熊
蘋果
梨子
桃子
西瓜
芒果

生成器總結:

  1. 在函式中將return 改寫成yield 就是一個生成器
  2. yield 會記錄執行位置
  3. return 和 yield 都是返回
  4. return 可以寫多個但是隻執行一次,yield 可以寫多個,還可以返回多次
  5. 一個__next__對應一個 yield
  6. 生成器可以利用 for 迴圈獲取值
  7. yield from—— 將可迭代元素逐個返回
  8. 在函式內部,能將 for 迴圈和 while 迴圈臨時暫停

推導式

list  推導式
[變數 for i in range(20)]

lst = []
for i in range(20):
    lst.append(i)
print(lst)         為了簡潔程式碼  有了以下的操作

print(list(i for i in range(20)))
篩選模式
[變數(加工後的變數) for 迴圈  加工方式]


lst = []
for i in range(20):
    if i % 2 == 0:
        lst.append(i)
print(lst)


#print([i for i in range(20) if i % 2 == 0 ])

這兩個的結果是一樣的,你看第二個多簡潔
生成器表示式
迴圈模式

g = (i for i in range(20))
print(next(g))
print(next(g))

print(list([i for i in range(20)]))
#字典模式
 #  {鍵:值 for 迴圈  加工條件}

print({i:i+1 for i in range(10)})
#{0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}

print({i:i+1 for i in range(20) if i % 2 == 0})
{0: 1, 2: 3, 4: 5, 6: 7, 8: 9, 10: 11, 12: 13, 14: 15, 16: 17, 18: 19}
集合推導式


print({i for i in range(20)})
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}


print({i for i in range(20) if i % 2 == 0 })
{0, 2, 4, 6, 8, 10, 12, 14, 16, 18}
生成器總結
list:

# [變數(加工後的變數) for迴圈]

# [變數(加工後的變數) for迴圈 加工條件]



# 生成器表示式:

# (變數(加工後的變數) for迴圈)

# (變數(加工後的變數) for迴圈 加工條件)



# 字典推導式:

# {鍵:值 for迴圈 加工條件}



# 集合推導式:

# {變數(加工後的變數) for迴圈 加工條件}

內建函式一

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
1
2528502973977326415
'''

help:函式用於檢視函式或模組用途的詳細說明。

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

callable:函式用於檢查一個物件是否是可呼叫的。如果返回True,仍然可能呼叫失敗;但如果返回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]))

相關文章