目录
前言
了解 函数的概念及优势
掌握 函数的定义和使用、函数参数的传递
掌握 局部变量和全局变量、递归函数和匿名函数
理解 变量作用域
6.1 函数概述
定义
函数是组织好的、实现单一功能或相关联功能的代码段。(我们可以将函数视为一段有名字的代码,这类代码可以在需要的地方以“函数名()”的形式调用。)
函数式编程优点
降程序模块化,既减少了冗余代码,又让程序结构更为清晰
提高开发人员的编程效率
- 方便后期的维护与扩展
例子:打印正方形
def print_triangle(lenth):
for i in range(lenth):
for i in range(lenth):
print(" * ",end=" ")
print()
print_triangle(2) #使用函数,打印边长为2个星号的正放心
6.2 函数的定义与调用
6.2.1定义函数
语法格式
前面使用的print()函数和input()都是Python的内置函数,这些函数由Python定义。开发人员也可以根据自己的需求定义函数,Python中使用关键字def来定义函数
6.2.2调用函数
定义:
函数的参数传递是指将实际参数传递给形式参数的过程。
- 函数在定义完成后不会立刻执行,直到被程序调用时才会执行。
def a(c,b):
i = c+b
print(i)
a(10,20)
#30
- 函数内部也可以调用其他函数,这被称为函数的嵌套调用。
6.3函数参数的传递
分类
-
位置参数传递
将实参按照相应的位置依次传递给形参
def i(a,b):
if a>b:
print(a,'是较大值')
else:
print(b,'是较大值')
i(5,2)
-
关键字参数传递、默认参数传递
将实参按照相应的关键字传递给形参。
定义时可以指定形参的默认值
#关键字传参
def info(name,age):
print("My Name is:%s"%name)
print("Age:%d"%age)
info(age=19,name="AAA")
#默认传参
def infos(name,age,sex="男"):
print("My Name is:%s"%name)
print("Age:%d"%age)
print("Sex:%d"%sex)
info(age=19,name="AAA",sex="男")
参数的打包与解包
- 接收以字典或元组形式打包的多个值
- 实参是元组 → 可以使用“*”拆分成多个值 → 按位置参数传给形参 实参是字典 → 可以使用“**” 拆分成多个键值对 → 按关键字参数传给形参
#打包
def f(*args):
print(args)
f() #()
f(1,2,3,4) #(1,2,3,4)
def f(**kwargs):
print(kwargs)
f() #()
f(a=1,b=2) #('a':1,'b':2)
#解包
def func(a,b,c):
print(a,b,c)
argc=(1,2,3)
func(*argc) #1 2 3
kwargs = {'a':1,'b':2,'c':3}
func(**kwargs) #1 2 3
混合传递
- 混合传参规则
1.优先按位置参数传递的方式。
2.然后按关键字参数传递的方式。
3.之后按默认参数传递的方式。
4.最后按打包传递的方式。
- 带有默认值的参数必须位于普通参数之后。 带有“*”标识的参数必须位于带有默认值的参数之后。 带有“**”标识的参数必须位于带有“*”标识的参数之后。
6.4函数的返回值
6.4.1 定义
- 函数中的return语句会在函数结束时将数据返回给程序,同时让程序回到函数被调用的位置继续执行
def filter_sensitive_word(words):
if"山寨" in words:
new_words = words.replace("山寨","**")
return new_words
result = filter_sensitive_words("这手机是山寨的")
print(result)
#这个手机是**版的
- 函数使用return语句返回了多个值,那么这些值将被保存到元组中
def a(x,y):
i=1
y=2
z=3
return i,y,z
print('返回类型:',type(a()))
print('返回值:',a())
#返回类型:<class 'tuple'>
#返回值:(1,2,3)
注:函数是可以返回执行结果值;函数的返回值有三类:返回单个值、返回None、返回多个值;函数返回多个值是,是需要通过变通的方式实现,即需要借助列表、元组、字典等序列对象。
6.5 变量作用域
- 变量并非在程序的任意位置都可以被访问,其访问权限取决于变量定义的位置,其所处的有效范围称为变量的作用域。
- 根据作用域的不同,变量可以划分为局部变量和全局变量。
6.5.1 局部变量和全局变量
-
定义
全局变量和局部变量的区别在于作用域,全局变量在整个py文件中声明,全局范围内可以使用;局部变量是在某个函数内部声明的,只能在函数内部使用。
-
局部变量
不同函数内部可以包含同名的局部变量,这些局部变量的关系类似于不同目录下同名文件的关系,它们相互独立,互不影响。
name="a"
def a1():
name="b"
def b1():
global name
name="c"
b1()
print(name)
print(name)
a1()
print(name)
#"a","b","c"
-
全局变量
全局变量可以在整个程序的范围内起作用,它不会受到函数范围的影响。
a = "ZZZ"
def return_website():
return website
print(f'My name is {return_website}')
# My name is ZZZ
-
在函数内部
函数内部只能访问全局变量,而无法直接修改全局变量。如果局部变量与全局变量变量名一样,则优先调用局部变量。
-
关键字(global)
如果想在函数内部改变全局变量,在前面加上global关键字。
a=10
def i():
global a
a = 100
print(a) # 打印全部变量
i() # 局部变量
print(a) # 改变后的全局变量
6.6 特殊形式的函数
6.6.1 递归函数
-
定义
若函数内部调用了自身,则这个函数被称为递归函数。
-
条件
- 递归公式是求解原问题或相似的子问题的结构。
- 边界条件是最小化的子问题,也是递归终止的条件。
-
阶段
-
递推:递归本次的执行都基于上一次的运算结果。
-
回溯:遇到终止条件时,则沿着递推往回一级一级地把值返回来。
6.6.2 匿名函数
-
区别
普通函数在定义时有名称,而匿名函数没有名称;
普通函数的函数体中包含有多条语句,而匿名函数的函数体只能是一个表达式;
普通函数可以实现比较复杂的功能,而匿名函数可实现的功能比较简单;
普通函数能被其他程序使用,而匿名函数不能被其他程序使用。
定义好的匿名函数不能直接使用,用一个变量保存它,以便后期可以随时使用这个函数
总结
主要讲解了函数的相关知识,包括函数概述、函数的定义和调用、函数参数的传递、函数的返回值、变量作用域、特殊形式的函数。