python_03_函数,装饰器

1.函数的概念与作用

所谓函数,就是把具有独立功能的代码块封装成为一个小模块,在需要的时候调用
函数的使用包含两个步骤
       1.定义函数–封装独立的功能
       2.调用函数–享受封装的成果
函数的作用:在开发时,使用函数可以提高编写的效率以及代码的重用
函数:
函数是带名字的代码块,用于完成具体的工作需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调用该任务的函数,让python运行其中的代码,你将发现,通过使用函数,程序编写,阅读,测试和修复都将更容易

2.定义函数

def  函数名():
        函数封装的代码

1)def是英文define的缩写
2)函数名称应该能够表达函数封装代码的功能,方便后续的调用
3)函数名称的命名应该符合标识符的命名规则
       可由字母,下划线和数字组成
       不能以数字开头
       不能与关键字重名

4)参数的作用
把具有独立功能的代码块组织成为一个小模块,在需要的时候调用
函数的参数,增加函数的通用性,针对相同的数据处理逻辑,能够适应更多的数据
1.在函数内部,把参数当作变量使用,进行需要的数据处理
2.函数调用时,按照函数定义的参数顺序,把希望在函数内部处理的数据,通过参数传递
例: 两个数相乘,输出结果

def fun():
    num1 = 10
    num2 = 24
    result = num1 * num2
    print '%d * %d = %d' % (num1, num2, result)
# 调用函数
fun()

执行结果:
这里写图片描述
5)形参和实参
形参:定义函数时,小括号中的参数,是用来接收参数用的,在函数内部作为变量使用
实参:调用函数时,小括号中的参数,是用来把数据传递到函数内部用的
:两个数相乘,输出结果

# num1,num2形参:
def fun(num1, num2):
    m = num1 * num2
    print '%d*%d=%d' % (num1, num2, m)
# 实参:
fun(29, 30)

执行结果:
这里写图片描述

6)函数的返回值
在程序开发中,有时候,会希望一个函数执行结束后(举例子:温度计函数,要返回给我们当前的温度),告诉调用者一个结果,以便调用者针对具体的结果作出后续的处理
返回值是函数完成工作后,最后给调用者的一个结果
在函数中使用return关键字可以返回结果
调用函数一方,可以使用变量来接收函数的返回结果
例: 两个数相乘,输出结果

def fun(num1, num2):
    m = num1 * num2
    return m
# 函数返回值
result = fun(9, 46)
print result

执行结果:
这里写图片描述
7)模块文件
所有的python文件都可以是一个模块文件
可以在python文件中定义函数或者变量
在另一个文件中import filename导入这个文件
再用filename.函数名 / filename.变量名调用这个函数或变量
示例:
文件func_04内容

# 两个数求和
def sum_2(num1, num2):
    result = num1 + num2
    return result

文件func_05内容:将func_04导入func_05,再调用func_04里的函数或变量

import func_04
sum_result = func_04.sum_2(5, 4)
print sum_result

执行结果:
这里写图片描述

8)局部变量和全局变量

全局变量

全局变量是在函数外部定义的变量,(没有定义在某一个函数内),所有函数内部都可以使用这个变量
注意:应该把全局变量都定义在所有函数的上方

全局变量示例:

# 定义一个全局变量,在函数外定义
num = 10


def demo1():
    print 'demo1----->%d' % num


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

执行结果:
这里写图片描述
局部变量

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

局部变量的作用:
在函数内部使用,临时保存函数内部需要使用的数据
局部变量示例:

def demo1():
    # 定义一个局部变量,不能在其他函数中使用
    # 出生:执行下方代码后才会被创建
    # 死亡:函数执行完
    num = 10
    print num
def demo2():
    # 不同函数可以定义相同的局部变量名,不会产生影响
    num = 20
    print num
demo1()
demo2()

执行结果:
这里写图片描述
9)全局变量的修改
在函数内部修改全局变量,需要加global关键字进行声明,否则就等于重新在函数内部定义了一个局部变量,只在该函数中生效
例1: 不加声明的情况下

num = 10

def demo1():
    # 如果不加声明,等于重新定义了一个局部变量,没有更改全局变量的值
    num = 32
    print 'demo1----->%d' % num


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

执行结果:
这里写图片描述
例2: 使用global关键字进行声明

num = 10
def demo1():
    # 更改全局变量的值,使用global关键字,声明解释器后面为全局变量
    # 再用赋值语句时就不会创建局部变量
    global num
    num = 66
    print 'demo1----->%d' % num

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

执行结果:
这里写图片描述
3.变量进阶

1)目标
变量的引用
可变和不可变类型
局部变量和全局变量
2)变量的引用
变量和数据都是保存在内存中的
在python中函数的参数传递以及返回值都是靠引用传递的
3)引用的概念
在python中
变量和数据是分开存储的
数据保存在内存中的一个位置
变量中保存的是数据在内存中的地址
变量中记录数据的地址,就叫做引用
使用id()这个函数可以查看变量中保存数据所在内存的地址
示例1:

def test(num):
    print '%d的内存地址是%d' % (num,id(num))
a = 10
print 'a的内存地址是%d' %id(a)
test(a)

执行结果:
这里写图片描述
示例2:

def test(num):
    print '%d的内存地址是%d' % (num, id(num))
    result = 'hello'
    print '函数要返回的内存地址是%d' % id(result)
    return result


a = 1
print 'a的内存地址是%d' % id(a)
r = test(a)
print '%s的内存地址是%d' % (r, id(r))

执行结果:
这里写图片描述

4.函数嵌套

函数嵌套就是在新的函数内部再定义一个函数,而不是调用

def func1():
	def fun2():
	pass

5.装饰器

概念:把一个函数当作参数,传递给函数
返回一个加强版的函数
本质上是一个返回函数的函数
“在不改变原函数的基础上给函数增加功能”
例1: 给函数前加一串*,但不改变原函数
原函数:

def func1():
    print 'hello world'

def func2():
    print 'hello 2018'

装饰后:

def func1():
    print 'hello world'

def func2():
    print 'hello 2018'
# outer()相当于一个化妆师,将传递进来的函数“化妆”
# 在将“化好妆的函数”返回,形参的作用,是让它可以给任何函数化妆
def outer(func):
    def inner():
        print '************'
        func()
    return inner
f = outer(func1)
f()
r = outer(func2)
r()

执行结果:
这里写图片描述
例2: 要求输入月份并输出现在是x月,如果输入的月份不正确,报错,不改变原函数
原函数是:输入月份并输出现在是x月

def func(month):
    print '现在是%d月' % month
func(12)

装饰后:

# 装饰器
def outer(fun):
    def inner(month):
        if month > 12 or month < 0:
            print 'error'
        else:
            fun(month)
    return inner

# 调用装饰器
@outer
def func(month):
    print '现在是%d月' % month
func(13)

执行结果:
输入3
这里写图片描述
输入13
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值