一、函数
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