一、函数
1、函数的定义
函数:就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用
函数是带名字的代码块,用于完成具体的工作,需要在程序中多次执行同一项任务时,无需反复编写完成该任务的代码,只需要调用该任务的代码
函数的使用包含两个步骤:
- 定义函数——封装独立的功能
- 调用函数——享受封装的成果
2、定义函数
def 函数名():
函数封装的代码
【1】def是英文define的缩写,定义的意思
【2】函数名称应该能后表达函数封装代码的功能,方便后续的调用
【3】函数名称的命令应该符合标识符的命名规则:可由数字、字母和下划线组成,不能以数字开头,不能与关键字重名
示例【1】:定义函数
def say_hello():
print 'hello1'
print 'hello2'
print 'hello3'
say_hello() #函数的调用,函数在不主动调用的时候是不会主动执行的
示例【2】:求两数字的和
def sum_2_sum():
"""对两个数字的求和"""
num1 = 20
num2 = 20
result = num1 + num2
print '%d + %d = %d' %(num1,num2,result)
sum_2_sum()
3、形参和实参
形参(顾名思义,形式上的参数):定义函数时,小括号中的参数,是用来接受参数的,在函数内部作为变量使用,形参可以任意起名字
实参(真实的数据信息):调用函数时,小括号中的参数,是用来把数据传递到函数内部用的
def sum_2_sum(num1,num2): #小括号里面的就是形参,形式上的参数,没有实际意义,可以任意起名
result = num1 + num2 #定义两数相加
print '%d + %d = %d' %(num1,num2,result)
sum_2_sum(5,20) #小括号中的就是实参,实际的参数,里面包含着真实的数据信息
4、局部变量与全局变量
局部变量:是在函数内部定义的变量,只能在函数内部使用,函数执行结束后,函数内部的局部变量,会被系统回收,不同的函数,可以定义相同名字的局部变量,但是各用各的不会产生影响
示例【1】:
a = 1
print 'outside:',id(a)
def fun():
a = 5
print 'inside:',id(a)
fun()
print a
print id(a)
全局变量:全局变量是在函数外部定义 的变量(没有定义在某一个函数内),所有函数内部都可以使用这个变量
示例【2】:
num = 10
def demo1():
print 'demo1=====>%d' % num
def demo2():
print 'demo2=====>%d' % num
demo1()
demo2()
修改全局变量的值,可以使用global关键字声明一下变量即可
示例【3】:
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)位置参数:形参和实参个数必须保持一致
示例【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来接收数值
示例【2】:
def mysum(*agrs):
"""
*args:是可变参数
args:是元组类型数据
args:名字可变(因为是形参 名字可变)
:param agrs:
:return:
"""
sum = 0
for item in agrs:
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')
5、函数的返回值
返回值:函数运算的结果,还需要进一步操作时,给一个返回值
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、概念
把一个函数当作参数,传递给函数,返回一个替代版的函数,本质上是返回值的函数,
“在不改变原函数的基础上,给函数增加新的功能”
示例【1】:
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()
示例【2】:
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)
2、语法糖的应用
示例【1】:
def desc(fun):
def add_info():
print '中秋快乐',
fun()
print '西开欢迎你'
return add_info
@desc
def login():
print 'login....',
@desc
def logout():
print 'logout....',
login()
logout()
:,之