所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用
函数的使用包含两个步骤
1.定义函数–封装独立的功能
2.调用函数–享受封装的成果
函数的作用:在开发时,使用函数可以提高编写的效率以及代码的重用‘’
函数:
函数是带名字的代码块,用于完成具体的工作
需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调用该任务的函数,让python运行其中的代码,你将发现,通过使用函数,程序编写,阅读,测试和修复都将更容易
1.定义函数
def 函数名():
函数封装的代码
1.def是英文define的缩写
2.函数名称应该能够表达函数封装代码的功能,方便后续的调用
3.函数名称的命名应该符合标识符的命名规则
可由字母,下划线和数字组成
不能以数字开头
不能与关键字重名
参数的作用
函数,把具有独立功能的代码块组织成为一个小模块,在需要的时候调用
函数的参数,增加函数的通用性,针对相同的数据处理逻辑,能够适应更多的数据
1.在函数内部,把参数当作变量使用,进行需要的数据处理
2.函数调用时,按照函数定义的参数顺序,把希望在函数内部处理的数据,通过参数传递形参和实参
形参:定义函数时,小括号中的参数,是用来接收参数用的,在函数内部作为变量使用
实参:调用函数时,小括号中的参数,是用来把数据传递到函数内部用的
def sum_2_sum(num1, num2):
result = num1 + num2
print result
sum_2_sum(1, 2)
def sum_2_sum(*n):
print n
- 函数的返回值
在程序开发中,有时候,会希望一个函数执行结束后(举例子:温度计函数,要返回给我>们当前的温度),告诉调用者一个结果,以便调用者针对具体的结果作出后续的处理
返回值是函数完成工作后,最后给调用者的一个结果
在函数中使用return关键字可以返回结果
调用函数一方,可以使用变量来接收函数的返回结果
sum_2_sum(256, 253)
“”“return表返回后续代码不会执行”“”
def sum_2_sum(num1, num2):
result = num1 + num2
return result
print result
- 局部变量和全局变量
全局变量是在函数外部定义的变量,(没有定义在某一个函数内),所有函数内部都可以使用这个变量
num = 8
def demo1():
print 'demo1=====> %d' % num #格式化
def demo2():
print 'demo2=====> %d' % num
demo1()
demo2()
局部变量
局部变量是在函数内部定义的变量,只能在函数内部使用
函数执行结束后,函数内部的局部变量,会被系统回收
不同的函数,可以定义相同的名字的局部变量,但是各用各的不会产生影响
"""定义一个全局变量可以在整个文件中的所有函数内部使用"""
num = 666
def demo1():
# 定义了一个局部变量
# 出生:执行了函数中下方代码
# 死亡:代码执行完毕
# 使用赋值语句,会在函数内部,定义一个局部变量
num =3
print num
def demo2():
print num
demo1()
demo2()
局部变量的作用
在函数内部使用,临时保存函数内部需要使用的数据
注意:局部变量中内容不能为空,如果没有想好函数内容,可以先用pass占位
“”“函数内部不能为空,否则会报错
def demo3():
demo3()
“””
def demo3():
pass
demo3()
- 函数的调用规则:
函数中变量命名:
""一个函数里面定义的变量不能在另一个函数内使用
def demo1():
num = 1
print num
def demo2():
print num
demo1()
demo2()
"""
"""一般情况下两个函数中可以有两个相同名称的变量,不会有影响,但这样不太清晰
因此在定义变量名称时,可以为函数名_变量名"""
def demo1():
demo1_num = 1
print demo1_num
def demo2():
demo2_num = 2
print demo2_num
demo1()
demo2()
函数中变量的格式化:
def demo1():
global num
num = 999
print 'demo1=====> %d' % num #格式化
def demo2():
global num
num = 888
print 'demo2=====> %d' % num
demo1()
demo2()
变量进阶
引用的概念
在python中
变量和数据是分开存储的
数据保存在内存中的一个位置
变量中保存的是数据在内存中的地址
变量中记录数据的地址,就叫做引用
使用id()函数可以查看变量中保存数据所在内存的地址
变量和数据都是保存在内存中的
在python中函数的参数传递以及返回值都是靠引用传递的
变量的引用:
def test(nu变量的引用:m):
#定义一个数字变量
a = 1
print '在函数内部 %d 对应的地址为 %d' %(num,id(num))
print 'a变量保存数据地址为 %d' %id(a)
test(2)
传参是传递参数所在的数据地址,该地址存储着变量被赋予的值
id 查看变量内部存储内容
def test(num):
#定义一个数字变量
a = 1
print '在函数内部 %d 对应的地址为 %d' %(num,id(num))
print 'a变量保存数据地址为 %d' %id(a)
#定义一个字符串变量
result = 'hello'
print '函数要返回数据的内存地址是 %d' %id(result)
return result
test(1)
r = test(3)
print '%s所在数据地址为 %d' %(r,id(r))
装饰器
概念:把一个函数当作参数,传递给函数返回一个加强版的函数
本质上是一个返回函数的函数
“在不改变原函数的基础上,给函数增加功能”
def func1():
print '祝你开心'
def outer(func1):
print '*****'
func1()
print '*****'
outer(func1)
def func1():
print '祝你开心'
def func2():
print '啦啦啦啦'
def outer(func):
def inner():
print '^3^'
func()
return inner
outer(func1)
f = outer(func1)
# 此时f为一个函数
f()
q = outer(func2)
q()
给任何函数都能够添加装饰:
def say(age):
print 'Man is %d years old' %age
#装饰器
def outer(xingcan):
def inner(age):
if age > 100:
age = 0
print '^3^'
xingcan(age)
return inner
say = outer(say)
say (101)
给有返回值的函数加装饰:
def outer(func):
def inner(num1,num2):
print '^3^'
result = func(num1,num2)
print result
print '^3^'
return result
return inner
@outer
def sum_2_sum(num1, num2):
result = num1 + num2
return result
print result
sum_2_sum(1,3)
给不定参数函数加装饰:
def outer(func):
def inner(*args):
print '******'
func(*args)
print '******'
return inner
@outer
def say(name,hobby):
print 'My name is %s, I like %s' %(name,hobby)
say ('weiwei','guier')
给装饰后的函数一个返回值:
def outer(func):
def inner(num1,num2):
print '^3^'
result = func(num1,num2)
print result
print '^3^'
return result
return inner
@outer
def sum_2_sum(num1, num2):
result = num1 + num2
return result
print result
responce= sum_2_sum(1,3)
print responce
模块的调用
什么是模块?
在程序设计中,为完成某一功能所需的一段程序或子程序;或指能由编译程序、装配程序等处理的独立程序单位;或指大型软件系统的一部分。
模块,又称构件,是能够单独命名并独立地完成一定功能的程序语句的集合(即程序代码和数据结构的集合体)。它具有两个基本的特征:外部特征和内部特征。外部特征是指模块跟外部环境联系的接口(即其他模块或程序调用该模块的方式,包括有输入输出参数、引用的全局变量)和模块的功能;内部特征是指模块的内部环境具有的特点(即该模块的局部数据和程序代码)。
模块有各种类型,如单元操作模块(换热器、精馏塔、压缩机等)、计算方法模块(加速收敛算法、最优化算法等)、物理化学性质模块(汽液相平衡计算、热焓计算等)等。
在这里我写了两个简单的模块:
模块一:
title = '猫猫模块'
# 函数
def introduce_self():
print '我是 %s' % title
# 类
class Cat(object):
print '喵喵喵'
模块二:
title = '狗狗模块'
# 函数
def introduce_self():
print '我是 %s' % title
# 类
class Dog(object):
print '汪汪汪'
现在需要调用这两个模块:
调用模块格式:
关键字import
import module_01
import module_02
调用内部的属性和方法:
模块名.函数
接收目标 = 模块名.类(传递类中的属性和方法)
import module_01
import module_02
module_01.introduce_self()
module_02.introduce_self()
mimi = module_01.Cat
print mimi
wangcai = module_02.Dog
print wangcai
当有的模块名称过于繁琐我们在调用的过程中为了简单明了,可以用另一种方式来调用 import module_name as A(自定义)
调用内部的函数和类:
A.函数
接收目标 = A.类(传递类中的属性和方法)
import module_01 as Catmodule
import module_02 as Dogmodule
Catmodule.introduce_self()
Dogmodule.introduce_self()
kt = Catmodule.Cat
print kt
dd = Dogmodule.Dog
print dd
直接调用模块中的函数和类
from module import 函数
from module import 类名称
from module_01 import Cat
from module_02 import Dog
miaomiao = Cat()
wangcai = Dog()
from module_01 import introduce_self
# from module_02 import introduce_self
introduce_self()
from module_02 import introduce_self as dog_introduce_self
dog_introduce_self()
name属性
name属性可以做到,测试模块的代码值在测试情况下被运行,而在被导入
时不会执行
name是python的一个内值属性,记录着一个字符串
如果是被其他文件导入时,name就是模块名
全局变量,函数,类 直接执行的代码不是向外界提供的工具 如果是当前执行的程序,name就是main
def say_hello():
print 'hello python'
# print 'Have a nice day'
# 如果直接在模块中输入,得到的是__main__
# print __name__
# say_hello()
if __name__ == '__main__':
print __name__
# 文件被导入的时候,能够直接被执行的代码不需要被执行
print 'weiwei 开发的程序'
say_hello()
当调用该模块时:
# random 为系统中原有的,如果在工程中建立了一个和系统中相同名称的文件,当调用时,会出现错误
import random
rand = random.randint(0,10)
print rand
随机结果
在很多python文件中会看到以下格式的代码
# 导入模块
# 定义全部变量
# 定义类
# 定义函数
# 在代码的下方
def main():
pass
if __name__ == '__main__'
main()
"""
# 在调用导入的.py文件中,输出的是导入包的文件名
import module_03
"""
断言:
可以提前预料错误
def func(num,div):
assert (div != 0),'div不能为0'
return num / div
print func(10,0)