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))