多层装饰器、万能装饰器、匿名函数、匿名函数作为参数、列表推导式、集合推导式、字典推导式、生成式

多层装饰器

"""
多层装饰器器:谁离函数近 先装饰谁
"""
#定义装饰器
def zhuang1(func):
    print("
我是装饰器1")

    def inner():
        print("
刷漆")
        func()
    return inner
def zhaung2(func):
    print("
我是装饰器2")
    def inner():
        print("
铺地板")
        func()
    return inner


#
定义一个被装饰的函数
@zhaung2
@zhuang1
def house():
    print("
毛坯房")
house()
None

 

万能装饰器

# 万能装饰器  当 被装饰的函数,参数为多值参数的时候,可以使用这种形式
# 万能装饰器 也可以用来装饰普通的函数
# 定义装饰器
def set_func(func):
    def call_fun(*args, **kwargs):
        print("
添加额外功能")
        return func(*args, **kwargs)

    #
返回原先函数的返回值
   
return call_fun


#
被装饰的函数
@set_func
def test(*args, **kwargs):
    print(args)  #
元组   (1, 2, 3, 4, 5, "a", "b", "c",)
    print(kwargs)  #
字典 {"num":2}
    print("tdsjasjflasj")

var = test(1, 2, 3, 4, 5, "a", "b", "c", num=2)
print(var)

 

普通装饰器

def set_func(func):
    def call_fun(*args, **kwargs):
        print("
添加额外功能")
        return func(*args, **kwargs)

    #
返回原先函数的返回值
   
return call_fun
@set_func  #
糖衣
def man():
    print("
好好上班!")
man()

 

匿名函数: 简化函数定义

不再使用def来定义函数 而是使用lambda

格式:lambda 参数1参数2...:运算

def func_name():
    pass

#
可以使用匿名函数的方式来定义函数---->不需要再考虑函数的命名
def add(a,b):
    result =a+b
    return result

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

#
相当于定义了add函数
var2 = lambda a,b:print(a+b)#ab是参数 print(a+b)是返回值 var2来接收返回值
var2(1,2) #通过var2传递参数

 

匿名函数作为参数

def func1(x,y,func):
    print(x,y)  #1,2
    print(func) #<function <lambda> at 0x000001DFB361A290>
    s = func(x,y)
    print(s) #3
#
调用func1
func1(1,2,lambda a,b:a+b)

 

列表推导式

"""
#
通过旧的列表利用推导式生成新的列表
格式:

[表达式 for 变量 in  旧列表]
或者[表达式 for 变量 in  旧列表 if 条件]
"""

names = ['tom','lily','lucy','jack','ka']

new_names = []
for name in names:#for
循环遍历names列表
   
if len(name) > 3:
        new_names.append(name)
print(new_names)

#
name来生成一个新列表,条件是先遍历names列表,拿去字符串长度大于3的元素
new_names1 = [name for name in names if len(name) > 3]

print(new_names1)

 

列表推导式练习

"""
#
案例2:将1-100之间能被3整除的数字,组成一个新的列表
"""
#做一个1-100之间的集合
new_li = []
for i in range(1,101):
    if i % 3 == 0:
        new_li.append(i)

print("
正常的书写方式------>",new_li)

new_li1 = [i for i in range(1,101) if i % 3 == 0]
print("
列表推导式的方式------>",new_li1)

print(new_li == new_li1) #True
print(new_li is new_li1) #False

 

列表推导式练习2

"""
#
案例3: 要求0-5之间的偶数、奇数,构成一个  元组    列表
# [(偶数,奇数),(偶数,奇数),(偶数,奇数)]
# eg: [(0,1),(0,3),(0,5),,,,(4,5)]
"""

def func():
    new_list = []
    for i in range(5):
        #
偶数
       
if i % 2 == 0:
            for j in range(5):
                if j % 2 != 0:
                    new_list.append((i, j))

    return new_list


print(func())

new_list1 = [(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 != 0]
print(new_list1)

 

"""
#
案例4
list1 = [[1,2,3],[4,5,6],[7,8,9],[1,3,5]]  #得出----> [3,6,9,5]
"""
list1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 3, 5]]
new_list = []
for li in list1:
    new_list.append(li[-1])
print(new_list)


new_list = [li[-1] for li in list1]
print(new_list)

 

"""
 
案例5
列表推导式之
if...else

调整员工的 salary
if salary
大于5000 200,低于5000 500
"""
dict1 = {'name': 'Tom', 'salary': 5000}
dict2 = {'name': 'lucy', 'salary': 8000}
dict3 = {'name': 'jack', 'salary': 4500}
dict4 = {'name': 'lily', 'salary': 3000}
salary_list = [dict1, dict2, dict3, dict4]
for i in salary_list:
    # print(i["salary"] )
    if i["salary"] > 5000:
        i["salary"] += 200

    elif i["salary"] < 5000:
        i["salary"] += 500

print(salary_list)

dict1 = {'name': 'Tom', 'salary': 5000}
dict2 = {'name': 'lucy', 'salary': 8000}
dict3 = {'name': 'jack', 'salary': 4500}
dict4 = {'name': 'lily', 'salary': 3000}
salary_list = [dict1, dict2, dict3, dict4]

new_list = [i["salary"] + 200 if i["salary"] > 5000 else i["salary"] + 200 for i in salary_list]

print(new_list)  # [5200, 8200, 4700, 3200]
print(salary_list)

n = 0
for i in new_list:  #
遍历 # [5200, 8200, 4700, 3200]
    salary_list[n]["salary"] = i  #
遍历原理的旧字典的列表,挨个给每个元素 赋值
                                 
# [{'name': 'Tom', 'salary': 5000}, {'name': 'lucy', 'salary': 8000}, {'name': 'jack', 'salary': 4500}, {'name': 'lily', 'salary': 3000}]
    n += 1

print(salary_list)

 

集合推导式

"""
类似于列表推导式,在列表推导式的基础上添加了一个去除重复项的功能
"""
list1 = [1,2,1,3,5,2,1]
new_set = {x for x in list1}

print(new_set)

#
添加条件 对小于5的元素进行+1操作
new_set2 = {i+1 if i < 5 else i for i in new_set}
print(new_set2)

 

字典推导式

"""
案例:
需求:对字典的
keyvalue进行交换
"""
#定义一个字典
dict1 = {'a':'A','b':'B','c':'D'}
dict2 = {value:key for key,value in dict1.items()}
print(dict2)

#dict1.items()
字典解封装
print(dict1.items())#数据类型:dict_items
                    #dict_items([('a', 'A'), ('b', 'B'), ('c', 'D')])

for i in dict1:
        print(i)

 

生成式

# 1-20的数字 进行 *3的操作

new_list = [i * 3 for i in range(5)]
print(new_list)  #[0, 3, 6, 9, 12]
"""

当我们再 调用 new_list的时候,实际上 ,再内存中,会先创建该列表,
如果打印或者遍历列表, 再从这个内存中取 取值,进行相对于的操作

如果一个列表 有
100万个元素,只需要 对前10个元素进行操作, 是否也需要给 100万个元素的列表 开空间?
"""
#
需求 只取 new_list 的前 3 个值

var = new_list.__iter__()  # 迭代器
print(var)  # <list_iterator object at 0x000001265CED96F0>
print(var.__next__())  # 0
print(var.__next__())  # 3
print(var.__next__())  # 6
print(next(var))  # var.__next__()
等价于 next(var)
print(next(var))

#如果 使用 迭代器的次数 ,大于了 集合元素的个数, 系统报错: StopIteration

 

"""
案例:对于无限循环 对象的处理
斐波那契数列
 
"""
def fib(length):
    a, b = 0, 1  #
    n = 0
    while n < length:
        yield b  # yield
相当于 return b,  但是,yield 后面的
                
# 代码暂时先不执行,当 下次迭代的时候,再继续执行(程序处于阻塞态)
        a, b = b, a + b
        n += 1
    # return print(b)


g = fib(100)
print(g.__next__())   # print(next(g))  1
print(next(g))  # 1
print(next(g))  # 2
print(next(g))  # 3

 生成式练习

def func():
    i = 0
    while i < 5:
        temp = yield i #
看到函数中有yield 就是生成式
       
print("temp----->",temp)

        i += 1
    return "
没有更多数据了!"

result = func()
#print(result.__next__()) #
输出结果是0 ----->yield i
#print(result.__next__()) #
输出结果temp-----> None
                               # 1
print(result.send(None))#
如果第一次生成内容使用的是send(),而且传值,会报错
                       
# TypeError: can't send non-None value to a just-started generator
                        #
这行代码相当于result.__next__()
print(result.__next__()) #
没有传值的功能
print(result.send("第一个值"))
print(result.send("
第二个值")) #send()next()的功能,同时会向生成式中传递值
#print("result----->",result)

"""

迭代器和生成器 都用来产生出具有巨大数量的列表、字典、集合等前面的一些值,而不需要一次性将这个巨大的列表、字典、集合加载到内存
可以使用迭代器
result.__next__()方法或者result.next(),每执行一次,就产生一个值
#生成式
#函数的形式 函数内部有关键字 yield就是一个生成式
#可以使用result.__next__()或者result.next()当函数需要再yield后面传递值的时候,可以使用result.send()
#
如果第一次就用send(),则不能传值
"""

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值