Python学习笔记-19(闭包函数,装饰器,匿名函数等案例)

2023.4.28

努力学习python,想为以后可以有一份额外收入,如果有大神可以指点一下,我将不胜感激

如果有大神想以后拥有一个合作伙伴进行交流,我会尽力赶上您的脚步!

 1. 牛刀小试,简单小算法

'''题目:给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第i位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。
客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。
例如
输入:accounts = [[1,2,3],[3,2,1]]
输出:6
解释:
第 1 位客户的资产总量 = 1 + 2 + 3 = 6
第 2 位客户的资产总量 = 3 + 2 + 1 = 6
两位客户都是最富有的,资产总量都是 6 ,所以返回 6 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/richest-customer-wealth
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。'''
#函数写法
class Solution(object):
    def maximumWealth(self, accounts):
        list1 = [] #该空列表要放在外面,否则会循环
        for i in range(len(accounts)): #4-7行计算各元素和
            sum = 0 #首先根据总长度循环
            for n in range(len(accounts[i])): #再根据元素长度循环,并拿出其中值相加
                sum += accounts[i][n]
            list1.append(sum) #将各个元素进行加入列表
        return max(list1) #使用函数输出最大
#初学者,代码比较繁琐
#非函数写法
accounts = [[1,2,2],[3,2,1]]
list1 = []
for i in range(len(accounts)):
    sum_1 = 0
    for n in range(len(accounts[i])):
        sum_1 += accounts[i][n]
    list1.append(sum_1)
print(max(list1))

2.牛刀小试,简单小算法

'''题目:
给你一个整数 n ,找出从 1 到 n 各个整数的 Fizz Buzz 表示,并用字符串数组 answer(下标从 1 开始)返回结果,其中:

answer[i] == "FizzBuzz" 如果 i 同时是 3 和 5 的倍数。
answer[i] == "Fizz" 如果 i 是 3 的倍数。
answer[i] == "Buzz" 如果 i 是 5 的倍数。
answer[i] == i (以字符串形式)如果上述条件全不满足。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/fizz-buzz
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。'''
#函数解法
class Solution(object):
    def fizzBuzz(self, n):
        list1 = []
        for i in range(1, n + 1):
            if i % 5 == 0 and i % 3 == 0:
                i = "FizzBuzz"
            elif i % 5 == 0:
                i = "Buzz"
            elif i % 3 == 0:
                i = "Fizz"
            else:
                i = '{}'.format(i)
            list1.append(i)
        return list1
#非函数做法
list1 = []
n = 15
for i in range(1,n+1):
    if i % 3 == 0 and i % 5 == 0:
        i = 'FizzBuzz'
    elif i % 5 == 0:
        i = "Buzz"
    elif i % 3 == 0:
        i = 'Fizz'
    else:
        i = "{}".format(i)
    list1.append(i)

print(list1)

3.1闭包函数 举例1:

def func(a,b):
    c = 10

    def inner_func():
        s = a + b + c
        print('相加结果是:',s)

    return inner_func()

ifunc = func(6,9)
ifunc1 = func(2,8)

3.2 闭包函数 举例 计数器:

def generate_count():
    container = [0]      #可变列表

    def add_one():
        container[0] = container[0] + 1
        print('当前是第{}次访问'.format(container[0]))

    return add_one    #闭包

counter  = generate_count()
counter()        #第一次访问
counter()
counter()
#内部函数记录访问值,每调用一次增加一次访问,将内部函数可以当作为计数器

 4.  装饰器

#定义一个装饰器  decorate(装饰)     wrapper(包装)
def decorate(func):          #装饰器传参
    a = 100
    print('wrapper外层打印测试')
    def wrapper():
        func()
        print('---------->刷漆')
        print('---------->铺地板',a)

    print('wrapper加载完成....')
    return wrapper

#使用装饰器   在装饰的上层,添加@装饰器函数
@decorate            #如果不调用,默认做了任务
def house():         #对下面这个房子进行装修,如何使用装饰器呢?
    print('我是毛坯房....')

#不改变原函数的情况下,对函数进行装饰,丰富'''

5. 登录校验 装饰器 案例 

import time

def decorate(func):       #装饰器
    def wrapper():
        print('正在校验中....')
        time.sleep(2)
        print('校验完毕....')
        #调用原函数
        func()
    return wrapper

@decorate
def f1():     #此时的f1就是wrapper
    print('--------f1--------')
f1()
def f2(name):       #在f2里面增加参数
    print('--------f2--------',name)
f2()

def f3(students):
    for stu in students:
        print(stu)
f3()

6. 三层装饰器 的 例子

def outer(a):       #第一层,负责接收参数
    def decorate(func):        #第二层:负责接收函数的
        def wrapper(*args,**kwargs):        #第三层:负责接收函数的
            func(*args)
            print('--->铺地砖{}块'.format(a))

        return wrapper   #返回出来第三层

    return decorate   #返回出来第二层

@outer(a = 10)
def house(time):
    print('我{}拿到了房子钥匙'.format(time))
    
house(20)

7.使用装饰器写  登录支付 函数   案例

#使用装饰器写一个登录函数
import time
islogin = False
#定义一个装饰器,用来判断是否登录
def login():
    username = input('请输入用户名:')
    password = input('请输入密码: ')
    if username == 'admin' and password == '123456':      #判断是否正确
        return True         #如果正确返回True  那么 islogin = login() 就等于 islogin = True
    else:
        return False
def login_required(func):                    #第二步,定义判断登录装饰器
    def wrapper(*args,**kwargs):
        global islogin
        #这里需要验证登录
        if islogin:                        #判断是否登录,默认为没有登录 , 在第三步过后,该函数发现了错误,原因是修改外部变量,需要添加global 变量
            func(*args,**kwargs)
        else:
            #跳转到登录
            print('你还没有登录呢!')
            islogin = login()                    #在这里需要定义 用户登录函数,用来登录,进入第三步
            print('结果是:',islogin)
    return wrapper       #记得要返回
#定义一个支付的函数,用来支付
@login_required
def pay(money):                            #第一步,定义付款函数
    print('-------付款--------')
    print('正在付款,付款金额是{}'.format(money))
    print('付款中...')
    time.sleep(2)
    print('付款成功!')
    #有了付款,但是没有判断函数,是否判断登录,需要定义装饰器用来判断是否登录

pay(1000)

pay(800)

8. 匿名函数举例

#匿名函数
#普通函数举例
def add(a,b):
    s = a + b
    return s

result = add(1,2)
print(result)

#改变为匿名函数
s = lambda a , b: a + b

result = s(1,2)
print(result)

s1 = lambda x , y:x * y
result = s1(2,5)
print(result)

 9. 匿名函数作为参数

def func(x,y,func):
    print(x,y)   #首先对x,y传参
    print(func)   #使用匿名函数传参,无值
    s = func(x,y)   #正确的调用匿名函数方式
    print(s)         #输出为3

#调用func
func(1,2,lambda a,b:a + b)

#列表,字典,匿名函数的使用
list1 = [3,5,6,1,2,3]
m = max(list1)
print('列表最大的值:',m)

#如果列表是字典类型呢?那么无法正常比较,需要使用匿名函数
list2 = [{'a': 10, 'b': 20},{'a': 13, 'b': 23},{'a': 16, 'b': 25}]

m = max(list2,key = lambda x: x['a'])
print('列表最大的值:',m)

以上为总结知识点,出自哔哩哔哩千峰宋如宁老师课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值