函数
一函数
二函数装饰器
1 楔子
2 装饰器的形成过程
3开放封闭原则
4装饰器的主要功能以及固定结构
5带参数的装饰器
6多个装饰器装饰同一个函数
三 参数
- 参数:为函数体提供数据
- 返回值:当函数执行完毕后,可以给调用者返回数据。
函数定义:
def是关键字,空格之后是函数名加上(),后面字加上' : '
def是固定的,不能变
函数名只能以字符串,下划线和数字且不能以数字开头
注释:每一个函数都应该对功能与参数进行相应的说明,一般写在函数下面第一行,以增强代码的可读性
函数调用:函数名+()
函数的调用
def mylen(): """计算s1的长度""" s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) mylen()
1、返回值
函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。
执行返回值
def mylen(): """计算s1的长度""" s1 = "hello world" length = 0 for i in s1: length = length+1 return(length) str_len = mylen() print('str_len :%s'%str_len)
eturn关键字的作用
return后面加的是‘返回值’,返回值分别有三种情况:没有返回值,一个返回值,多个返回值
不写return,默认返回值为None
2.参数
函数的有三中不同的参数:
- 普通参数
- 默认参数
- 动态参数
普通参数
def argtest(name,age,fruit_lst,hobby_dic): 2 print 'Hello,me name is %s,i\'m %d year\'s old'%(name,age) 3 print 'My favorite fruits are : %s'%'.'.join(fruit_lst) 4 print 'My hobbies:' 5 for hobby in hobby_dic: 6 print '\t%s'%hobby_dic[hobby] 7 8 lst = ['apple','banana','watermelon'] 9 dic = {'hobby one':'teaism','hobby two':'sing'} 10 argtest('Eva_J',18,lst,dic) 输出的内容: Hello,me name is Eva_J,i'm 18 year's old My favorite fruits are : apple.banana.watermelon My hobbies: teaism sing
默认参数:
默认参数是给参数加上一个默认的值,但我们调用函数的时候,如果传递了这个参数,那么使用我们传递过来的值;如果不传则使用默认的值,默认参数可以有多个,但是必须放在所有参数的最后
def argvtest(argv1,argv2 = 'aaa',argv3 = 'bbb'): print 'argv1:',argv1 print 'argv2:',argv2 print 'argv3:',argv3 argvtest('a1',argv3 = 'a2') 输出的内容: argv1: a1 argv2: aaa argv3: a2
动态参数:
def func(*args) 接受多个参数,内部自动构造元组,序列前加*,避免内部构造元组
def func(**kwargs) 接收多个参数,内部自动构造字典,序列前加**,直接传递字典
def func(*args,**kwargs):接受多个参数,既可以自动构造元组,又可以自动构造字典。
*args
def func(*args): print(args) # 执行方式一 func(11,22,33,55,66) # 执行方式二 li = [11,22,33,55,66] func(*li)
**kwargs
ef func(**kwargs): print(kwargs) # 执行方式一 func(name='jack',age=18) # 执行方式二 li = {'name':'jack', 'age':18, 'job':'pythoner'} func(**li)
装饰器
楔子
import time def timer(func): start = time.time() func() print(time.time() - start) def func1(): print('in func1') def func2(): print('in func2')
装饰器的形成过程
import time def func1(): print('in func1') def timer(func): def inner(): start = time.time() func() print(time.time() - start) return inner func1 = timer(func1) func1()
语法糖
import time def timer(func): def inner(): start = time.time() func() print(time.time() - start) return inner @timer #==> func1 = timer(func1) def func1(): print('in func1')
总结
装饰器的本质:一个闭包函数
装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展
装饰器——带参数的装饰器
ef timer(func): def inner(a): start = time.time() func(a) print(time.time() - start) return inner @timer def func1(a): print(a) func1(1)
装饰器——成功hold住所有函数传参
import time def timer(func): def inner(*args,**kwargs): start = time.time() re = func(*args,**kwargs) print(time.time() - start) return re return inner @timer #==> func1 = timer(func1) def func1(a,b): print('in func1') @timer #==> func2 = timer(func2) def func2(a): print('in func2 and get a:%s'%(a)) return 'fun2 over' func1('aaaaaa','bbbbbb') print(func2('aaaaaa'))
装饰器——带返回值的装饰器
import time def timer(func): def inner(*args,**kwargs): start = time.time() re = func(*args,**kwargs) print(time.time() - start) return re return inner @timer #==> func2 = timer(func2) def func2(a): print('in func2 and get a:%s'%(a)) return 'fun2 over' func2('aaaaaa','bbbbbb') print(func2('aaaaaa'))
开放封闭原则
1.对扩展是开放的
2.对修改是封闭的
装饰器的主要功能和装饰器的固定结构
装饰器的主要功能:
在不改变函数调用方式的基础上在函数的前、后添加功能。
装饰器的固定格式:
ef timer(func): def inner(*args,**kwargs): '''执行函数之前要做的''' re = func(*args,**kwargs) '''执行函数之后要做的''' return re return inner
带参数的装饰器
def outer(flag): def timer(func): def inner(*args,**kwargs): if flag: print('''执行函数之前要做的''') re = func(*args,**kwargs) if flag: print('''执行函数之后要做的''') return re return inner return timer @outer(False) def func(): print(111)
多个装饰器装饰同一函数
def wrapper1(func): def inner(): print('wrapper1 ,before func') func() print('wrapper1 ,after func') return inner def wrapper2(func): def inner(): print('wrapper2 ,before func') func() print('wrapper2 ,after func') return inner @wrapper2 @wrapper1 def f(): print('in f')