生成器 lambda等匿名函式

2021-10-10 03:26:43 字數 3957 閱讀 4197

生成器

class commoditycontroller:

def __init__(self):

self.__list_commodity =

def add_commodity(self, commodity):

def __iter__(self):

# 1. 將yield以前的**作為__next__函式體

# 2. 將yield以後的資料作為__next__返回值

# 3. 最後乙個__next__在建立異常stopiteration

index = 0

yield self.__list_commodity[index]

index += 1

yield self.__list_commodity[index]

index += 1

yield self.__list_commodity[index]

controller = commoditycontroller()

controller.add_commodity("屠龍刀")

controller.add_commodity("倚天劍")

controller.add_commodity("金箍棒")

# for item in controller:

# print(item)

iterator = controller.__iter__()

while true:

try:

item = iterator.__next__()

print(item)

except stopiteration:

break

模擬range函式自定義類

class myrange:

def __init__(self, end):

self.__end = end

def __iter__(self):

index = 0

while index < self.__end:

yield index

index += 1

for number in myrange(5):

print(number)

# my_range = myrange(5)

# iterator = my_range.__iter__()

# while true:

# try:

# number = iterator.__next__()

# print(number) # 0 1 2 3 4

# except stopiteration:

# break

內建生成器enumerate:

快捷鍵:itere+回車

for index, element in enumerate(list01):

​ pass

list01 = [54, 6, 7, 8, 54, 6, 8]

# for item in list01:

# print(item)

# 並沒有修改列表中的資料

# for item in list01:

# item = 100

# item 得到的是元組(索引,元素)

# for item in enumerate(list01):

# print(item)

for index, element in enumerate(list01):

print(index, element)

# 讀取元素時,修改元素

for index, element in enumerate(list01):

# 通過element判斷元素是否滿足條件

if element > 10:

# 通過index修改元素

list01[index] = 100

print(list01)

生成器表示式

語法:將列表推導式中的中括號替換為小括號

思想:

列表推導式:儲存所有資料

生成器表示式:推算所有資料

優點:

列表:獲取資料相對靈活(索引切片)

生成器:節省記憶體

缺點:

列表: 記憶體占用空間大

生成器:獲取資料不靈活(只能從頭到尾一次獲取)

適用性:

列表:需要反覆靈活的運算元據

生成器:只需從頭到尾一次獲取資料

函式式程式設計

函式可以賦值給變數,賦值後變數繫結函式

def func01():

print(「func01執行了」)

a = func01 # 此時函式不執行

func01()

a()def func02():

print(「func02執行了」)

def func03(func):

print(「func03執行了」)

func()

func03(func02)

需求:

定義函式,在員工列表中查詢編號是1003的員工

定義函式,在員工列表中查詢姓名是孫悟空的員工

步驟: 1. 根據需求,寫出函式。

2. 因為主體邏輯相同,核心演算法不同.

所以使用函式式程式設計思想(分、隔、做)

建立通用函式find_single

3. 在當前模組中呼叫

練習:exercise06

lambda表示式:匿名函式

lambda只支援乙個語句,且不能是賦值語句

# 1. 有引數有返回值

# def func01(p1, p2):

# return p1 > p2##

# print(func01(10, 6))

func01 = lambda p1, p2: p1 > p2

print(func01(10, 6))

# 2. 無引數有返回值

# def func02():

# return 500

## print(func02())

func02 = lambda: 500

print(func02())

# 3. 有引數無返回值

# def func03(p1):

# print("引數是:",p1)

## func03(10)

func03 = lambda p1: print("引數是:", p1)

func03(20)

# 4. 無引數無返回值

# def func04():

# print("我是func04")

## func04()

func04 = lambda: print("我是func04")

func04()

# 5. lambda 不支援賦值語句

def func05(p1):

p1[0] = 200

list01 = [100]

func05(list01)

print(list01) # ?

# lambda p1: p1[0] = 200

# 6. lambda 只支援一條語句

# def func06():

# for number in range(10):

# print(number)##

# func06()

# lambda :for number in range(10): print(number)

生成器,函式式程式設計等

生成器 語法 def 函式名 yield 資料 生成許多資料 變數 for 變數 in 可迭代物件 if 條件 現象 延遲呼叫 惰性操作 核心 推算資料 優點 節省記憶體 缺點 獲取資料不靈活 不能索引切片,只能用一次 解決方法 轉換為容器 適用性 函式得結果有多個,使用yield來返回 函式得結果...

函式迭代器 生成器 簡單lambda

iter 函式用來生成迭代器 迭代器測試 a list 1,2,3 for i in iter a list print i for i in a list print i range start,stop step 引數說明 start 計數從 start 開始。預設是從 0 開始。例如range...

等概率生成器

假設生成0的概率是p,生成1的概率是1 p,則生成01和10的概率相等。隨機生成0 1 int rand z one 等概率生成0 1即概率為0.5 int newrand int n1 rand z one int n2 rand z one if n1 0 n2 1 return 1 if n1...