函数及装饰器

1、函数

 # 定义函数
 # 如果不主动调用函数,函数是不会执行的
 def say_hello():
     print 'hello1'
     print 'hello2'
     print 'hello3'

 # 函数的调用
 say_hello()


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

 sum_2_sum()

 

"""
函数参数的使用
在函数名后面的小括号内填写 参数
多个参数之间使用 , 分隔
"""
# 定义函数时的变量,叫形参 形参可以任意起名字
def sum_2_sum(num1,num2):
    """

    :param num1:
    :param num2:
    :return:

    """
    result = num1 + num2
    print '%d + %d = %d' %(num1,num2,result)

# 在调用函数的时候
# 在调用函数时传递得参数称为实参(真实的数据信息)
sum_2_sum(5,20)

2、函数变量的作用域

局部变量:在函数内部定义的普通变量,只在函数内部作用,函数执行结束
变量会自动删除
全局变量

#通过变量id来判断哪个是局部变量,哪个是全局变量

例1:

a = 1

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

例2:

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

 

3、函数形参之四大参数:

参数:形参 实参
形参:位置参数 默认参数 可变参数 关键字参数
1.位置参数:形参和实参个数必须保持一致
 def getInfo(name,age):
     print name,age
 getInfo(age=12,name='westos')



2.默认参数:形参和实参的个数可以不一致
 def mypow(x,y=2):

     求x的y次方,y的值默认为2
     :param x:
     :param y:
     :return:
     """
     print x**y
 mypow(4)
 # 默认形参可以改变
 mypow(4,3)

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

 #对list tuple set 解包时,只需要在变量前加 *
 nums = [1,2,3,4,66,78]
 nums1 =(1,2,3,4,5)
 nums2 = {1,2,3}
# *nums:解包
 mysum(*nums2)
mysum(1,2,3,4,5)

4.关键字参数
def getStuInfo(name,age,**kwargs):
    """
    **kwargs:是一个字典;可以传递任意多的key-value对
    :param name:
    :param age:
    :param kwargs:
    :return:
    """
    print name,age
    print kwargs
getStuInfo('westos',18,hobbies=['code','running'],gender ='female')

4、函数的返回值

#返回值:函数运算的结果,还需要进一步操作时,给一个返回值
return用来返回函数执行结果的,如果没有返回值,默认为None
python可以间接返回多个值(返回了一个元组)
一旦遇到return,函数执行结束,后面的代码不会执行

def mypow(x, y=2):
    return x ** y, x + y
    print 'hello'
    # pass

# 对元组进行解包
a,b = mypow(3)
print a,b

map参数:

def f(x):
    return x*x
# map()传入的第一个参数是一个函数,第二个参数是一个序列
print map(f,[1,2,3,4])

print map(lambda x:x*x,[1,2,3,4])

5、装饰器:
"在不改变原函数的基础上,给函数增加功能"
把一个函数当作参数,返回一个替代版的函数
本质上:返回函数的函数


def func1():
     print 'have a nice day!'
 def func2():
     print 'good luck!'

 def outer(func):
     def inner():
         print '*********'
         func()
        print '&&&&&&&&&&&&'
     return inner

 func1 = outer(func1)
 func1()


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

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

# "化妆过的函数"
say = outer(say)
# 其实是调用的新的函数
say(-10)

6、语法糖

def desc(fun):
    def add_info():
        print '中秋快乐'
        fun()
        print '北京欢迎你'
    return add_info

 

# 语法糖
@desc
def login():
    # print '中秋快乐...'
    print 'login....'
    # print '北京欢迎你...'

@desc                         # logout=desc(logout)
def logout():
    print 'logout....'

@desc
def savemoney():
    print '存钱...'

@desc
def transferMoney():
    print '转账....'

    # def ..

login()
logout()
savemoney()
transferMoney()

 

注意:

def desc(fun):

    def add_info():

        print '中秋快乐'

        fun()

        print '北京欢迎你'

    return add_info

 

@desc

def login():

print 'logoin....'

login()

"""上下两个意思相同,装饰器的表达方式和语法糖的表达方式"""

def desc(fun):

    def add_info():
        print '中秋快乐'
        fun()
        print '北京欢迎你'

    return add_info

def logout():
    print 'logout....'
logout()

logout = desc(logout)

logout()

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值