生成器、lambda等匿名函数

  1. 生成器
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
  1. 模拟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
  1. 内置生成器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)
  1. 生成器表达式

语法:将列表推导式中的中括号替换为小括号

思想:

  列表推导式:储存所有数据

  生成器表达式:推算所有数据

优点:

  列表:获取数据相对灵活(索引切片)

  生成器:节省内存

缺点:

  列表: 内存占用空间大

  生成器:获取数据不灵活(只能从头到尾一次获取)

适用性:

  列表:需要反复灵活的操作数据

  生成器:只需从头到尾一次获取数据
  1. 函数式编程

函数可以赋值给变量,赋值后变量绑定函数

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
  1. 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值