- 生成器
class CommodityController:
def __init__(self):
self.__list_commodity = []
def add_commodity(self, commodity):
self.__list_commodity.append(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执行了”)
将函数作为参数,可以让func03与其他函数结合.
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)