一,函数的定义
函数最只要的目的:封装一个功能。
二,函数的优点是什么
1,减少代码重复率。
2,增强代码可阅读性。 # 不可能看一百行才知道你这个东西到底是干什么大的吧。
三,函数的组成部分
def my_len(): # 关键字,函数名,括号,冒号
l = [1, 2, 3, 4] # 函数体
count = 0
for i in l:
count += 1
print(count)
四,执行函数
my len() # 函数名 + 括号
五,函数的返回值:return 的作用停止函数体的运行。和break的功能一样。并且返回给这个函数一个值。
1> return 空或者没有return时,打印函数执行者时,为None
def func1():
print (888)
return
def func2():
print(9)
print(func1())
print(func2())
>>>
888
None
9
None
2,return 加一个值,返回给函数这个值,这个值是什么类型就返回什么类型
3,return 加多个值是,返回给函数一个由这些值组成的元组,如
def func1():
a = 8
return a
def func2():
a = 9
b = 20
return a, b
print(func1())
print(func2())
8
(9, 20)
六,函数的传参,函数的参数分为形参和实参,顾名思义,一个形式上的参数,一个实实在在的参数。
1. 形参的角度分类:
1> 位置参数, 按照顺序 ,一 一对应。就是这个位置我占了,谁在我位置上,我就是谁。先来后到。别和我抢地盘。
执行结果如下:
2> 默认参数,如果你给我一个值,我会将原来我默认的参数覆盖掉,牺牲自己,服务群众。如果你不给我传值,我也不会像位置参数那样大叫着要给我东西,不给我我就不让你过。此路是我开,留下银子。我只会默默无闻,任劳任怨的背负我原来的责任,不喜新厌旧,看我多宽宏大量。哈哈 又调皮了
3> 万能参数,也叫动态参数,*args ,**kwargs
例1:
运行结果如下
例2:
运行结果如下:
4> 形参的顺序 :位置参数,*args,默认参数,**kwargs
例
运行结果如下;
5,传参陷阱:如果默认参数是一个可变的数据类型,那么他的内存地址用的是一个。
例1(传默认参数时的运行结果):
运行结果如下
例2(把变量放入局部命名空间):
运行结果如下:
2.站在实参的角度分为:位置传参,关键字传参,混合传参。
例
运行结果如下
七,函数的作用域,名称空间,取值顺序
1,函数的名称空间:全局名称空间,局部名称空间(临时),内置名称空间
2,函数的作用域:全局作用域,局部作用域
3,取值顺序:就近原则:局部名称空间----->全局名称空间------->内置名称空间
八,函数名的应用
函数名可以作为一个变量,函数的参数,函数的返回值,容器类类型的元素,
例1:
运行结果如下:
例2:
执行结果如下:
例三,当函数名作为返回值时
执行结果如下
九,函数的嵌套,global,nonlocal的运用。
例1:
执行结果如下:
例2:
运行结果如下: