一. 函数简介
Python中的函数是一段可重复使用的代码块,可以接受输入(参数),并且可以输出结果。使用函数可以将复杂的逻辑代码分解成小块,使得程序更加清晰、易读、易于维护。函数定义使用关键字def,语法为:
def function_name(parameters):
"""docstring"""
# 函数体
return [expression]
目前我们所遇到的问题:1.我们现在所写的代码冗余度较高,需要重写代码,
2.目前所写的代码兼容性太差。函数其实就是一个工具箱,什么时候使用就拿出来使用,内部封装了一些功能,需要哪里就使用哪里。
二.函数的语法结构
def function_name(parameters):
"""docstring"""
# function body
return [expression]
def
是定义函数的关键字;function_name
是函数的名称,遵循变量命名规则;parameters
是函数的参数列表,可以为空;docstring
是对函数的描述,可以为空;function body
是函数的代码块,用于完成特定的功能;return
是返回结果的关键字,可以省略。- 返回值是可选的,可有可无,但是一般情况下都有。
- 一个函数只有一个返回值。
三.函数的定义与调用
1.函数必须先定义后调用,没有定义的函数一定是不能调用的。
2.函数在定义阶段,只能检测出语法是否错误,不会键检测逻辑会不会有问题。
3.逻辑上的错误只会在调用状态下检测
4.函数一定是被调用后才会执行内部函数的代码块,不调用函数一定不会执行函数的。
1.如何调用函数
函数名 () 只要函数名加括号一定会执行函数代码块,函数如果在定义阶段有参数,那么再调用的时候,连参数一块写上
2.函数调用的内部原理
1.先再内存地址中申请代码块的内存地址储存代码块
2.把函数名和函数体所在的空间地址绑定在一起
3.通过函数名()就可以访问到所在的函数代码即可
四.函数的分类
1,内置函数
pyhton 解释器中原本就存在的函数,可以直接拿来用,不需要定义,直接拿来用即可:
Python解释器中内置的函数有很多,以下是部分常用的内置函数列表:
1. print():输出函数,将指定的值或变量打印到控制台上。
2. input():输入函数,接受用户的输入并返回一个字符串。
3. type():类型函数,返回一个对象的类型。
4. len():长度函数,返回一个序列对象的长度。
5. range():生成一个序列,返回一个包含指定范围内的所有整数的序列。
6. int():将一个字符串或数值转换为整数。
7. float():将一个字符串或数值转换为浮点数。
8. str():将一个对象转换为字符串。
9. list():将一个序列对象转换为列表。
10. tuple():将一个序列对象转换为元组。
11. dict():将一个序列对象转换为字典。
12. set():将一个序列对象转换为集合。
13. abs():返回一个数的绝对值。
14. max():返回一个序列对象中的最大值。
15. min():返回一个序列对象中的最小值。
16. sum():返回一个序列对象中所有数的和。
17. pow():返回一个数的指数幂。
18. round():将一个数四舍五入到指定的精度。
19. bin():将一个整数转换为二进制字符串。
20. hex():将一个整数转换为十六进制字符串。
21. oct():将一个整数转换为八进制字符串。
22. chr():将一个Unicode编码转换为字符。
23. ord():将一个字符转换为Unicode编码。
24. enumerate():返回一个枚举对象,产生一个元素和一个计数器,这个计数器可以用来追踪迭代次数。
25. zip():将多个序列对象并行地组合成一个元组列表。
2.自定义函数
程序员自己写的函数,必须先定义,后调用
1.无感参数:函数在定义阶段没有参数
def my_len():
pass
my_len()
2.有感参数:函数在定义中有参数的存在
def my_len(a, b):
pass
my_len(1,2)
3.空参数
空函数
def my_len():
pass
3.函数的返回值(return)
函数关键字:retrun
def home():
print(1,2,3)
#retrun就走到这
#print('hello')
return 1,2,3 # 1,2,3
def home():
print(1,2,3)
return 1,2,3
res =home()
print(res)
print(res[1])
##1 2 3
(1, 2, 3)
2
注:1.每个函数不是必须都要返回值的,它是可有可无的
2.当函数中只有关键字retrun时,它的后面才是函数返回值的结果
3.一个函数中只能有一个retrun关键字,函数体代码遇到retrun就会直接退出。
4.retrun关键字后面可以跟多个返回值,使用逗号隔开。以元组的形式展开。
五. 函数参数的两大分类(形式i参数,实际参数)
1. 形式参数
1.定义: 函数在定义阶段时,括号里的变量名就是形式参数,简称"形参"
def my_home(a,b):
pass
# a,b就是形式参数
2. 实际参数
1.定义: 函数在调用阶段时,括号里的变量值就是实际参数,简称'实参'
def home(a,b):
print(a,b)
home(1,2) #就是实际参数
3.形参与实参直接的关系
实参和形参的关系我们可以看做变量名————>变量值直接的关系,那么形参和实参的关系就是
形参(变量名)————实参(变量值)的形式。
形参和实参是在函数调用期间,临时绑定,当调用结束时,两者断开。
注:函数形参其实就只有变量名这一中情况,但实参确有好几种情况:变量值,变量名,返回值等,但实际就是变量值。
4.位置参数
1. 位置参数就是:函数在括号中从左往右依次写入的参数(实参),就是位置参数
def home(a,b ,c):##这就是位置参数(实参)
print(a,b,c)
home(1,2,3)
2.位置形参就是:在函数调用时括号中从左往右写入的变量值(形参)就是位置形参
def home(a,b ,c):
print(a,b,c)
home(1,2,3)###这就是位置形参
注:位置参数(实参)与位置形参是一一对应的。
5.默认参数
定义:在函数的定义阶段已经给形参赋予了变量值。
1 .如果在定义函数时,给形参赋予值之后,调用函数时,如果未定义,则为使用默认的参数,
2. 如果在调用函数时,定义了变量值,那么默认的参数将不在使用。
def register(name, age, gender='male'):
print("name:%s,age:%s,gender:%s" % (name, age, gender))
register('kiki', 18)##当默认参数定义,实参没有定义时
def register(name, age, gender='male'):
print("name:%s,age:%s,gender:%s" % (name, age, gender))
register('kiki', 18, 'female')##当实参有定义时
注:当函数在定义阶段,给的默认值在定义后,后续就不会再改变了
m = 200
def register(a, b, n = m ):
print(a, b, n)
m =400
register(1, 2)##1,2,200最后结果还是200,定义的值不能被改变
6.可变长参数
1.无论输入多少个位置参数,函数都可以被正常调用
def index(x,y,m,n,*a):
print(x,y,m,n,a)
index(1,2,3,4,5,6,7,8,9)##1 2 3 4 (5, 6, 7, 8, 9)返回的结果,*a位置使用了元组给括了起来
2.无论输入多少关键字参数,函数都可以被正常调用
def index(x,y,m,n,**a):
print(x,y,m,n,a)
index(x=1, y=2, m= 3, n=4, zz=22, e=23)##1 2 3 4 {'zz': 22, 'e': 23}
##**a前面的正常使用位置参数对应,后面的使用字典给括起来
* 和**后的变量名随意,但是,在python中,推荐使用:*args **kwargs
args:位置参数,kwargs:关键字参数
3.无论使用多少的关键字和位置参数,都能够被正常的调用
def index(a, b, m=2, *args, **kwargs):
print(args)
print(kwargs)
index(1, 2, 3, 4, x=10, y=20, z=30)
##(4,)
{'x': 10, 'y': 20, 'z': 30}
4.可变长参数(*和**号)在实参中得使用:
def index(a, b, *args):
print(a, b, args)
ll = (11, 22, 33, 555, 44,449 )
index(*ll)##11 22 (33, 555, 44, 449)
def index(*args):
print(args)
# ll = (11, 22, 33, 555, 44,449 )
# index(*ll)
d = {'name': 'kiki', 'age': 18}
index(*d)
字典只能返回key值。