python语法之函数、引用和装饰器

一、函数

1、函数的定义
所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用
函数是带名字的代码块,用于完成具体的工作
需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调用该
任务的函数,让python运行其中的代码,你将发现,通过使用函数,程序编写,阅读,测试
和修复都将更容易
函数的使用包含两个步骤:
【1】定义函数–封装独立的功能
【2】调用函数–享受封装的成果
2、定义函数
def 函数名():
函数封装的代码
【1】def是英文define的缩写
【2】函数名称应该能够表达函数封装代码的功能,方便后续的调用
【3】函数名称的命名应该符合标识符的命名规则
可由字母、下划线和数字组成,不能以数字开头,不能与关键字重名

def sum_2_sum():
    num1 = 36
    num2 = 355
    result = num1 + num2
    print '%d+%d=%d' % (num1,num2,result)
sum_2_sum()

这里写图片描述

3、形参和实参
形参:定义函数时,小括号中的参数,是用来接受参数的,在函数内部作为变量使用,形参可以任意起名字

实参:调用函数时,小括号中的参数,是用来把数据传递到函数内部用的

def sum_2(num1, num2):
    """对两个数字求和"""
    result = num1 + num2
    print '%d + %d = %d' % (num1, num2, result)
sum_2(500, 20)

这里写图片描述

4、局部变量
局部变量:是在函数内部定义的变量,只能在函数内部使用,函数执行结束后,函数内部的局部变量,会被系统回收,不同的函数,可以定义相同名字的局部变量,但是各用各的不会产生影响

a = 1
print 'outside:',id(a)
def fun():
    a = 5
    print 'inside:',id(a)
fun()
print a
print id(a)

这里写图片描述

5、全局变量
全局变量:全局变量是在函数外部定义 的变量(没有定义在某一个函数内),所有函数内部都可以使用这个变量

num = 10
def demo1():
    print 'demo1=====>%d' % num
def demo2():
    print 'demo2=====>%d' % num
demo1()
demo2()

这里写图片描述

修改全局变量的值,可以使用global关键字声明一下变量即可

a = 1
print 'outside:',id(a)
def fun():
    global a # 声明a为全局变量
    a = 5
    print 'inside:',id(a)
fun()
print a
print id(a)

这里写图片描述
5、参数的分类(四类:位置参数、默认参数、可变参数、关键字参数)

(1) 位置参数:形参和实参个数必须保持一致

def getInfo(name,age):
    print name,age
getInfo(age=12,name='westos')

这里写图片描述

(2) 默认参数:形参和实参的个数可以不一致

def mypow(x,y=2):
    print x**y
mypow(4)
mypow(4,3)

这里写图片描述

(3) 可变参数:需要用*args来接收数值

def mysum(*args):
    """
    *args:是可变参数
     args:是元组类型数据
     args:名字可变(因为是形参 名字可变)
    :param args:
    :return:
    """
    sum = 0
    for item in args:
        sum += item
    print sum
mysum(1,2,3,4)

这里写图片描述

(4) 关键字参数

def getStuInfo(name,age,**kwargs):
    print name,age
    print kwargs
getStuInfo('westos',18,hobbies=['code','running'],gender ='female')

这里写图片描述

6、函数的返回值
返回值:函数运算的结果,还需要进一步操作时,给一个返回值

return用来返回函数执行结果的,若没有返回值,默认为None,一旦遇到return,函数执行结束,后面的代码不会执行

def mypow(x, y=2):
    return x ** y, x + y
    print 'hello'
# 对元组进行解包
print (mypow(4))
a = mypow(4,3)
print a

二、引用

def test(num):
    print '在函数内部%d对应的内存地址是%d' %(num,id(num))
    result = 'hello'
    print '函数要返回的数据的内存地址是 %d' %id(result)
    return result
a = 10
print 'a变量保存数据的内存地址是%d' %id(a)
r = test(a)
print '%s 的内存地址是 %d' %(r,id(r))

这里写图片描述

三、装饰器

1、装饰器概念
把一个函数当作函数,传递给函数,返回一个加强版的函数
本质上是一个返回值的函数
“在不改变原函数的基础上,给函数增加功能”


2.相关实例
【1】要求给func1加一串*不改变原函数内容

def func1():
    print 'Have a nice day'

# (func)形参,代指func1
def outer(func):
    # inner是装饰后的函数
    def inner():
        print '****************'
        func()
        print '****************'

    return inner  # 不加()表示返回整个函数,加()表示返回函数的值


f = outer(func1)
f()

这里写图片描述

【2】判断年龄,如果值为负数则等于零

def say(age):
    print 'The man is %d years old' % age


def outer(func):
    def inner(age):
        if age <= 0:
            age = 0
        func(age)
    return inner

f = outer(say)
f(-10)

这里写图片描述

【3】使用@符号将装饰器应用到函数

def outer(func):
    def inner(age):
        if age <= 0:
            age = 0
        func(age)
    return inner


@outer
# outer 相当于 f = outer(say)
def say(age):
    print 'The man is %d years old' % age
say(-10)

这里写图片描述

【4】给函数前后加一句内容

def outer(func):
    def inner(*argv): # (*argv) 表示任意多个参数
        print '$$$$$$$$$$$$$$$'
        func(*argv)
        print '$$$$$$$$$$$$$$$'

    return inner


@outer
def sum_2_sum(num1, num2):
    result = num1 + num2
    print result
sum_2_sum(2, 3)

@outer
def func1():
    print 'func1'
func1()

这里写图片描述

【5】带有返回值的装饰器

def outer(func):
    def inner(arg):
        print '验证信息: '
        result = func(arg)
        print '#########'
        return result

    return inner


# func1 =outer(func1)
@outer
def func1(arg):
    print 'func1', arg
    print '**********'
    return 'return'


response = func1('westos')
print response

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_38484607/article/details/82687488