-
- 编程种类
面向对象
面向过程
面向函数
#函数
def func1():
"""testing1"""
print('in the func1')
return 0
#过程
def func2():
'''testing2'''
print('in the func2')
x=func1()
y=func2()
print('from func1 return is %s' %x)
print('from func2 return is %s' %y)
-
- 形参和实参,位置参数和关键字参数,默认参数
第三周-第12章节-Python3.5-函数与函数式编程2数和关键字参数,默认参数
-
- 参数不固定的情况下如何设置形参-
参数组参数(*args,**kwargs)---一般放在最后
其中*args可以接收多个位置参数放成元祖的方式
其中**kwargs可可以接收多个关键字参数放成字典的方式
def test4(name,age=18,*args,**kwargs):
print(name)
print(age)
print(args)
print(kwargs)
logger("TEST4")
def logger(source):
print("from %s" % source)
test4('alex',age=34,sex='m',hobby='tesla')
-
- 函数接收字典形式的参数
#**kwargs:接受N个关键字参数,转换成字典的方式
def test2(**kwargs):
print(kwargs)
print(kwargs['name'])
print(kwargs['age'])
print(kwargs['sex'])
test2(name='alex',age=8,sex='F')
-
- 混合用参数
位置参数+字典参数(n个关键字参数)+
def test4(name,age=18,*args,**kwargs):
print(name)
print(age)
print(args)
print(kwargs)
logger("TEST4")
def logger(source):
print("from %s" % source)
#name为位置参数
#age=18默认参数 不能放在参数组的后面
#*args接收多个位置参数的参数组--转换成元祖
#**kwargs接收多个关键字参数的参数组--转换成字典
关键字参数如下文:sex='m',hobby='tesla'
test4('alex',age=34,sex='m',hobby='tesla')
-
- 函数局部变量
函数内部可以改局部变量,
函数内无法改全局变量,如果设定了局部变量为全局变量,则可以改全局变量。
函数内无法改全局变量,一般为字符串,
函数内可以改列表,字典,集合,类,无法改元祖,字符串,和整数
def change_name(name):
global school #全局变量
school = "Mage Linux"
print("before change",name,school)
name ="Alex li" #这个函数就是这个变量的作用域
age =23
print("after change",name) #name是局部变量
print("school:",school)
name = "alex"
change_name(name)
print(name)
-
- 递归函数(此处pycharm设置断点调试)
在函数内部可以调用其他函数,如果在函数内部调用自己,就是递归函数
def calc(n):
print(n)
if int(n/2)>0:
return calc(int(n/2))
print("-->",n)
calc(10)
---------------------------
10
5
2
1
-
- 高阶函数
把一个函数作为一个变量传递个另一个函数
-
- 装饰器
装饰器
装饰器=高阶函数+嵌套函数
在嵌套函数timer()内定义一个高阶函数deco()
用高阶函数deco()装饰函数test1()
同时返回高阶函数名——函数内存地址deco
然后test1=deco
#把deco内存地址传给test1变量
此时执行test1()就是执行deco()即 test1()=deco()
如果原来的test1()有参数,
则高阶函数也应该接收参数test1(a)=deco(a)
新test1()比旧test1()功能更全,
#无参数传递函数的装饰举例
import time
def timer(func): #装饰器函数---嵌套函数
def deco(): #定义实际装饰函数----高阶函数
#print(func)
start_time=time.time()
func() #被装饰函数
stop_time=time.time()
print("程序运行时间为:%s" %(start_time-stop_time))
return deco #返回高阶函数的内存地址(函数名字)
@timer #装饰器的使用
def test1():
time.sleep(3)
print("in test1")
# def test2():
# time.sleep(4)
# print("in test2")
test1() #本质是deco()?
#有参数传递装饰器
import time
def timer(func):
def deco(*args,**kwargs):
#print(func)
start_time=time.time()
func(*args,**kwargs)
stop_time=time.time()
print("程序运行时间为:%s" %(start_time-stop_time))
return deco
@timer
def test1():
time.sleep(3)
print("in test1")
@timer
def test2(name):
time.sleep(1)
print(name)
test1()
test2("wanghui")
-
- 装饰器的高级用法
import time
user,passwd = 'alex','abc123'
def auth(auth_type):
print("auth func:",auth_type)
def outer_wrapper(func):
def wrapper(*args, **kwargs):
print("wrapper func args:", *args, **kwargs)
if auth_type == "local":
username = input("Username:").strip()
password = input("Password:").strip()
if user == username and passwd == password:
print("\033[32;1mUser has passed authentication\033[0m")
res = func(*args, **kwargs) # from home
print("---after authenticaion ")
return res
else:
exit("\033[31;1mInvalid username or password\033[0m")
elif auth_type == "ldap":
print("搞毛线ldap,不会。。。。")
return wrapper
return outer_wrapper
def index():
print("welcome to index page")
@auth(auth_type="local") # home = wrapper()
def home():
print("welcome to home page")
return "from home"
@auth(auth_type="ldap")
def bbs():
print("welcome to bbs page")
index()
print(home()) #wrapper()
bbs()
三层意思
第一层,装饰器添加验证功能
第二层,装饰器添加返回功能
第三层,根据装饰器函数的关键字参数,选择验证方式
验证方式可以在装饰器的高阶函数里面实现
但关键字参数传递给装饰器需要再加一层嵌套函数接收-关键字参数