zoukankan      html  css  js  c++  java
  • 09高级函数

      1 """
      2 高级函数
      3 闭包,满足三个条件:
      4 1.存在于嵌套函数中,闭包是内层函数;
      5 2.闭包需要使用外层函数的参数或变量;
      6 3.外层函数把内层函数(闭包)的引用返回。
      7 作用:保护内层函数不被轻易地调用和修改。
      8 """
      9 
     10 # 闭包案例1
     11 # def test(number_01):
     12 #     def test_in(number_02):  # 闭包函数,保护当前函数不会轻易修改
     13 #         print(number_01 + number_02)
     14 #         return number_01 + number_02
     15 #     return test_in
     16 #
     17 #
     18 # result = test(1000)  # test_in 返回,result = test_in
     19 # result(2000)   # 相当于 test_in()
     20 # print(test(500))  # <function test.<locals>.test_in at 0x0000020472269AE8>
     21 # result = test(500)
     22 # ss = result(400)
     23 # print("ss的值为", ss)
     24 
     25 # 闭包案例2
     26 # def outer(start=0):  # start=0是有默认值的参数
     27 #     count = [start]  # count是一个列表,列表中只有一个元素 start,下标为0
     28 #     def inner():
     29 #         count[0] += 1   # count中的下标为0的元素值+1
     30 #         return count[0]
     31 #     return inner
     32 #
     33 #
     34 # aaa = outer(5)
     35 # print(aaa())  # 结果为6
     36 #
     37 #
     38 # 闭包案例3,y=a*x+b
     39 # def test(a, b):
     40 #     def test_in(x):
     41 #         return a*x+b
     42 #     return test_in
     43 #
     44 #
     45 # result1 = test(5, 6)
     46 # print(result1(10))
     47 # result2 = test(7, 8)
     48 # print(result2(100))
     49 # 程序运行结果:
     50 # 56
     51 # 708
     52 
     53 """
     54 装饰器,就是闭包函数。
     55 作用:给已经写好的函数增加一些装饰,比如:验证权限,记录函数执行时间等。
     56 函数,"封闭开放",只能调用,尽量不要修改。
     57 装饰器
     58 概念:是一个闭包,把一个函数当做参数,返回一个替代版的函数
     59 本质上就是一个返回函数的函数
     60 """
     61 
     62 # def wrapper(func):
     63 #     print("正在给函数做装饰...")
     64 #
     65 #     def wrapper_in():
     66 #         print("正在验证函数的权限...")
     67 #         func()
     68 #
     69 #     return wrapper_in
     70 #
     71 #
     72 # @wrapper  # 等于test = wrapper(test)
     73 # def test():
     74 #     print("test is running")
     75 
     76 
     77 # aaa = wrapper(test)
     78 # aaa()
     79 # test = wrapper(test)
     80 # test()
     81 
     82 # import time
     83 #
     84 # aaa = time.time()
     85 # print(aaa)
     86 #
     87 #
     88 # print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
     89 
     90 """
     91 2019-10-14作业:利用装饰器获取并记录函数的执行时间
     92 查第6,7章笔记独立完成
     93 """
     94 # import time  # 引入time模块
     95 
     96 # # 闭包函数,装饰器:通用装饰器,不定长参数
     97 # def test(func):  # 外层函数2,func = a
     98 #     print("开始装饰函数")
     99 #    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))   # 获取时间
    100 #     ticks_1 = time.time()  # 获取时间戳
    101 #
    102 #     def test_in(*args, **kwargs):  # 内层函数,闭包函数,不定长参数
    103 #         print("开始验证权限")
    104 #         # print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))  # 获取时间
    105 #         end = func(*args, **kwargs)  # 使用了外层函数的参数,调用 a(),不定长参数
    106 #         ticks_2 = time.time()  # 获取时间戳
    107 #         print("函数的运行时间需要%f秒" % (ticks_2 - ticks_1))
    108 #         return end
    109 #
    110 #     return test_in  # 外层函数把内层函数的名称(引用)进行了返回。有括号表示调用,不调用不带括号
    111 #
    112 #
    113 # @test  # a = test(a)
    114 # def a(x, y):  # 函数可以作为参数进行传递
    115 #     time.sleep(1)  # 休眠1秒钟
    116 #     print("a is running")
    117 #     print(x + y)
    118 #     z = x + y
    119 #     return z
    120 #
    121 #
    122 # result = a(10, 20)  # 相当于调用test_in()
    123 # print(result)
    124 
    125 
    126 """
    127 通用装饰器,作用:装饰  有无参数,有无返回值  的函数。
    128 """
    129 
    130 # def wrapper_1(name):
    131 #     def wrapper(func):
    132 #         print("正在装饰 %s" % name)
    133 #
    134 #         def inner(*args, **kwargs):
    135 #             print("正在验证权限 %s" % name)
    136 #             print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))  # 获取时间
    137 #             return func(*args, **kwargs)
    138 #
    139 #         return inner
    140 #
    141 #     return wrapper
    142 #
    143 #
    144 # @wrapper_1("test_1")  # 带参数的装饰器
    145 # def test_1(a, b):
    146 #     return a, b
    147 #
    148 #
    149 # # @wrapper_1("test_2")  # 带参数的装饰器
    150 # # def test_2(m, n, r=5):
    151 # #     return m, n, r
    152 #
    153 #
    154 # result_1 = test_1(10, 20)
    155 # print(result_1)
    156 # # result_2 = test_2(100, 200, 300)
    157 # # print(result_2())
    158 """
    159 任务要求:在不修改a函数的基础上,加上"正在装饰和正在验证权限"
    160 装饰器。闭包函数,接收一个函数作为实参,再调用实参来完成原函数的调用。
    161 语法格式:定义a函数的上方,写上@test  装饰器函数名   等于a = test(a)
    162 """
    163 
    164 """
    165 作业:在A4纸上写装饰器,并画出装饰函数的整个过程,2019-10-15
    166 """
    167 """
    168 通用装饰器,不定长参数 return func()
    169 """
    170 
    171 #
    172 # def wrapper(name):   # 带参数的装饰器,name
    173 #     def wrapper_1(func):  # 装饰器
    174 #         print("政委已同意 %s" % name)
    175 #
    176 #         def inner(*args, **kwargs):
    177 #             print("团长李云龙已集合好队伍 %s" % name)
    178 #             return func(*args, **kwargs)
    179 #         return inner
    180 #     return wrapper_1
    181 #
    182 #
    183 # # 独立团,出兵,打鬼子
    184 # @wrapper("独立团")  # --->fight = wrapper(fight)
    185 # def fight_1(a=100):  # a代表枪支
    186 #     print("独立团可以出兵打鬼子了,携带枪支%d支" % a)
    187 #     return "歼灭鬼子参观团"
    188 #
    189 #
    190 # @wrapper("新二团")
    191 # def fight_2(a=100):   # a代表枪支
    192 #     print("新二团可以出兵打鬼子了,携带枪支%d支" % a)
    193 #     return "歼灭鬼子"
    194 #
    195 #
    196 # print(fight_1(200))
    197 # print(fight_2(300))
    198 """
    199 如果一个函数有多个装饰器,自下而上进行装饰
    200 """
    201 # def w1(func1):
    202 #     print("w1正在装饰")  # 1.
    203 #     def w1_inner():
    204 #         print("w1正在验证权限")  # 5.
    205 #         return func1()  # 6.test()
    206 #     return w1_inner
    207 #
    208 # def w2(fun2):
    209 #     print("w2正在装饰")  # 2.
    210 #     def w2_inner():
    211 #         print("w2正在验证权限")  # 3.
    212 #         return fun2()  # 4. w1_inner
    213 #     return w2_inner
    214 #
    215 # @w2  # (2).test = w2(test), test=w2(w1_inner),func2=w1_inner,test=w2_inner
    216 # @w1  # (1).test = w1(test),test=w1_inner,func1=test
    217 # def test():
    218 #     print("test is running.")  # 7.
    219 #
    220 # # 在原函数调用之前,装饰器已经进行了装饰
    221 # test()  # 3.test=w2_inner
    222 #
    223 # @w2  # (2).fight = w2(fight),fight=w1_inner,-->fight = w2(w1_inner)-->
    224 #            # (func2 = w1_inner),fight=w2_inner
    225 # @w1  # (1).fight = w1(fight),(func1=fight),fight = w1_inner
    226 # def fight():
    227 #     print("We are family,we have fighting.")
    228 #
    229 # fight()  # fight=w2_inner
    230 """
    231 与自定义函数(def,lambda).序列相关的三个函数:
    232 1.map(function,iterabele1,iterable2,...iterableN)根据提供的函数对指定的序列做映射
    233 2.filter(function or None,iterable)对指定的序列进行过滤操作,
    234 第1个参数可以是函数的名称或者None,如果function传入None,则返回所有本身可以判断为True的元素。
    235 第2个参数表示的是序列、支持迭代的容器或迭代器。返回值为迭代器对象。
    236 其中,第一个参数如果是function,它只能接收一个参数,而且该函数的返回值为布尔值(True 或 False)。
    237 3.reduce(function,sequence[,initial])->value
    238 function(是一个带有两个参数的函数);第2个参数可以是序列、元组、字符串; 
    239 initial 表示固定的初始值.优先调用.
    240 reduce 会依次从sequence中取出每个元素,
    241 和上一次调用function的结果作为参数再次调用function。
    242 对参数序列中的元素进行累积。
    243 from functools import reduce  从函数工具模块中导入reudce函数,
    244                               调用其中的某一个函数时:函数名()
    245 import functools  导入函数工具模块,调用其中的某一个函数时:模块名.函数名()
    246 """
    247 # func = lambda x:x+2
    248 # result = map(func, [1,2,3,4,5])
    249 # print(result)   # <map object at 0x000002AD14A89400>
    250 # print(list(result))  # [3, 4, 5, 6, 7]
    251 # result_2 = filter(func,[1,2,3,4,5])
    252 # print(list(result_2))
    253 #
    254 # def test(a,b):
    255 #     return a+b
    256 #
    257 # result_1 = map(test, [1,2,3,4,5], [10,20,30,40,50,60,70])
    258 # print(list(result_1))   # [11, 22, 33, 44, 55]
    259 #
    260 # func = lambda x:x%2
    261 # result = filter(func,[1,2,3,4,5])
    262 # print(result)   # <filter object at 0x0000027250B69438
    263 # print(list(result))  # [1, 3, 5]
    264 #
    265 # result_1 = filter(None,[1,0,"","a",2,0.0])  # 过滤,留下True
    266 # print(list(result_1))   # [1, 'a', 2]
    267 # from functools import reduce
    268 # import functools
    269 #
    270 # def func(a, b):
    271 #     return a+b
    272 #
    273 # result = functools.reduce(func, [1,2,3,4,5,6,7])
    274 # print(result)
    275 #
    276 # result_1 = functools.reduce(func, {10, 6}, 5)   # "zzz"是初始值,优先调用
    277 # print(result_1)
    278 #
    279 # result_2 = functools.reduce(func,"abcdefg", "zzz")
    280 # print(result_2)
    281 
    282 # result = filter(None,{"a","b","c"})
    283 # print(list(result))
    284 
    285 """
    286 复习:
    287 1.闭包:函数嵌套的内层函数、
    288   内层函数使用外层函数的变量或参数
    289   外层函数要把内层函数的引用返回
    290 2.装饰器:作用,在不改变原函数的基础上,添加一些装饰
    291 """
    292 import time  # 导入time时间模块
    293 
    294 # 通用装饰器
    295 # def w_1(func):   # func=test
    296 #     print("w1开始进行装饰...")  # 1
    297 #     def inner(*args, **kwargs):
    298 #         ticks_1 = time.time()
    299 #         print("w1开始验证权限")  # 2
    300 #         print(time.strftime("%Y-%m-%d %H:M:%S", time.localtime()))
    301 #         end = func(*args, **kwargs)   # func()-->test()
    302 #         ticks_2 = time.time()
    303 #         print("ticks_2 - tick_1")
    304 #         return end
    305 #
    306 #     return inner  #
    307 #
    308 # def w_2(func):
    309 #     print("w2开始进行装饰...")
    310 #     def inner(*args, **kwargs):
    311 #         print("w2开始验证权限")
    312 #         return func(*args, **kwargs)
    313 #     return inner
    314 #
    315 #
    316 # @w_2
    317 # @w_1   # -->test=w_1(test) func=test   -->test=inner   等待
    318 # def test(a, b):
    319 #     time.sleep(1)
    320 #     print("test is running")
    321 #     print(a, b)  # 100 200
    322 #     c = a + b
    323 #     return c
    324 #
    325 # sum = test(100, 200)  # -->inner(100, 200) -->sum=300
    326 # print(sum)  # 300
    327 
    328 """
    329 其他的一些常用函数:
    330 1.数学模块中的sqrt(x),求x的平方根,首先引入数学模块 import math  -->math.sqrt()
    331 2.abs(x)  求x的绝对值
    332 3.round(x,n)  对浮点数x进行四舍五入取值,n为可选项,代表浮点数量终的小数位数。
    333 4.max()  求最大值
    334 5.min()  求最小值
    335 6.sum()  求和
    336 类型转换相关函数:
    337 1.int()  转换为整形
    338 2.bool()  转换为布尔类型
    339 3.float()  转换为浮点型
    340 4.str()  转换为字符串
    341 5.list()  转换为列表类型
    342 6.tuple()  转换为元组
    343 7.dict()  转换为字典
    344 8.set()  转换为可变集合类型
    345   frozenset()  转换为不可变集合类型
    346 标准输入输出函数:
    347 1.print()  输出函数
    348 2.input()  输入函数
    349 
    350 求序列长度的函数
    351 1.len()  计算某一序列的长度
    352 
    353 常用的函数:
    354 1.eval("字符串")  将字符串做的表达式进行运算功能强大,要慎用。
    355 2.exec() : 执行Python语句,比eval功能更强大,慎用
    356 """
    357 # import math
    358 # print(math.sqrt(4))  # 2.0
    359 # print(math.sqrt(16))  # 4.0
    360 #
    361 # print(abs(-10))  # 10
    362 # print(abs(5.67))  # 5.67
    363 #
    364 # print(round(1.34567, 4))  # 1.3457
    365 # print(round(2.67))  # 3
    366 # print(round(2.67, 0))  # 3.0
    367 # print(round(0.5))  # 0
    368 # print(round(-0.4))  # 0
    369 # print(round(345, 2))  # 345
    370 
    371 # str_1 = input("请输入一个加减乘除的四则运算")
    372 # print(eval(str_1))
    373 
    374 # exec('print("I love python.")')
    375 #
    376 # str_1 = '{"name":"zs","age":20}'
    377 # dict_2 = eval(str_1)  # 使用eval还原字符串原来的样子
    378 # print(dict_2)
    379 # print(type(eval(str_1)))
    380 #
    381 # str_2 = '[1,2,3,4,"abc"]'
    382 # list_1 = eval(str_2)  # 使用eval还原字符串原来的样子
    383 # print(list_1)
    384 # print(type(list_1))
  • 相关阅读:
    SDWebImage笔记
    ASIHTTPRequest类库简介和使用说明
    UIBezierPath 的使用
    SQL Server中的系统表sysobjects使用方法,实现循环遍历所有表(转)
    字符串位数不足8位,则在左边补充0以补足8位数的方法
    SQL表中的自连接定义与用法示例
    SQL Server中 左联接,右联接,内联接的区别
    关于Page_ClientValidate方法,完美实现验证控件成功后confirm确认效果
    给密码类型的TextBox赋值
    利用List的Sort()、Find()、FindAll()、Exist()来解决一些问题
  • 原文地址:https://www.cnblogs.com/zh1127487137/p/12552789.html
Copyright © 2011-2022 走看看