函数的概念:
所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤
1.定义函数--封装独立的功能
2.调用函数--享受封装的成果
函数的作用:在开发时,使用函数可以提高编写的效率以及代码的重用
函数:
函数是带名字的代码块,用于完成具体的工作需要在程序中多次执行同一项任务时,
你无需反复编写完成该任务的代码,而只需调用该任务的函数,
让python运行其中的代码,你将发现,通过使用函数,程序编写,阅读,测试和修复都将更容易
函数的定义:
def 函数名():
函数封装的代码
1.def是英文define的缩写
2.函数名称应该能够表达函数封装代码的功能,方便后续的调用
3.函数名称的命名应该符合标识符的命名规则
可由字母,下划线和数字组成
不能以数字开头
不能与关键字重名
函数中参数的作用
函数,把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的参数,
增加函数的通用性,针对相同的数据处理逻辑,能够适应更多的数据
1.在函数内部,把参数当作变量使用,进行需要的数据处理
2.函数调用时,按照函数定义的参数顺序,把希望在函数内部处理的数据,通过参数传递
定义函数:
# 定义好一个函数之后,只是表示这个函数封装了一段代码
# 如果不主动调用函数,函数是不会主动执行的
def say_hello():
print 'hello1'
print 'hello2'
print 'hello3'
# 调用函数
say_hello()
函数01–浮点型:
def abc_2_abc(price,weight):
money = float(price) * float(weight) 计算价格
print '%.2f * %.2f = %.2f' %(price,weight,money) 调用的浮点型
abc_2_abc(2.5,4.6)
函数02–整型:
def abc_2_abc(price,weight):
money = (price) * (weight) 计算价格
print '%d * %d = %d' %(price,weight,money) 调用的整型
abc_2_abc(2,4)
pycharm使用中的一些小技巧:
crtl+/全部注释
ctrl+q查看函数功能
不知道函数接受什么用*来表示
函数与注释空两行
pass命令进行占位
函数调用:
# 1.定义一个函数,能够打印*组成的一条分割线
def print_line():
print '^' * 5
print_line()
# 2.定义一个函数能够打印由任意字符组成的分割线
def print_line(char):
print char * 5
print_line('@')
# 3.定义一个函数能够打印任意重复次数的分割线
def print_line(char,times):
print char * times
print_line('%',5)
# 4.定义一个函数能够打印五条分割线,
# 分割线要求符合需求3
def print_lines(char,times):
"""
打印多行分割线
:param char: 分割字符
:param times:分割线次数
"""
row = 0
while row < 5:
print_line(char,times)
row += 1
print_lines('!',5)
对两个数字求和:
# 能实现两个数字求和
def sum_sum():
number1 = 10
number2 = 20
result = number1 + number2
print '%d + %d = %d' % (number1,number2,result)
sum_sum()
形参与实参:
# 形参:定义函数时,小括号中的参数,是用来接收参数使用,在函数内部,是当作变量来用的
# 实参:调用函数时使用的,小括号中的参数,是用来把数据传递到函数的内部
def sum_sum(num1,num2):
"""对两个数字求和"""
result = num1 + num2
print '%d+%d=%d' % (num1,num2,result)
sum_sum(27,13)
对两个数字求和:(加返回值)
返回值:是函数完成工作后,最后给调用者的一个结果,在函数中使用return关键字可以返回结果,
调用函数一方,可以使用来接收函数的返回结果.
def sum_2_sum(num1,num2): # 对两个数字求和
result = num1 + num2
return result
sum_result = sum_2_sum(60,60)
print sum_result
变量的引用:
在python中:
变量和数据是分开存储的
数据保存在内存中的一个位置
变量中保存的是数据在内存中的地址
变量中记录数据的地址,就叫做引用
使用id()函数可以查看变量中保存数据所在内存的地址
使用ipython解释器进行引用的举例:
In [1]: a = 1
In [2]: id(a) 查看a的内存地址
Out[2]: 25861224
In [3]: id(1) 查看1的内存地址
Out[3]: 25861224
In [4]: b = a
In [5]: id(b) 查看b的内存地址
Out[5]: 25861224
In [6]: a = 2
In [7]: id(a) 查看a的内存地址
Out[7]: 25861200
In [8]: a = 1
In [9]: id(a) 重新赋值查看a的内存地址
Out[9]: 25861224
In [10]: a = 'banana'
In [11]: id(a) 重新赋值查看a的内存地址
Out[11]: 33316416
In [12]: a = 3 给a赋值
In [13]: b = 3 给b赋值
In [14]: id(a) 查看a的内存地址
Out[14]: 25861176
In [15]: id(b) 查看b的内存地址
Out[15]: 25861176
引用01:
# 定义了一个函数,准备了一个叫num的变量
# 引用的数字10的内存地址
def test(num):
print '在函数内部%d对应的内存地址是%d' % (num, id(num))
# 1.定义了一个数字变量
a = 10
print 'a变量保存数据内存的地址是%d' % id(a)
test(a)
引用02:
def test(num):
print '在函数内部%d对应的内存地址是%d' % (num, id(num))
# 1.定义了一个字符串变量
result = 'hello'
print '函数要返回数据的地址是%d' % id(result)
return result
# 定义一个数字变量
a = 10
print 'a变量保存数据内存的地址是%d' % id(a)
r = test(a)
print '%s的内存地址是%d' % (r, id(r))
局部变量和全局变量:
局部变量是在函数内部定义的变量,只能在函数内部使用。
全局变量是在函数外部定义的变量,(没有定义在某一个函数内),所有函数内部都可以使用这个变量。
局部变量:
函数执行结束后,函数内部的局部变量,会被系统回收。不同的函数,可以定义相同的名字的局部变量,
但是各用各的不会产生影响。
局部变量的作用:
在函数内部使用,临时保存函数内部需要使用的数据。
局部变量01:
def demo1():
# 定义一个局部变量
num = 10
print num
# 在函数内部定义的变量不能在其他位置使用
#print num
demo1()
局部变量02:
def demo1():
num = 10
print num
def demo2():
#在demo1中定义的局部变量,不能在其他函数中使用
pass # 是一个占位符号
demo1()
demo2()
局部变量03:
不同的函数,可以定义相同名字的局部变量,但是不会产生影响
def demo1():
demo1_num=10
print demo1_num
def demo2():
demo2_num=20
print demo2_num
demo1()
demo2()
全局变量01:
全局变量,任意函数都可以使用
num = 10
def demo1():
print 'demo1------>%d' %num
def demo2():
print 'demo2------>%d' %num
demo1()
demo2()
全局变量02:
num = 10
def demo1():
# 使用赋值语句会在函数内部,定义一个局部变量
# 更改的是局部变量的值,全局变量不发生变化
num = 99
print 'demo1------>%d' %num
def demo2():
print 'demo2------>%d' %num
demo1()
demo2()
全局变量03:
num = 10
def demo1():
# 修改全局变量的值,使用关键字global,声明即可
# global关键字会告诉解释器后面是一个全局变量
# 再次使用赋值语句使,就不会创建局部变量了,
# 会直接更改全局变量
global num
num =99
print 'demo1----->%d' %num
def demo2():
print 'demo2----->%d' %num
demo1()
demo2()
全局变量04:
注意:在开发的时候,应该把模块中的所有全局变量定义到其他函数的上方.
gl_num = 10
gl_title = 'westos'
gl_name = 'xfl'
def demo():
print '%d' % gl_num
print '%s' % gl_title
print '%s' % gl_name
demo()
全局变量和局部变量:
gl_num = 10 定义全局变量
def demo1():
num = 99 定义局部变量
print num 输出局部变量
print gl_num 输出全局变量
def demo2():
print gl_num 输出全局变量
demo1() 调用函数
demo2() 调用函数
return返回值后面代码不会执行:
# return表示返回,后续代码不会执行
def sum_2_num(num1,num2):
"""对两个数字求和"""
result = num1 + num2
return result
num = 1000 return返回值后面代码不会执行
print num 1000不会被输出
sum_result = sum_2_num(3,7)
print sum_result
调用函数交互式相加:
def sum_2_num():
"""对两个数字求和"""
num1 = int(raw_input('请输入一个数字:'))
num2 = int(raw_input('请输入另一个数字:'))
result = num1 + num2
print result
sum_2_num()
函数的模块文件:
# import 模块文件 不可使用中文调用
模块文件:每一个python源文件都可以是一个模块文件
可以在一个python中定义函数或者变量,然后在另外一个文件中使用import filename导入这个模块。
导入之后就可以使用模块名.变量/模块名.函数的方式,使用这个模块中定义的函数或者变量。
import fun02
fun02.sum_2_num()
# 函数是直接调用的,变量是通过print调用进行输出的
上例中调用的fun02函数: 装饰器:
装饰器实际上就是为了给某段程序添加功能,但该程序已经上线或者已经被使用,那么就不能大批量的修改源代码,
这样就产生了装饰器。
最简单的装饰器:
概念:把一个函数当作参数,传递给函数返回一个加强版的函数
本质上是一个返回函数的函数"在不改变原函数的基础上,给函数增加功能"
def func1():
print 'have a nice day!'
# 需求:让func1函数的执行结果前面加上一串'*',但是不改变原函数
def outer(func):
def inner():
print '*******************'
func()
# 将装饰好的返回
return inner
# f是func1的加强版本,其实就是inner()
f = outer(func1)
f()
q = outer(func1)
q()
装饰器01:
def func1():
print 'have a nice day!'
# 需求:让func1函数的执行结果前面加上一串'*',但是不改变原函数。
def outer():
print '*******************'
func1()
outer()
装饰器02:
def say(age):
print "man is %d years old" % age
def outer(func):
def inner(age):
if age < 0:
age = (-age)
func(age)
return inner
say = outer(say) # 调用装饰器
say(-11)
装饰器03:
def outer(func):
def inner(age):
if age < 0:
age = (-age)
func(age)
return inner
# 使用@符号将装饰器应用到函数
@outer
def say(age):
print "man is %d years old" % age
say(11)
装饰器04:(增加交互式)
def func1():
print 'have a nice day!'
def say(age):
print "man is %d years old" % age
def outer(func):
def inner():
c = raw_input('请输入你想在开头添加的代码:')
print c
func()
return inner
f = outer(func1)
f()
输出结果: 装饰器05:
def outer(fun):
def wrapper():
print '验证信息'
fun()
print '!!!!!!!'
return wrapper
@outer
def func1():
print 'func1'
func1()
@outer
def func2():
print 'func2'
func2()
@outer
def func3():
print 'func3'
func3()
装饰器06:
def outer(func):
def inner(*args):
print '%%%%%%'
func(*args)
return inner
@outer
def say(name,age):
print 'my name is %s, I am %d years old!'%(name,age)
say('xfl',18)
装饰器07:
def outer(fun):
def wapper(arg):
print '验证信息'
result = fun(arg)
print '@@@@@@'
return result
return wapper
@outer
def func1(arg):
print 'func1',arg
print '******'
return 'return'
response = func1('xfl')
print response