匿名函数与表达式

作业

def outter1(func1):  # 1.定义函数
    print('加载了outter1')  # 13.打印
    def wrapper1(*args, **kwargs):  # 14. 定义内部函数
        print('执行了wrapper1')  # 17.执行代码
        res1 = func1(*args, **kwargs)  # 18.调用 wrapper2
        return res1  # 19 返回调用函数wrapper1的值 返回的是函数名wrapper2()
    return wrapper1  # 15.返回执行函数之后的的返回值回全局 用来接收index

def outter2(func2):  #  2.定义函数
    print('加载了outter2')  # 9. 执行函数 传入的参数是warpper3
    def wrapper2(*args, **kwargs):  # 10.定义内部函数
        print('执行了wrapper2')  # 20.打印
        res2 = func2(*args, **kwargs)  # 21.调用warpper3
        return res2  # 22.返回warpper2 值返回的是函数名warpper3()
    return wrapper2  # 11. otter2 (warpper3)返回全局

def outter3(func3):  # 3.定义函数
    print('加载了outter3')  # 5.执行第一步打印
    def wrapper3(*args, **kwargs):  # 6.定义函数
        print('执行了wrapper3')  # 23 .执行打印
        res3 = func3(*args, **kwargs)  # 24 .调用被装饰的函数 index
        return res3  # 25.调用index()调用函数wrapper返回全局
    return wrapper3  # 7.将函数outter返回值反到全局
@outter1  # 12.将warpper2当参数传入outter1(func1)  index = outter(wrapper2)执行之后的返回值 wrapper1
@outter2  # 8.执行完函数之后返回了warpper3将其传入相邻的语法糖
@outter3  # 4.将index传入
def index():
    print('from index')# 23.执行打印
    return '大佬救我'
index() #  16 . index() = wrppaer1 ()
res = index()  # 26.用变量接收一下 index()返回的值
print(res)  # 27. 打印出反回的值此返回值只能通过调用wrapper3返回值返回无法直接获取

#执行顺序先从语法糖从下往上加载之后再调用index()其实是调用 warpper1()执行从上往下执行




# index = outter1(warpper2)     接收的是warpper1
# warpper2 =outter2(warpper3)   接收的是warpper2
# warpper3 = outter3(index)     接收的是warpper3

昨日内容回顾

  • 多层装饰器

    @outer1
    @outer2
    @outer3  
    def index():
        pass
    
    index = outer1(outer2(outer3(index)))
    
  • 有参装饰器

    当装饰器内部代码需要额外的数据那么无法在原有的两个函数形参中添加额外形参
    def outer1(a,b,c):
        def outer(func_name):
            def inner(*args,**kwargs):
                res = func_name(*args,**kwargs)
                return res
            return inner
    	 return outer
    
    @outer1(1,2,3)  # outer(1,2,3)  @outer  index = outer(index)
    def index():
        print('from index')
       
    @outer(1,2,3)
    def func(user_id,name,pwd):
        pass
        
    '''
    问题1(了解):  最外层outer1形参能否写成 outer1(*args,**kwargs)
    	写没问题 但是使用的时候会冲突 如果真的要用
    		outer1(*a,**k)
    
    专门针对有形参的情况下 
    
    问题2(掌握):  内层inner函数的形参是否可以改写为下面的方式
    	def inner(user_id,*args,**kwargs):
    		func_name(user_id,*args,**kwargs)
    '''
    
  • 递归函数

    函数直接或者间接调用自己  但是无限制的调用没有意义
    递归函数有两个要求
    	1.每次递归都要比上一次简单
    	2.必须要有一个明确的结束条件
    递归函数两大特征
    	 1.递推
        2.回溯
    '''应该要做到什么时候使用递归!!!'''
    
  • 算法之二分法

    算法
    	解决问题的高效方法
    二分法
    	每次取一半  比较中间值 之后再取一半 依次往复...
    常见算法
    	冒泡 快排 插入 堆排 桶排
    
  • 作业讲解

  • 三元表达式

  • 各种生成式

  • 匿名函数

  • 重要内置函数

  • 常见内置函数

今日内容详细

作业讲解

# 1.有参装饰器多种用户认证方式
data_list = ['jason|123', 'kevin|321', 'oscar|222']

def login_auth(condition):
    def outer(func_name):
        def inner(*args, **kwargs):
            username = input('username>>>:').strip()
            password = input('password>>>:').strip()
            if condition == 'absolute':
                if username == 'jason' and password == '123':
                    res = func_name(*args, **kwargs)
                    return res
                else:
                    print('你不是jason 不允许执行')
            elif condition == 'list_type':
                for user_data in data_list:  # 'jason|123'
                    real_name, real_pwd = user_data.split('|')
                    if real_name == username and real_pwd == password:
                        res = func_name(*args, **kwargs)
                        return res
            elif condition == 'file_type':
                with open(r'userinfo.txt','r',encoding='utf8') as f:
                    for line in f:
                        real_name, real_pwd_n = line.split('|')
                        if real_name == username and password == real_pwd_n.strip('\n'):
                            res = func_name(*args, **kwargs)
                            return res
        return inner
    return outer

@login_auth('absolute')
def func1():
    print('from func1')
    return 1
@login_auth('list_type')
def func2():
    print('from func2')
    return 2
@login_auth('file_type')
def func3():
    print('from func3')
    return 3


func1()
func2()
func3()

# 2.递推回溯求解某个人的年龄
def get_age(n):  # age(n) = 18
    if n == 1:
        return 18
    return get_age(n-1) + 2

res = get_age(5)
print(res)


三元表达式

'''减少代码行数'''
1.获取用户用名如果jason欢迎贵宾一位如果不是打印没有权限
user_name = input('pleace onput name>>>:').strip()
if user_name == 'jason':print('欢迎贵宾一位')
else:print('没有权限')
  
  
name = input('输入名字>>>:').strip()
def func(name):  # 定义函数
    print('欢迎贵宾一位') if name == 'jason' else print('没有权限')  #做比对如过条件成立执行前面的条件不成立执行后面的
func(name) # 获取用户数输入调用函数将用户输入的名字传入函数
  
  
 
2.三元表达式仅限于二选一
编写一个函数比较两个数的大小
def my(a,b)
	if a > b
  	return a
  else:
    return b
  return a if a>b else b
res = my(1,9)
print(res)

3.三元表达式的语法结构
值1 if 条件 else 值2
条件成立执行if前面的
条件不成立执行else 后面的
 print '123' if Ture else print '321'  # 123
 print'jason' if False else print 'tony'
 if user_name == 'jason':
  	print('欢迎')
 else:
		print('没钱无法服务')
  print('欢迎') if  user_name == 'jason' else print('没钱无法服务')
 4. 三元表达式不支持嵌套使用
ps:在python中不是代码越精简越好,在精简代码的过程中还需要让别人容易读懂代码内容
  

各种生成式

1.列表生成式
name_list = ['jason', 'kevin', 'oscar', 'jerry', 'tony']
给代码中的字符串加&符

name_list = ['jason', 'kevin', 'oscar', 'jerry', 'tony']
# nwe_list =[]
# for i in name_list:
#      new_name = i +'&'
#      nwe_list.append(new_name)
# print(nwe_list)
name_list = [ func + '&'for func in name_list]  # 先执行for循环将数据一个个拿出然后交给for循环前处理之后一次性返回列表
print(name_list)


func_list = ['jason', 'kevin', 'oscar', 'jerry', 'tony']
func_list = [name + '$' for name in func_list if name != 'jason']  # 先执行for循环然后和后面if做条件判断成立则将
                                                                # 数据给for前面处理不成立则当垃圾删除
print(func_list)
#支持if判断   先执行for循环 然后将一个个的数据值交给if判断 结果为True则最后交给for循环前面处理 只能出现for和if
2.字典生成式
	new_dict = {i: 'jason' for i in range(10) if False}  # 如果条件成立将数据4给循环前面处理然后打印如果不成立则生成空字典
print(new_dict)  # {}

    
3.集合生成式
	new_set = {i for i in range(10) if i == 6}
	print(new_set)  #{6}
  
  '''元组没有生成式 有迭代器 后面重点学习'''
  
  

匿名函数

匿名函数就是没有函数名的函数

语法结构
	lambda 形参: 返回值
具体案例
	(lambda x: x + 1)(123)  直接调用
    res = lambda x: x + 1  命名调用
	 print(res(123))
应用场景
	匿名函数通常都需要配合其他函数一起使用 用于减少代码
dic = {                                                                                     
    'jason': 100,                                                                           
    'aj': 123,                                                                              
    'Bason': 9999999,                                                                       
    'zero': 888}                                                                            
def index(k):  #定一个函数 k 是 'jason'                                                           
    return dic.get(k)   # 返回k对应的值   返回的是 dic.get'jason' = 100                               
res = max(dic, key=index)  # 给k传一个函数名就for循环k前面的数据把for循环出来的值交给函数调用                           
print(res)                                                                                  
                                                                                            
res1 = max(dic, key=lambda k: dic.get(k))   #匿名函数key接收匿名函数lambda形参是k返回值是dic.get(k)          
print(res1)                                                                                 


# print('A' > 'a')
"""
A-Z   65-90
a-z   97-122
"""


匿名集合内置函数使用

max()  # 求最大值
l1 = [223, 3423, 123, 24, 34, 35, 435, 3, 24, 3534, 53, 24, 234, 132, 4234, 456, 456, 5345, 4, 234, 345, 23, 2123432]
res = max(l1)
print(res)  # 2123432

 #  map()使用
l1= [1,2,3,4,4,]  #定义列表 
res = map(lambda func:func+ 20,l1)  # for循环列表将数据以参数的方式给函数调用返回参数加20 然后组成列表辅助给res 
# res 无法直接打印直接打印结果<map object at 0x000001954B581100>
#解决方案 print(list(res))

l1= [1,2,3,4,4,]  #定义列表                                                    
res = map(lambda func:func+ 20,l1)  # for循环列表将数据以参数的方式给函数调用返回的数值加20,然后函数会做保
print(list(res))                                                           
def func_num(func):  #                                                     
    return func + 20                                                       
res2 = map(func_num,l1) # for循环将数据取出然后交给函数调用返回值在原来数据上+20然后会做保存             
print(list(res2))                                                          








filter()
name_list = ['jason', 'tony', 'kiven', 'jrrey']
res = filter(lambda func:func !='jason',name_list)  # 函数 参数 返回值 后面加条件,列表 
print(list(res)) 
def index(func,):
    return func!='jason' 
res1 = filter(index,name_list)  # 循环将列表中数据取出传参给func 返回数据值不等于'jason',如果等于就移除,不等于就将数据拿出打印 
print(list(res1)) 


方式二列表生成式
name_list = [name for name in l1  if name != 'jason']
print(name_list)




from functools import reduce # 模块   
l2 = [1, 2, 3]  
res = reduce(lambda x,y:x+y,l2,100)   # 使用此功能需要倒入一个模块需要两个参数返回值参数相加即可 
print(res)  
def func(x,y):  # 
    return x+y
res1 = reduce(func,l2)  # 循环取出列表的值一次传参进函数func 返回这两个值相加的结果然后在将相加的值传进函数取出下一个值传入函数之后相加 
print(res1)
posted @ 2022-07-07 23:12  懒羊羊A  阅读(41)  评论(0)    收藏  举报