python 中的函数
1. 什么是函数
- 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用
函数的使用包含两个步骤
1.定义函数–封装独立的功能
2.调用函数–享受封装的成果
- 函数的作用:
在开发时,使用函数可以提高编写的效率以及代码的重用
函数是带名字的代码块,用于完成具体的工作
需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调用该任务的函数,让python运行其中的代码,你将发现,通过使用函数,程序编写,阅读,测试和修复都将更容易
2. 函数的定义及调用
2.1 定义函数
函数定义规则如下:
def 函数名():
函数的代码
# def是英文define的缩写
# 函数名称应该能够表达函数封装代码的功能,方便后续的调用
# 函数名称的命名应该符合标识符的命名规则
可由字母,下划线和数字组成
不能以数字开头
不能与关键字重名
示例:
def print_line():
"""The separator""" # 函数的解释,可通过 crtl + Q 来进行查看
print "=" * 50
print_line() # 调用函数
# To call a function
执行如下:
定义函数并调用
不进行调用
2.2 函数中的参数
- 参数的作用
函数,把具有独立功能的代码块组织成为一个小模块,在需要的时候调用
函数的参数,增加函数的通用性,针对相同的数据处理逻辑,能够适应更多的数据
1.在函数内部,把参数当作变量使用,进行需要的数据处理
2.函数调用时,按照函数定义的参数顺序,把希望在函数内部处理的数据,通过
参数传递- 实参,形参
- 形参: 定义函数时,小括号中的参数,是用来接收参数使用的,
在函数内部,是当作变量来使用的- 实参: 调用函数时使用,小括号中的参数,是用来把数据传地到函数内部的
示例:建立三个函数,并对其进行调用
1. 定义对两个数进行加法的函数
def sum_1sum(num1,num2): # 此处的参数叫做形参
"""对两个数字进行加法运算"""
s = num1 + num2
print '%d + %d = %d' % (num1,num2,s)
sum_1sum(4,3) # 此处的参数为实参
2. 定义一个函数,其功能是实现九九乘法表
def Mutil_list():
r = 1
while r <= 9:
c = 1
while c <= r:
s = c * r
print '%d * %d = %d\t' % (c, r, s),
c += 1
print ''
r += 1
Mutil_list() # 对函数进行调用
3. 定义一个函数,实现五行五列的星号*显示
def star_output():
row = 1
while row <= 5:
c = 1
while c <= row:
c += 1
print '*',
print ''
row += 1
star_output() # 对函数进行调用
执行如下:
定义对两个数进行加法的函数
定义一个函数,其功能是实现九九乘法表
定义一个函数,实现五行五列的星号*显示
2.3 函数的调用
建立判断语句,对函数进行调用
first = raw_input('Please input what you what:') ## 进行输入变量的定义
if first == 'star' : ## 当输入内容等于star 时调用star_output()函数
star_output()
elif first == 'mutil' : ## 当输入内容等于mutil 时调用Mutil_list()函数
Mutil_list()
else: ## 否则调用求和函数sum_1sum(num1,num2)
sum_1sum(300,200)
执行如下:
调用 star_output
调用 mutil_list
调用 sum_1sum
2.4 函数的返回值
- 函数的返回值
在程序开发中,有时候,会希望一个函数执行结束后(举例子:温度计函数,要返回给我>们当前的温度),告诉调用者一个结果,以便调用者针对具体的结果作出后续的处理
返回值是函数完成工作后,最后给调用者的一个结果
在函数中使用 return 关键字可以返回结果
调用函数一方,可以使用变量来接收函数的返回结果
示例:用函数实现功能:进行任意行,任意字符类型,任意个数,任意行数的内容
打印多行分割线
def print_line(char,times): # 定义分割线的格式
result = char * times # 定义函数内的变量
return result # 返回该值
result_ = print_line(raw_input('Please input the char you
want:'),int(raw_input('Please input the times you want:')))
# 将返回值定义成变量进行输出
def print_lines(): # 定义分割线的类行
row = int(raw_input('Please input the line number you want:'))
while row > 0:
print result_ # 调用副函数的返回值
row -= 1
print_lines()
执行如下:
示例二:直接在第二个函数中进行形式参数的设置
def print_line(char,times): # 定义副函数,分隔符的样式及个数
"""
进行多行分隔符的调用
:param char: 分割线使用的分隔字符
:param times: 分割线重复的次数
:return: 返回函数值
"""
print char * times
def print_lines(char,times): # 定义主函数,对副函数进行调用并规定行数
row = int(raw_input('Please input the line number you want:'))
while row > 0:
print_line(char,times)
row -= 1
print_lines('@',23)
执行如下:
2.5 进行跨模块调用
将所有的内容写在一个文本内显得过于繁琐,也不利于排错,此时可以将函数于调用分开来,这样利于编写于排查错误。
执行如下
通过 import 加项目名进行调用
上述返回值的示例中,示例一的项目名称为 test.py ,
新建一个 python 项目,名为跨模块调用,在此项目内对test内函数进行调用
执行如下:
import fun_03
fun_03.print_lines('#',23)
使用鼠标 ctrl 点击 函数名称,可转到对应函数,进行查看
具体执行如下:
3. 函数中的变量
3.1 局部变量
函数内部定义的变量为局部变量,无法在其他位置进行调用;不同的函数,可以定义相同的名字的局部变量,但是各用各的不会产生影响
局部变量的作用
在函数内部使用,临时保存函数内部需要使用的数据
示例:
def demo1():
num = 1 ## 局部变量
print num
demo1()
print num ## 此处的 num 为全局变量
执行后会报错:NameError: name ‘num’ is not defined 因为函数内的局部变量的值无法调用到函数外部
执行如下:
在函数执行时,局部变量创生,在函数执行完后,就会被内存回收,这叫做
变量的生命周期
不同的函数可以定义名字相同的局部变量,但不会产生影响
示例:
def demo1(): # 定义函数 demo1
num = 1 # demo1 中的局部变量num 值为1
print 'num =%d' % num # 显示 num 的值
demo1() # 调用函数
def demo2(): # 定义函数 demo1
num = 2 # demo2 中的局部变量num 值为2
print 'num =%d' % num # 显示 num 的值
demo2() # 调用函数
执行如下:
注:
因为各函数内的局部变量的名称是否相似毫不影响,因此为了方便区分,最好好定义成不同名称的变量,以便区分
可将上述函数变成:
def demo1():
demo1_num = 1 ## 用来区分不同函数的变量
print demo1_num
demo1()
def demo2():
demo2_num = 2 ## 用来区分不同函数的相同名称变量
print demo2_num
demo2()
3.2 全局变量
全局变量是在函数外部定义的变量,(没有定义在某一个函数内),所有函数内部都可以使用这个变量
示例:
num = 38 ## 定义全局变量num的值为38
def demo1(): ## 在函数 demo1 中进行调用
print 'num=%d' % num
demo1()
def demo2(): ## 在函数 demo2 中进行调用
print 'num=%d' % num
demo2()
还可以对全局变量进行重新赋值
可以使用global 进行声明,函数中调用的为全局变量,在用赋值语句,对全局变量值进行修改
num = 38
def demo1():
global num ## 表示此函数中调用的 num 为全局变量 num
num = 22 ## 对 num 进行重新赋值
print 'demo1 =========> %d' % num
demo1() ## 进行调用
def demo2():
print 'demo2 =========> %d' % num
demo2()
执行如下:
注:
在进行变量定义时,要求对变量名称进行区分,全局变量与局部变量名称进行区分,在开发时,将全局变量定义到所有函数的最上方
4 函数的引用及装饰器
首先要了解一点变量与数据是分开存储的变量中存储的是数据的内存地址
函数的返回值,返回的也是变量的内存地址
可通过 id (变量名)来查看
例如:
a = 10
print '变量 a 存储的数据的内存地址为 %d ' % id(a)
执行如下:
返回值地址示例:
a = 10
def test(num):
print '%d 在函数中调用的是 %d 地址' % (num,id(num))
result = 'python'
print '函数返回值的存储地址为 %d ' % id(result)
return result
r = test(a)
print '%s 的内存地址是 %d ' % (r,id(r))
执行如下:
4.1 装饰器
详细的关于装饰器的理解可移步 Python装饰器的通俗理解
- 装饰器
概念:把一个函数当作参数,传递给函数
返回一个加强版的函数
本质上是一个返回函数的函数
“在不改变原函数的基础上给函数增加功能”
最简单的装饰器
示例:
def func1():
print "This is func1."
# 再不改变原函数的情况下,让func1函数的执行结果前加上一串'*'
def outer(func1):
print "**************"
func1()
outer(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) # 定义新变量,其值为装饰函数的值,此时装饰函数的值
# 为 inner 的返回值
say (int(raw_input('Please input your age:')))
# 调用 say 这个重新定义的函数,及 say 的加强版
执行如下: