函数
一、函数简介
1.1、什么是函数:
-
其实就是一个代码段,这段代码可以重复的执行,通过函数可以实现代码的复用
-
函数是不能自己主动执行的,必须被调用的时候才能被执行
python的模块
-
一个python文件,就是一个模块
1.2、函数分类
-
全局函数:直接定义在模块中的函数就是全局函数
-
局部函数:定义在函数内部的子函数,这样的函数就是局部函数
-
匿名函数: 也称之为lambda函数,其实是一个表达式
-
方法:方法也是一种函数,只是函数需要和特点的数据类型绑定使用
1.3、函数的定义与调用
定义函数
1.def是英文define的缩写
2.函数名称应该能够表达函数封装代码的功能,方便后续的调用
3.函数名称的命名应该符合标识符的命名规则
可由字母,下划线和数字组成
不能以数字开头
不能与关键字重名
def 函数名():
语句
语句
...
调用函数
def f1(): # 定义一个名为 f1的函数
print("1")
print("ok")
print("2")
print("start process...")
f1() # 调用函数 f1
print("over")
1.4、执行函数的结果
-
函数的输出:在函数中用print来输出一个结果,这个可以可以直接显示
-
输出用:print
-
输出结果:可以直接打印出来
-
-
函数的返回值:在函数中用return 来返回一个或者多个结果,这个结果可以用来接收,一旦执行到return,那么return后面的代码就不会再执行了,也就是会直接退出函数,返回到主程序继续运行
-
返回用:return
-
返回值:可以再主程序进行接收,如果返回多个值,那么多个值会保存成一个元组
-
def userdate(): # 定义一个名为 userdate 的函数
num1 = int(input("请输入第一个数字:"))
num2 = int(input("请输入第二个数字:"))
if num1 > num2: # 如果num1 > num2 函数返回值为num1
return num1
else:
return num2 # 如果num1 < num2 函数返回值为num2
print(userdate()) # 输出函数的返回值
1.5函数的说明文档
-
一般情况先,每个函数都应该有个说明文档,来解释这个函数的作用以及使用方法
-
查看函数的说明文档的方法
函数名.__doc__
二、变量的作用域
-
本地变量:定义在模块中的【主程序中的变量】,有效范围是整个python文件,包括主程序和函数内部
-
局部变量:在函数中定义变量,默认有效范围仅仅在函数内
-
函数执行结束后,函数内部的局部变量,会被系统回收
-
不同的函数,可以定义相同的名字的局部变量,但是各用各的不会产生影响
-
内置变量:由python自己定义的
注意事项:
-
变量的作用范围越小,优先级越高
-
局部变量优先级 > 本地变量
-
修改局部变量,不会修改全局变量
-
程序找变量的过程首先找最近的变量的,如果有就直接使用;如果没有,就向上层查找
-
默认情况下:函数中的变量是局部变量,但是可以用关键字:global将变量明确指定成全局的
x = 1 # 全局变量
y = 3 # 全局变量
def f1():
x = 2 # 局部变量
z = 5 # 局部变量
global y # 全局变量【将局部变量y转换为全局变量】
y = 0 # 为转换后的全局变量赋值 0
print(x,y,z)
print(x,y) # 输出 x 是 1,y 是 3
f1() # 将 x 改为 2,z 设置为5 ,然后输出x y z 也就是输出 2 3 5
print(x,y) # 输出 x 和 y, 此时 x 是 1,y 是 0
三、函数传递参数
3.1函数的参数分为形参和实参
- 定义时小括号中的参数,用来接收参数用的,称为 “形参”
- 调用时小括号中的参数,用来传递给函数用的,称为 “实参”
形参
定义函数时,小括号中的参数,是用来接收参数用的,在函数内部作为变量使用
def 函数名(变量):
代码
参数的默认值:
-
如果函数要求传递参数,但是调用的时候没有传递,那么就会报错
实参
调用函数时,小括号中的参数,是用来把数据传递到函数内部用的
def printWellcome(name="jack"): # name = “jack“ 这是为参数设置默认值
print("hello %s"%(name))
userInput1 = input("请输入姓名:")
printWellcome() # 调用函数,没有向函数传递参数,此时函数会使用参数的默认值
printWellcome(userInput1) # 调用函数,向函数传递参数,此时函数会使用传递进来的参数
基于关键字来进行传递参数
-
要求:定义函数时候参数的名字必须和调用时候参数的名字一直
# 定义函数
def fun1(p1,p2,p3="nul"): # 此时参数的名字分别是p1 p2 p3
# 调用函数
fun1(p1=xx,p2=xx) # 此时必须明确指定p1=x p2=x p3=x
演示
def fun1(p1,p2,p3="nul"):
if p3 == "nul":
print("姓名是 %s, 年龄是%s"%(p1,p2))
else:
print("姓名是 %s, 年龄是%s, 地址是%s" % (p1, p2, p3))
uname = input("name:")
uage = input("age:")
uaddr = input("addr:")
fun1(p2=uage,p1=uname)
3.2参数传递
函数的参数传递本质上就是:从实参到形参的赋值操作。 Python 中“一切皆对象”, 所有的赋值操作都是“引用的赋值”。所以,Python 中参数的传递都是“引用传递”,不 是“值传递”。具体操作时分为两类:
1.对“可变对象”进行“写操作”,直接作用于原对象本身。
2.对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填充这块空间。(起到其他语言的“值传递”效果,但不是“值传递”)
1.可变对象有: 字典、列表、集合、自定义的对象等2.
2.不可变对象有: 数字、字符串、元组、function 等
1.传递可变对象的引用:传递参数是可变对象(例如:列表、字典、自定义的其他可变对象等),实际传递的还是对象的引用。在函数体中不创建新的对象拷贝,而是可以直接修改所传递的对象。
2.传递不可变对象的引用传递参数是不可变对象(例如:int、float、字符串、元组、布尔值),实际传递的还是对象的引用。在”赋值操作”时,由于不可变对象无法修改,系统会新创建一个对象。
四、传递任意个参数
-
魔法赋值
方法1 def fun1 (*参数)
-
此方法用于接受任意个参数,得到的是一个元组
def fun1(*p1):
print(p1) # p1用于接收和保存传递进来的多个参数,多个参数是以元组的形式保存的
fun1("a","b") # 向函数传递多个参数
# 输出结果是('a', 'b')
方法2 def fun2 (**参数)
-
此方法用于接受任意个参数,得到的是一个字典
def fun1(**p1):
print(p1) # p1用于接收和保存传递进来的多个参数, 数据是以字典的形式保存的
fun1(name="tom", age="18", addr="hebei")
# 输出结果是{'name': 'tom', 'age': '18', 'addr': 'hebei'}