文章目录
思维导图
一、函数的基本概念
1.函数用法和底层分析
函数是可更用的程序代码块。函数的作用,不仅可以实现代码的复用,更能实现代码的一致性。一致性指的是,只要修改函数代码,则所有调用该函数的地方都能得到体现。
(在编写函数时,函数体中的代码写法和我们的面达的基本一致,只是对代码实现了封装,并增加了函故调用、传递参数、返回计算结果等内容。)
2.函数简介
①函数的基本概念
1.由一个个程序一个个任务组成;函数就是代表一个任务或一个功能
2.函数是代码复用的通用机制。
②Python 函数的分类
Python 中函技分为如下几类:
- 内置函数
str().list(). len()等都是内置函数,可以拿来真接使用,
- 标准库函数
可以通确过 import 语句导入库,然后使用其中定义的函教
- 第三方库函数
Python社区也提供了很多高质量的库。下安装这些后,通过 import 语句导入,然后可以使用这些第三方库的函数
- 用户自定义函数
用户自己义的函数,显然也是开发中话应用户自身需求定义的函数。
二、函数的定义和调用
1.核心要点
①语法
Python 中,定义函数的语法如下:
def 函数名([参数列表]):
“文档字符串”
函数体
②要点
- 我们使用def来定义函数,然后就星一个空格和函教名称;
(1) Python执行def 时,会创一个函数对象,并绑定到函数名变量上。
- 参数列表
(1) 圈括号内是形式参数列表,有多个参技数则使用逗号隔开
(2) 形式参数不需要声明类型,也不需要指定函数返回值类型
(3)无参数,也必须保留空的括号
(4实参列表必须与形参列表一一对应
- return返回值
(1) 如果函数体中包含return语句,则略束函教执行井返回值
(2)如果函数体中不包含return语句,则回None 值。
- 调用函数之前,必须先定义函数,即先调def 创建函数对象
(1) 内置函数对象会自动创建
(2 标准库和第三方库函数,通过 import导入模块时,会执行模块中的def 语句
- 试验:
def test():
print('*'*5)
print(id(test))
print(type(test))
print(test) #打印对象的value
print(test()) #执行函数体,返回None
test()
>>>
2523548717416
<class 'function'>
<function test at 0x0000024B8F399168>
*****
None
*****
2.形参和实参
(1) 括号内是形式参数列表,有多个参数则使用逗号隔开
(2) 形式参数不需要声明类型,也不需要指定函数返回值类型
(3)无参数,也必须保留空的括号
(4)调用函数时,传递的参数为“实际参数”,实参列表必须与形参列表一一对应
(5)形式参数命名规则要符合“标识符”命名规则
- 试验:定义一个函数,实现比较功能,返回较大值
def compare(a,b): #a和b为形式参数
if a>b:
return a
else:
return b print(compare(2,3)) #2和3为实际参数
三、文档字符串(函数的注释)
程序的可读性晨理要,一般建议在函数体开始的部分附上函数定义说明,这就是“文档字符串”,也有人成为“函数的注释”。可以通过三个单引导或者三个双引号来实现,中间可以加入多行文字进行说明。
- 试验:
def star(n):
"根据传入的n,打印多个星号"
print("*"*n)
help(star)
>>>
Help on function star in module __main__:
star(n)
根据传入的n,打印多个星号
help(star.__doc__)
>>>
No Python documentation found for '根据传入的n,打印多个星号'.
Use help() to get the interactive help utility.
Use help(str) for help on the str class.
调用help(函数名.doc), 可以打印函数的文档符串。
四、返回值
return返回值要点
1.如果函数体中包return 语句,则结束函数执行并返回值
2.如果函数体中不包含return 语句,则返回None 值。
3.要返回多个返回值,使用表,元组,字典、集合将多个值 “存起来”。
- 试验:定义一个返回两个数平均值的函数
def ave(m,n):
'''计算传入的m,n的平均值'''
a=(m+n)/2
return a
print(ave(9,10))
>>> 9.5
五、变量的作用域(全局变量、局部变量)
变量起作用的范围称为变量的作用域,不同作用域内同名变量之间互不影响。变量分为:全局变量、局部变量。
1.全局变量
- 在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始到模块结束
- 全局变量降低了函数的通用性和可读性。应尽量免全同变量的使用。
- 全局变量一般做常量使用。
- 函数内要改变全局变量的值,使用global 声明一下
2.局部变量
-
在函数体中(包合形式参数)声明的变量。
-
局部变量的引用比全局变量快,优先考虑使用。
-
如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量
-
试验:全局变量作用域;局部变量与全局变量同名
a=100 #全局变量 def f1():
global a #函数内要改变全局变量的值,使用global 声明一下
print(a) #打印全局变量a
a=300 #局部变量与全局变量同名
f1() print(a)
>>> 100 300
- 试验:输出全局变量和局部变量
a=100
def f1(a,b,c):
print(a,b,c)
print(locals())
print("*"*10)
print(globals())
f1(2,3,4)
>>>
2 3 4
{'a': 2, 'b': 3, 'c': 4}
**********
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001B4120B5A08>,
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/PycharmProjects/untitled4/shiyan.py',
'__cached__': None, 'a': 100, 'f1': <function f1 at 0x000001B4122C9168>}
3.局部变量和全局变量的效率测试
局部量的查询访问速度比全局变量快,优先考虑使用,尤其是在循环的时候。
在特别强调效率的地方或循环次数较多的地方 可以通过将全局变量转为局部交量提高运行速度
import math
import time
def test1():
start=time.time()
for i in range(10000000):
math.sqrt(30)
end=time.time()
print("用时{0}".format((end-start)))
def test2():
b=math.sqrt
start=time.time()
for i in range(10000000):
b(30)
end=time.time()
print("用时{0}".format((end-start)))
test1()
test2()
结果为:
用时2.8063881397247314
用时1.975881814956665