函数学习要点:
4、函数闭包
5、装饰器
6、内建函数
7、自定义上下文管理器
实践操作代码:
函数闭包(定义:外部函数当中变量被内部函数引用)
#常规函数方式
def func():
a = 1
b = 2
return a+b
#闭包函数
def sum(a):
def add(b):
return a+b
return add#用return返回时,要用内部函数名称返回
# add:函数名称或函数的引用
# add() :函数的调用
num1 = func()
print(num1)
3#输出结果
num2 = sum(2)#初始化
print(num2(4))# 传递add函数参数值
6#输出结果
#闭包实现计数器
def counter(FIRST=0):
cnt = [FIRST]
def add_one():
cnt[0] +=1
return cnt[0]
return add_one
num5 = counter(5)
num10 = counter(10)
print(num5())
print(num5())
print(num5())
print(num10())
print(num10())
#输出结果
6
7
8
11
12
# a * x + b = y
def a_line(a,b):
def arg_y(x):
return a*x+b
return arg_y
def a_line(a,b):
return lambda x: a*x+b
return arg_y
# a=3 b=5
# x=10 y=?
# x=20 y =?
line1 = a_line(3, 5)
print (line1(10))
print (line1(20))
# a=5 b=10,变换a、b值
line2 = a_line(5,10)
def func1( a,b, x)#常规函数需要传递更多参数
摘录闭包函数答疑计数器例子为何用list:
- list (因为是内建函数,所以他)的作用域默认是全局。无论哪里进行了操作、处理,都是本身数据变更了。
2-1. 整型等数据,需要先定义,然后才能使用;且默认的作用域是当前的局部。
2-2. 如果想用整型进行“计数器”的实现,需要声明成 global 类型的变量。而且需要在函数外面就定义出来,不然就无法重置。
成功code :
aCounter = 0
def counter():
def add_one():
global aCounter
aCounter += 1
return aCounter
return add_one
装饰器
import time
print( time.time())# 1970年1月1日到现在走了多少秒
1543722129.949802#输出结果
def timmer(func):
def wrapper():
start_time = time.time()
func()
stop_time = time.time()
print("运行时间是 %s 秒 " % (stop_time - start_time))
return wrapper
@timmer#timmer(i_can_sleep)把函数作为参数传递
def i_can_sleep():
time.sleep(3)
#start_time = time.time()
i_can_sleep()
#stop_time = time.time()
#print('函数运行了 %s 秒' %(stop_time-start_time))
#装饰器带参数
def new_tips(argv):
def tips(func):
def nei(a, b):
print('start %s %s' % (argv, func.__name__))#func.__name__取函数名字
func(a, b)
print('stop')
return nei
return tips
@new_tips('add_module')#装饰器带参数
def add(a, b):
print(a + b)
@new_tips('sub_module')#装饰器带参数
def sub(a, b):
print(a - b)
print(add(4, 5))
print(sub(7, 3))
内建函数:两种方式查找使用方法(1、help(函数名);2、查看官网文档例如:filter)
# filter() map() reduce() zip()
help(filter)#help方法查看函数定义
a=[1,2,3,4,5,6,7]
list(filter(lambda x:x>2 , a))#filter需强制为list类型输出
[3, 4, 5, 6, 7]#输出结果
help(map)#help方法查看函数定义
a=[1,2,3]
list(map(lambda x:x ,a))
[1, 2, 3]#输出结果
list(map(lambda x:x+1 ,a))
[2, 3, 4]#输出结果
b=[4,5,6]
list(map(lambda x,y:x+y ,a,b))
[5, 7, 9]#输出结果
help(reduce)#reduce函数不能直接调用,
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'reduce' is not defined
from functools import reduce#要用模块导入才能使用
reduce(lambda x,y: x+y ,[2,3,4],1 )# 参数为:函数、输入值、初始值
10#输出结果
((1+2)+3)+4#计算过程为初始值与列表第一个值开始相加,然后用相加结果继续相加
for i in zip((1,2,3),(4,5,6)):#实现两个元组按顺序俩俩合并
print(i)
#输出结果
(1, 4)
(2, 5)
(3, 6)
dicta = {'a':'aa' , 'b':'bb'}
dicta = zip(dicta.values(),dicta.keys())#实现字典key和value互换
print(dict(dictb))
{'aa' :'a', 'bb'':b'}#输出结果
自定义上下文管理器
fd = open('name.txt')
try:
for line in fd:
print (line)
finally:
fd.close()
with open('name.txt') as f:#精简上面文件打开方法
for line in f:
print(line)