函数
1. 函数就是有特定功能的工具 。Python中有内置函数(Python解释器预先封装好的)与 自定义函数(用户自定义封装的)之分。
2. 使用函数的原因:可以减少代码冗余,增加代码复用性;使代码逻辑更加清晰;一次编写,任意次数调用。
3. 一个标准的函数定义格式是:
def 函数名(形参1, ......):
'''
该函数的作用(函数的注释)
:param 形参1: 对形参1的解释
:param .....: .....
:return:
'''
代码体
return 函数的返回值
'''
注意:
函数名的命名规则与变量名的一模一样
不能以关键字作为函数名,避免与内置函数重名
函数也应该做到见名知意
'''
'''
函数在定义阶段只检测语法,不执行代码
比如里面写多了一个 if 后面就没了,运行就会报错
执行的时候,代码有问题才会报错了
变量可以通过变量名找到对应的值
函数可以通过 函数名 加 括号 找到函数体所对应的的代码并执行
函数必须先定义后调用(函数名+括号)
定义了之后的函数可以在任意位置调用
'''
4. 返回值
利用 return 关键字可直接结束函数。
所有的函数都有返回值,无论写不写return。python中,不写返回值默认返回 None。只写 return 或者 return None 并不是为了考虑返回值的问题,而是为了结束函数的运行。
函数返回值的五种情况:
# 1.不写return
def func_no_return():
print(1, 2, 3)
print(func_no_return()) # 接收到的是None
# 1 2 3
# None
# 2.return后面什么也不跟
def func_just_return():
print(1, 2, 3)
return
print("hello world.") # 这一句print 并未被执行
print(func_just_return()) # 接收到的是None
# 1 2 3
# None
# 3.写return None
def func_return_none():
print(1, 2, 3)
return None
print(func_return_none()) # 接收到的是None
# 1 2 3
# None
# 4.写return 返回一个值
def func_return_one():
print(1, 2, 3)
return 1
print(func_return_one()) # 接收到的是返回值 1, 这个值可以是python的任意数据类型
# 1 2 3
# 1
# 5.写return多个值
def func_return_many():
print(1, 2, 3)
return 1, 2, 3
print(func_return_many()) # 接收到的是一个元组,包裹上这三个元素,想要多个返回值不被包装成元组返回,可以选择将其整体包装成一个大类型(例如列表,最外层在套一个列表 [[1,2,3]. [1,2,3]])
# 1 2 3
# (1, 2, 3)
5. 函数的参数
形参:在函数定义阶段,函数的括号内写的变量名,叫做该函数的形式参数,简称形参
实参:在函数调用阶段,括号内实际传入的值,叫做实际参数,简称实参
形参与实参的关系:形参就相当于变量名,而实参相当于变量的值,函数调用传参的过程就是给形参、变量名赋值的过程
默认值参数:在函数的定义阶段,形参(变量名)就已经被赋值了的参数。如 def my_max(x,y=100): 这里的y就是一个默认值参数
注意:
1. 实参和形参的绑定关系只在函数的运行阶段有效,函数运行结束后自动解除 。也只在函数内部有效。
2. 在函数的调用阶段 位置参数和关键字参数 可以混合使用。但是必须保证:位置参数必须在关键字参数的前面(越短的越靠前,越长的越复杂的越靠后);同一个形参不能被多次赋值。
# 位置形参:在函数定义阶段按照位置从左往右依次书写的变量名
def my_max(x, y):
print(x, y)
if x > y:
return x
else:
return y
# res = my_max(1) # 会报错,在调用函数的时候 少一个实参不行
# res = my_max(1, 2, 3) # 会报错,在调用函数的时候 多一个实参也不行
# 第一种直接按照位置传 一一对应
res = my_max(20, 10)
# 20 10
# 位置实参:在函数的调用阶段 传入的参数会按照位置一一对应给形参
# 第二种指名道姓的传 >>>:关键字传参
my_max(y=20, x=10)
my_max(10, y=20) # 位置和关键字混合使用
my_max(20, y=40)
# 10 20
# 10 20
# 20 40
参数组合:
在 Python 中定义函数,可以用位置参数、默认参数、可变参数、命名关键字参数和关键字参数,这 5 种参数中的 4 个都可以一起使用,但是注意,参数定义的顺序必须是:
位置参数、默认参数、可变参数和关键字参数。
位置参数、默认参数、命名关键字参数和关键字参数。
要注意定义可变参数和关键字参数的语法:
*args 是可变参数,args 接收的是一个 `tuple`
**kw 是关键字参数,kw 接收的是一个 `dict`
6. 函数的注释
"""
该函数的作用
:param x: 对形参x的解释
:param y: 对形参y的解释
:return: 对函数返回值的解释
"""
参考:https://www.cnblogs.com/suwanbin/p/11152151.html
练习题:
1. 怎么给函数编写文档?
函数文档就是用来查看当前函数相关信息介绍的一个特定格式。查看函数文档的方法:
help(函数名)
此方法会直接输出函数文档的内容
函数名.__doc__
直接输出显示函数文档的内容元字符串
(可以使用 print(函数名.__doc__) 来解决无格式问题)
例如:
#定义函数文档的方式
def funName(**sample):
'''
这里是函数文档
本函数功能是...
要求的参数类型是...
返回的数据是...
'''
print('函数文档的定义方法')
help(funName) #查看函数文档
'''
函数文档的作用是对函数进行说明,便于阅读和快速掌握函数的使用,通常函数文档需要具有以下信息:
1.函数的作用
2.函数的参数介绍(需要几个参数,分别是什么类型)
3.函数的返回值(数据和类型)
'''
2. 怎么给函数参数和返回值注解?
参数注解就是在定义函数时,在参数列表内部的参数后面加上冒号和要传入的类型,写了参数注解也无法强制限定变量的类型,只能作为提示,来告知使用者应该传入什么类型的参数。如:
def accumlate(x:int, y:int):
return x*y
返回值注解就是在参数列表后面,冒号前面,增加一个 -> 后面接返回值的类型。如:
def accumlate(x:int, y:int) -> int:
return x*y
这些注解都会以字典的形式存在函数的.__annotations__属性中。
accumlate.__annotations__
{'x': int, 'y': int, 'return': int}
print(accumlate.__annotations__)
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}
3. 闭包中,怎么对数字、字符串、元组等不可变元素更新。
**闭包**
- 是函数式编程的一个重要的语法结构,是一种特殊的内嵌函数。
- 如果在一个内部函数里对外层非全局作用域的变量进行引用,那么内部函数就被认为是闭包。
- 通过闭包可以访问外层非全局作用域的变量,这个作用域称为 <b>闭包作用域</b>。闭包的返回值通常是函数。
如果要修改闭包作用域中的变量则需要 `nonlocal` 关键字
4. 分别根据每一行的首元素和尾元素大小对二维列表 a = [[6, 5], [3, 7], [2, 8]] 排序。(利用lambda表达式)
a=[[6, 5], [3, 7], [2, 8]]
print(a)
x = sorted(a, key=lambda a: a[0], reverse=False)
print("按照首字符正序排列:"+str(x))
x = sorted(a, key=lambda a: a[0], reverse=True)
print("按照首字符逆序排列:"+str(x))
x = sorted(a, key=lambda a: a[1], reverse=False)
print("按照尾字符正序排列:"+str(x))
x = sorted(a, key=lambda a: a[1], reverse=True)
print("按照尾字符逆序排列:"+str(x))
5. 利用python解决汉诺塔问题? 有a、b、c三根柱子,在a柱子上从下往上按照大小顺序摞着64片圆盘,把圆盘从下面开始按大小顺序重新摆放在c柱子上,尝试用函数来模拟解决的过程。(提示:将问题简化为已经成功地将a柱上面的63个盘子移到了b柱)