二、函数进阶
1、概念【特殊用法】:
1、变量可以指向函数
x = abs(-35)print(x) # 35# 一个普通的变量可以指向一个函数,该变量就可以被当做函数调用f = absprint(f)print(f(-100))def check(): print("check")check()f1 = checkf1()
2、函数也可以作为变量名
# 本质:函数名就是一个指向函数的变量print(abs(-28))# abs = "hello"# print(abs(-7))
3、函数作为参数使用
# 调用形参中的函数,必须和原函数保持一致【注意是否需要传递参数】def test(a,b,fun): return fun(a) + fun(b) #abs(43) + abs(-27)print(test(43,-27,abs)) #fun = absdef test1(s1,s2,func): return func(s1) + func(s2)print(test1("hello","gajghj",len))
2、闭包:
在函数内部定义了另一个函数,即存在外部函数和内部函数
闭包【closure】:在外部函数中定义一个内部函数,并且外部函数的返回值是内部函数的引用。
# 普通函数def show(): print("1111") return num1# 闭包def outter(): def inner(): print("inner") return innerf = outter() #f = innerf()# 在闭包设置参数,a和b两个变量被称为自由变量【临时变量】# 闭包的优点:在外部函数中定义的变量,在内部函数可以直接访问def outer1(a): b = 10 def inner1(): print(a + b) return inner1f1 = outer1(23) #f1 = inner1f1()# 内部函数设置参数def outer2(a): b = 10 def inner2(c): print(a + b + c) return inner2f2 = outer2(23)f2(12)
3、装饰器:
装饰器【Decorator】:使其他函数在不需要做任何代码的变动下,为函数添加功能,装饰器的返回值也是一个函数。
本质:装饰器的本质就是一个闭包,其作用是将一个函数作为参数,返回另一个函数
# 装饰器函数运行在函数定义的时候 # 装饰器需要返回一个可执行的对象 # 装饰器返回的可执行对象要兼容函数f的参数import time#1.简单的装饰器def test(): print("hello")# func就是需要被装饰的函数def outer(func): def inner(): # 增加新功能 print("new~~~~") # 调用原函数 func() return innerf1 = outer(test)f1()# 练习:书写装饰器,计算test函数执行的时间def outer(func): def inner(): t1 = time.time() func() t2 = time.time() print(t2 - t1) return innerf1 = outer(test)f1()#2.带有参数的装饰器def getAge(age): print(age)# getAge(10)# getAge(-36)# 注意:被装饰的函数有参数,inner不一定需要设置参数,只有当需要在inner内部对参数进行操作的时候,则需要同步def wrapper1(func): def inner(a): #数据的校验 if a < 0: a = -a func(a) return innerf = wrapper1(getAge)f(10)f(-36)# 使用装饰器语法糖# 注意:使用@,必须保证装饰器存在的情况下,才能给函数增加功能def wrapper2(func): def inner(a): # 数据的校验 if a < 0: a = -a func(a) return inner@wrapper2def getAge1(age): print(age) getAge1(-19)# 参数为不定长参数的装饰器# 使用场景:一个装饰器可以同时作用于多个不同函数的情况def wrapper3(func): def inner(*args,**kwargs): # 新增的功能 print("abc") #调用原函数 func(*args,**kwargs) return inner@wrapper3def test(a,b): print(a,b)test(10,20)@wrapper3def test1(): print("gsjrg")test1()# 多个装饰器作用于同一个函数def wrapper11(func): def inner(*args,**kwargs): # 新增的功能 print("装饰器~~~~11") # 调用原函数 func(*args,**kwargs) return innerdef wrapper22(func): def inner(*args,**kwargs): # 新增的功能 print("装饰器~~~~22") # 调用原函数 func(*args,**kwargs) return inner@wrapper11 # func:check@wrapper22 # func:被wrapper11装饰之后的函数def check(): print("check")check()#总结:多个装饰器作用于同一个函数的时候,从上往下依次执行,但是,原函数只被调用一次
4、偏函数
通过设定默认参数,可以降低调用的难度,偏函数也可以起到这样的作用
概念:对函数的参数做一些控制的函数
注意:偏函数一般不需要自己定义,直接使用【functools模块其中提供了偏函数的使用】
import functoolsprint(int("23534"))# print(int("abc345")) #ValueError: invalid literal for int() with base 10: 'abc345'# 在int中有一个默认参数base,用来指明当前数据的进制print(int("110"))print(int("110",base=10))print(int("1010",base=2))print(int("1010",2))# 自定义一个函数,设置一个默认参数base,默认值设置为2def int2(x,base=2): return int(x,base)print(int2("1010"))print(int2("1010",10))# 系统的functools模块中提供了偏函数的实现# 参数:已经存在的函数名 默认参数int3 = functools.partial(int,base=2)print(int3("1110"))print(int3("1110",base=10))# 思想:根据一个已经存在的函数,通过修改该函数参数的默认值,生成一个新的函数,被称为偏函数
每周项目:
每周1项目|(05)java邮件开发
每周1项目|(04)javaWeb聊天室
每周1项目|(03)java成绩管理系统
每周1项目|(02)网上书店项目
每周1项目|(01)网上商城项目
框架:
着手的第一个框架项目|SSM之MyBatis入门(上)
什么是SSM?
Asp.net
小程序出多端框架啦!!!!!
教学视频:
java开发集合
PHP全套第一、二套视频和资料
python视频和资料+Python全套(内有爬虫)+ Python高级编程技巧
24课时教程+2大实战项目,拿下Bootstrap,冲刺月薪30k的前端工程师!赶紧来领吧!
基础整理:
python篇?
Python基础知识与常用数据类型(07)
Python基础知识与常用数据类型(06)
Python基础知识与常用数据类型(05)
Python基础知识与常用数据类型(04)
Python基础知识与常用数据类型(03)
Python基础知识与常用数据类型(02)
Python基础知识与常用数据类型(01)
java篇?
java基础知识点整理(5)
java基础知识点整理(4)
java基础知识点整理(3)
java基础知识点整理(2)
java基础知识点整理(1)
其他篇?
javaScript——网页特效
CSS选择器
原来大神们都是这么玩的——不一样的html
最常用的标签(2)——标记语言html
最常用的标签(1)——标记语言html
初识编程世界——标记语言html
未完待续.............................................................