1. 编程种类

面向对象

面向过程

面向函数

#函数

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)

    1. 形参和实参,位置参数和关键字参数,默认参数

 

第三周-第12章节-Python3.5-函数与函数式编程2数和关键字参数,默认参数

    1. 参数不固定的情况下如何设置形参-

参数组参数(*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')

    1. 函数接收字典形式的参数

#**kwargs:接受N个关键字参数,转换成字典的方式

def test2(**kwargs):

    print(kwargs)

    print(kwargs['name'])

    print(kwargs['age'])

    print(kwargs['sex'])

 test2(name='alex',age=8,sex='F')

    1. 混合用参数

位置参数+字典参数(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')

 

 

    1. 函数局部变量

函数内部可以改局部变量,

函数内无法改全局变量,如果设定了局部变量为全局变量,则可以改全局变量。

函数内无法改全局变量,一般为字符串,

函数内可以改列表,字典,集合,类,无法改元祖,字符串,和整数

 

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)

    1. 递归函数(此处pycharm设置断点调试)

在函数内部可以调用其他函数,如果在函数内部调用自己,就是递归函数

def calc(n):

    print(n)

    if int(n/2)>0:

        return calc(int(n/2))

    print("-->",n)

 

calc(10)

---------------------------

10

5

2

1

    1. 高阶函数

把一个函数作为一个变量传递个另一个函数

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

    1. 装饰器的高级用法

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

 

三层意思

第一层,装饰器添加验证功能

第二层,装饰器添加返回功能

第三层,根据装饰器函数的关键字参数,选择验证方式

        验证方式可以在装饰器的高阶函数里面实现

        但关键字参数传递给装饰器需要再加一层嵌套函数接收-关键字参数

相关文章: