函数

一函数

二函数装饰器
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()
View Code

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)
View Code

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
View Code

默认参数:
默认参数是给参数加上一个默认的值,但我们调用函数的时候,如果传递了这个参数,那么使用我们传递过来的值;如果不传则使用默认的值,默认参数可以有多个,但是必须放在所有参数的最后

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
View Code

动态参数:
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)
View Code

**kwargs

ef func(**kwargs):
    print(kwargs)
 
 
# 执行方式一
func(name='jack',age=18)
 
# 执行方式二
li = {'name':'jack', 'age':18, 'job':'pythoner'}
func(**li)
View Code

装饰器

楔子

import time
def timer(func):
    start = time.time()
    func()
    print(time.time() - start)

def func1():
    print('in func1')


def func2():
    print('in func2')
View Code

装饰器的形成过程

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()
View Code

语法糖

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')
View Code

总结
装饰器的本质:一个闭包函数

  装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

装饰器——带参数的装饰器

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)
View Code

装饰器——成功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'))
View Code

装饰器——带返回值的装饰器

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'))
View Code

开放封闭原则

1.对扩展是开放的

2.对修改是封闭的

装饰器的主要功能和装饰器的固定结构

装饰器的主要功能:

在不改变函数调用方式的基础上在函数的前、后添加功能。

装饰器的固定格式:

ef timer(func):
    def inner(*args,**kwargs):
        '''执行函数之前要做的'''
        re = func(*args,**kwargs)
        '''执行函数之后要做的'''
        return re
    return inner
View Code

带参数的装饰器

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)
View Code

多个装饰器装饰同一函数

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')

 

posted @ 2017-07-26 16:44  Dear坏小子  阅读(139)  评论(0编辑  收藏  举报