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))
原文地址:https://www.cnblogs.com/zh1127487137/p/12552789.html