-
函数
必要性:开发程序中,某程序段被多次需要,就可以将其封装成一个函数,在每次使用的时候再导入这个函数模块直接使用
优点:提高编写效率,减少代码的重用
函数中的变量x是任意数吗?
python中的函数的变量x可以是整型、浮点型,甚至字符串,等等,理论上就是一个占位符。
空函数:如果还未想好代码的编写,可以先写pass,让代码正常运行不报错。 -
创建函数&调用函数
函数的格式:
def 函数名(参数1,参数2…参数n):
函数体
函数名:
|名称|示例 |
|–|--|
| 匈牙利命名法 |sUserName |
|驼峰式大小写(最常用)|userName|
|帕斯卡命名法|UserName|
定义函数def
调用函数:函数名(变量)
定义函数是不会执行的,没有结果返回
只有调用函数的时候才会有返回值
返回值是存储函数的运算结果到变量中继续操作与运算
print可以输出但是不保存返回结果
return只能返回一个对象,如果需要返回多个,将内容封装为一个元组返回
print((result))
使用函数的优点:
- 降低编程的难度(分而治之的思想)
- 代码重用。避免了重复劳动,提供了工作效率。
- 变量分类(按照作用域)
- 相同名称的变量根据其不同的作用域被分为:局部变量和全局变量
- 局部变量:1).在函数内部定义的变量
2).不同函数,定义相同的局部变量名称,互不影响
3).局部变量为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用。
- 全局变量:在一个函数中使用,也能在其他函数中使用
1).用global声明全局变量
global的本质为生命可以修改全局变量的指向,即变量可以指向新数据。
不可变类型的全局变量: 指向的数据不能修改, 不使用global时无法修改全局变量。
可变类型的全局变量: 指向的数据可以修改, 不使用global时可以修改全局变量。
2).不用global的全局变量声明法:
- 参数分类
#定义接收2个参数的函数
def add2num(a,b):
c=a+b #此处的a,b为形参,形式参数
print c
#调用带有参数的函数
add2num(10,23) #此处的10,23为实参,实际参数
定义时小括号中的参数,用来接收参数用的,称为 “形参”
调用时小括号中的参数,用来传递给函数用的,称为 “实参”
- 参数传递
-
调用参数时,
1). 如果参数个数不对,Python 解释器会自动检查出来,并抛出 TypeError
2). 如果参数类型不对,Python 解释器就无法帮我们检查。数据类型检查可以用内置函数 isinstance 实现 -
默认参数:默认参数可以降低调用函数的难度。
- 默认参数注意事项:
有多个参数时,变化大放前面,变化小的放后面;
必选参数在前,默认参数在后
返回值必须打印才能显示
必选参数:必须传值
默认参数:如果不传值,就会采用默认值
def fun( a,b=2, myfun = pow):
"""a接收,b接收,fun接收函数名"""
print('a=:',a,end=';')
print('b=:',b,end=';')
print('result=',myfun(a,b))
#调用函数:
fun(5)
fun(5,3,lambda x,y: x+y)
"fun(5)"中的5为形式参数a对应的实际参数,而b得实际参数没有告知,则采用得是程序默认得参数。
- 可变参数(*args)
可变参数就是传入的参数个数是可变的,不固定,可以是1个,2个或任意个,也可以是0个。
程序可以改变参数名,如:a,但默认情况下都设置为args
如果已经有一个 list 或者 tuple,要调用一个可变参数怎么办?
1). Python 允许你在 list 或 tuple 前面加一个 * 号;
2). 把 list 或 tuple 的元素变成可变参数传进去;
largs = [1,2,3]
func(largs[0],largs[1],largs[2])
func(*largs)
-
关键字参数(kwargs)
关键字参数允许传入 0 个或任意个含参数名的参数;
这些关键字参数在函数内部自动组装为一个字典 dict;
关键字参数用kwargs; -
参数组合
1). 参数组合是指可以必选参数、 默认参数、 可变参数和关键字参数一起使用。
2). 参数定义的顺序必须是:必选参数、 默认参数、可变参数和关键字参数。
- 匿名函数
匿名函数指一类无须定义标识符的函数或子程序。
Python用lambda语法定义匿名函数,只需用表达式而无需申明。(省略了用def声明函数的标准步骤)
#定义匿名函数
sum=lambda arg1,arg2:arg1+arg2
#调用匿名函数
print("总和为:",sum(11,22))
lambda函数的语法:
lambda [参数1,参数2,....参数n]:expression
它可以接收任何数量的参数,但是只返回一个表达式的值
应用1:作为参数传递
def fun( a,b=2, myfun = pow):
"""a接收,b接收,fun接收函数名"""
print('a=:',a,end=';')
print('b=:',b,end=';')
print('result=',myfun(a,b))
#调用函数:
fun(5)
fun(5,3,lambda x,y: x+y)
结果为:
a=5; b=2; result=25
a=5; b=3; result=125
num=[1,2,3]
*num指对num列表解包,1,2,3
这种格式还可以对元组,集合进行解包,解包功能只有python3有
set={1,2,3.4,3,2,2,2}
set={1,2,3,4}集合会自动去重
匿名函数作为参数传递的
排序方法:li.sort() sorted
可迭代的:列表、元组、集合
应用2: 作为内置函数的参数
- 递归函数
定义:已知: 函数可以调用函数。结论: 一个函数在内部调用自己本身,这个函数就是递归函数。
递归函数的原理示意图:
应用1:斐波那契数列
应用2:汉诺塔
应用3:计算阶乘