一、函数说明文档(函数描述)
def func1(a, b):
"""
求两个数的和
:param a: 数字,整型
:param b: 数字,整型
:return: 两个数的和
"""
return a + b
func1(1, 2)
二、参数列表中,可以通过参数名:类型名,也可以通过默认值来说明参数类型
类型说明只是提示调用者应该传什么类型的数据,但并不是不能传其他类型的数据
说明类型的好处:a.能清楚知道应该传什么类型的数据,b.写代码时有相关提示
-> int :说明函数返回类型如下:
def func2(a:int, b = 0, c = '') -> int:
"""
求两个数和
:param a:整型数字
:param b: 整型数字
:return: 和
"""
return sum(a + b)
func2(1, 2, 'a')
注意:再次强调函数声明不会执行函数体
三、不定长参数
面试题: args和kwargs的区别?
*参数名:将位置参数作为元祖的元素。参数就是一个元祖
**参数名:将关键字参数,参数名为key,实参为值组合成键值对,作为字典的元素。参数是一个字典
注意:这两种方式一般一起用,并且 参数名必须放在参数名 的前面
def function1(*args):
print(args)
function1(1, 2, 3) # (1, 2, 3)
def function2(**args):
print(args)
function2(a = 1, b = 2, c = 3) # {'a': 1, 'b': 2, 'c': 3}
# 两种方式一般一起用
def func3(*args, **kwargs):
print(args, kwargs)
func3(1,2) #(1, 2) {}
func3(a = 1, b = 2, c = 3) # () {'a': 1, 'b': 2, 'c': 3}
func3(1, 2, a = 4, b = 5, c = 6) # (1, 2) {'a': 4, 'b': 5, 'c': 6}
四、返回值
python中所有的函数都有返回值。如果遇到return函数的返回的值就是return后面的值,没有遇到return就是None
1.匿名函数
以另一种方式声明函数
- 格式:(声明函数)
- 函数名 = lambda 参数列表:返回值
- 说明
- 函数名:就是与变量名的要求一样
- lambda: 关键字
- 参数列表:至少有一个参数,参数1,参数2,.....
- 返回值:相当于只有一个return语句的函数体
-
::固定写法
匿名函数的调用和普通函数一样:函数名(实参列表) - 也支持位置参数,关键字参数,参数默认值,不定长参数
sum1 = lambda a, b : a + b
print(sum1(1, 2))
- 练习:求1+2+....+n的和
sum2 = lambda n : sum(range(n + 1))
print(sum2(100))
五、变量的作用域
指的是变量能使用的范围
1.全局变量局部变量
a.全局变量
声明在函数和类的外面的都是全局变量
作用域:从声明开始到整个py文件结束(任何地方都可以使用)b.局部变量:
声明在函数和类中的变量都是局部变量,作用域在声明函数开始函数和类结束
def fun1():
aa = 100
for x in range(2):
t = x
print(x)
print(aa)
fun1()
print(aa) # NameError: name 'aa' is not defined
2.两个关键字
- a.global关键字
注意:只能在函数中使用
**功能:i.可用于标识使用外部全局变量,ii.还可以是在函数内部声明一个全局变量
name = 'abc'
def fun2():
global name #
name = 'aaa' # 未使用global
print(name) # 未使用global 结果:aaa
# 使用global 结果:aaa
fun2()
print(name) # 未使用global 结果:abc
print(name) # 使用global 结果:aaa
- b.nonlocal关键字
想要在局部的局部中修改局部变量的值
def fun3():
abc = 100
def fun4():
nonlocal abc
abc = 200
print(abc)
fun4()
print(abc)
fun3()
print(abc) # abc还是局部的
注意:声明函数就是声明一个类型是function的变量,函数名实质就是变量名
def fun1():
print('abc')
print(type(fun1)) # 不加括号,加括号是调用函数获取返回值
3.函数作为列表的元素
a = 10
list1 = [1, a]
print(list1)
def fun2():
print('我是函数')
return 10
list2 = [1, fun2, fun2()]
print(list2)
print(list2[1]())
print(list2[2] + 100)
4. 将函数作为参数
a = 10
def fun1(n):
print(n)
fun1(a)
def fun2(n):
n()
def fun3(n):
print('hello')
fun3(fun2) # 作为参数给形参赋值
应用:
语法:list.sort(key=None, reverse=False)
使用sort的时候,可以通过给key赋一个函数变量,来规定列表中的元素标准来排序。
并且这里的函数必须要求有一个返回值
list1 = [1, 9, 2, 3, 4]
list1.sort()
print(list1)
list2 = [
{'name': '张三', 'age': 20},
{'name': '李四', 'age': 18},
{'name': '小明', 'age': 22}
]
# 根据列表里面的那个元素排序
def get_age(item):
return item['age']
# key需要传一个函数
list2.sort(key = get_age, reverse = True)
print(list2)
list3 = [
('a', 20),
(10, 3),
('b', 90)
]
def get_factor(item):
return item[1]
list3.sort(key=get_factor, reverse=True)
print(list3)
list3.sort(key = lambda item:item[1], reverse = True)
5.将函数作为返回值
根据运算符,返回对应的功能
def operation(operator):
if operator == '+':
def fun1(*args,**kwargs):
# 求和
sum1 = 0
for x in args:
sum1 += x
for key in kwargs:
sum1 += kwargs[key]
return sum1
return fun1 # 切记不要加括号
re = operation('+')(10, 20,a = 1, b = 2)
print(re)
注意:Python中的函数可以有多个返回值
练习:求多个数的和以及均值
def qf_sum(*args):
sum1 = sum(args)
average = sum1 / len(args)
return sum1, average
print(qf_sum(78, 89))
6.函数的调用过程是一个压栈过程
每次调用函数的时候,系统都会在内存中(栈)开辟空间来存储函数执行过程中产生的数据(函数中声明的变量)
当函数调用完成后,这块内存会自动销毁
六、递归函数
函数中自己调用自己,这样的函数就是递归函数
循环可做的事递归都能做,但是循环能做的事绝不选递归
如下就是一个是循环
def fun():
print('==')
fun()
fun()
1.怎么写递归函数
- 第一步:确定临界值(函数结束的条件),让函数结束
- 第二步:找关系,假设函数的功能已经实现,找f(n)和f(n-1)的关系
- 第三步:根据关系,用f(n-1)实现f(n)的功能
练习:写一个递归函数,实现:1+2+3+...n
def qf_sum(n):
# 1.找临界值
if n == 1:
return 1
"""
找关系
qf_sum(n) = 1+2+3....n
qf_sum(n-1) = 1+2+3+...+n-1
qf_sum(n) = qf_sum(n-1) + n
"""
return qf_sum(n - 1) + n
print(qf_sum(100))
练习
# 用递归实现
"""
n = 3
***
**
*
n = 4
****
***
**
*
"""
def print_star(n):
if n == 1:
print('*')
return
"""
找关系
f(n)和f(n-1)的关系
先打印n颗*
在打印f(n-1)
"""
print('*' * n)
print_star(n-1)
print_star(5)
注意:能不用就不用,递归会突发性消耗内存