2018年7月2日笔记
7.Python函数对象和闭包
1.函数对象
函数是对象,可以给函数增加属性
def funcF(x,y,z):
print(x,y,z)
funcF(1,2,3)
funcF.abc = "hello python"
print(funcF.abc
上面一段代码的运行结果如下:
1 2 3
hello python
2.函数闭包
1.概念:在一个外函数中定义了一个内函数,内函数运用了外函数的临时变量,并且外函数的返回值是内函数的引用
示例代码:演示函数嵌套和闭包。
def outer(a):
b = 10
def inner():
print(a+b)
return inner
demo = outer(5)
demo()
上面一段代码的运行结果如下:
15
8.Python装饰器
1.定义
装饰器实质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。他经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
2.场景
2.1 通过变量也能调用该函数
def hello():
print("我是最初的hello函数")
#函数也是一个对象,而且函数对象可以赋值给变量
f = hello
f()
上面一段代码的运行结果如下:
我是最初的hello函数
2.2 场景
函数对象有一个name属性,可以获取函数的名字
def hello():
print("我是最初的hello函数")
#获取函数的名字
print(hello.__name__)
上面一段代码的运行结果如下:
hello
2.3 假设增加hello()函数的功能,而完全不改变原来的代码
def outer(func):
def inner(*args,**kwargs):
print("我是%s()函数" %func.__name__)
return func(*args,**kwargs)
return inner
@outer
def hello():
print("我是最初的hello函数")
hello()
上面一段代码的运行结果如下:
我是hello()函数
我是最初的hello函数
2.4 支持多个装饰器
import time
def deco1(func):
print("deco1 decorated")
def wrapper(*args, **kwargs):
print("this is deco1")
startTime = time.time()
func(*args, **kwargs)
endTime = time.time()
ms = (endTime - startTime) * 1000
print("time is %s ms" % ms)
print("deco1 end here")
return wrapper
def deco2(func):
print("deco2 decorated")
def wrapper(*args, **kwargs):
print("this is deco2")
func(*args, **kwargs)
print("deco2 end here")
return wrapper
@deco1
@deco2
def func(a, b):
print("hello, here is func for add:")
time.sleep(1)
print("result is %d" % (a + b))
func(3, 4)
上面一段代码的运行结果如下:
deco2 decorated
deco1 decorated
this is deco1
this is deco2
hello, here is func for add:
result is 7
deco2 end here
time is 1000.9815692901611 ms
deco1 end here
多个装饰器使用的调用顺序:
def one(func):
print('----1----')
def two():
print('----2----')
func()
print('----3----')
return two
def a(func):
print('----a----')
def b():
print('----b----')
func()
print('----c----')
return b
@one
@a
def demo():
print('----demo----')
demo()
上面一段代码的运行顺序如下:
----a----
----1----
----2----
----b----
----demo----
----c----
----3----
如上图所示,红色箭头标记“1”和“3”处越靠近函数的装饰器先被执行,红色箭头标记“2”处越远离函数的装饰器先被执行。
练习
1.定义一个函数,需求:去除列表中重复的元素.
def dropDuplicates(lt):
new_list = []
for i in lt:
if i not in new_list:
new_list.append(i)
return new_list
##第二种方法一行代码解决
def dropDuplicates2(lt):
return list(set(lt))
2.定义一个函数,需求:合并两个列表
def concatList(lt1,lt2):
return lt1 + lt2
def concatList2(lt1,lt2):
lt1.extend(lt2)
return lt1
def concatList3(lt1,lt2):
for i in lt2:
lt1.append(i)
return lt1
3.定义函数,需求:判断三个数中的最大值
def my_max(*args):
return max(*args)
def my_max1(*args):
max_number = args[0]
for i in args:
if i > max_number:
max_number = i
return max_number
4.定义一个函数,需求:实现斐波那契数列
def fibonacci(length):
if length < 1:
print("参数应该为正整数")
if length == 1:
return [1]
elif length == 2:
return [1,1]
lt = [1,1]
for i in range(2,length):
lt.append(lt[i-1] + lt[i-2])
return lt
5.将下列字符串变成字典
t = "k:1|k1:2|k2:3|k3:4"
result = {x:y for x,y in [k.split(':') for k in t.split('|')]}
print(result)
字符串函数
s = 'i love You so much'
print(s.ljust(22, '*'))
print(s.rjust(22, '2'))
print(s.center(22, '*'))
print(s.zfill(22))
print(s.replace('u', '1', 1))
print(s.split(' '))
print(s.upper())
print(s.lower())
print(s.capitalize())
print(s.title())
print(s.swapcase())
print(s.count('o'))
print(s.startswith('i'))
print(s.endswith('!'))
print(s.isalnum())
print(s.isalpha())
print(s.islower())
print(s.isupper())
print(s.istitle())
上面一段代码的运行结果如下:
i love You so much****
2222i love You so much
**i love You so much**
0000i love You so much
i love Yo1 so much
['i', 'love', 'You', 'so', 'much']
I LOVE YOU SO MUCH
i love you so much
I love you so much
I Love You So Much
I LOVE yOU SO MUCH
3
True
False
False
False
False
False
False