PYTHON NOTES · 03
掌握函数定义、参数传递、返回值、作用域、匿名函数与递归。
- 函数
- 参数
Python 函数与参数
掌握函数定义、参数传递、返回值、作用域、匿名函数与递归。
1.函数入门
#1.定义函数
# 语法
# def 函数名():
# 函数体
#如果只定义不调用,只是保存了一个函数,不会执行这个函数
#2.调用函数:调用函数就是执行函数里面的代码
#语法
#函数名()
#练习:
# 1.定义一个函数实现xxxx效果
#定义函数
def avg_xy ():
x=int(input("请输入一个较小的数字"))
y=int(input("请输入一个较大的数字"))
count=y-x+1
sum=0
while x<=y:
sum+=x
x+=1
print(f"平均值为{sum/count}")
#调用函数
avg_xy()
2.函数的参数说明
#先写死,再写活
#先写定一个数字,再把数字改成形参
#先定义一个求1-100的和的函数
#再把1和100改成x,y,
# 函数就变成了:求两个任意值的函数
#这两个值在调用函数时输入
#练习 求x~y平均值函数
#定义函数
def avg_xy (x,y):
count=y-x+1
sum=0
while x<=y:
sum+=x
x+=1
print(f"平均值为{sum/count}")
#调用函数
avg_xy(1,100)
avg_xy(1,50)
avg_xy(50,100)
3.函数的返回值
# 总结:
# 1.想让函数运行的结果被外部获取到,return 结果
# 2.函数return后面的代码不会执行
# 3.return【内容】,return也可以单独使用
# 4.如果不写return或者return后面没有内容。函数的结果是none
def avg_xy(x, y):
total = 0
while x <= y:
total += x
x += 1
return total
print(avg_xy(1, 100))
# return后面的代码是不会执行的(可以用于中断函数)
# 函数都是有返回值的,每个函数都会在最后一行默认加上return none
4. 函数的说明文档
def get_sum(x,y):
"""
这是一个非常简单的函数
:param x: 一个数
:param y: 另一个数
:return: 两数相加的结果
"""
return x+y
#函数说明文档就是高级注释
print(get_sum(1,3))
5.函数的嵌套
import random
# 1 生成一个长度为10的随时列表(1~10)列表
def get_random_list():
"""
生成一个1-10的10位的列表
:return: 这个列表
"""
ran_l1=[random.randint(1,10) for i in range(10)]
return ran_l1
#2 把一个列表里面的内容有高到低排序
def sort_list(sort_l2:list):
"""
把一个列表从大到小排序
:param sort_l2: 无序列表
:return: 排序好的列表
"""
sort_l2.sort(reverse=True)
return sort_l2
#3.把新建一个函数,完成上面两个函数的内容
def get_random_sort():
l1=get_random_list()
l2=sort_list(l1)
return l2
print(get_random_sort())
6.变量的作用域
#局部变量无法在全局进行访问
#如果想在局部修改全局
#global num 表名修改全局变量
#如果要在全局使用局部变量 只能使用return
num=1
def x():
global num
num = 10
age = 20
return age
a = x()
print(num,a)
7.多返回值
#1.直接写
# return x,y
8.多种参数传递
# 位置参数 形参和实参位置和个数一一对应
# 关键字参数 通过”键=值“传递,可以忽略位置顺序
# 键就是定义函数的形参
# 也可以位置和关键字搭配使用
# 缺省参数——默认值参数
# 如果不传递默认值参数,就以默认值为主,传递了就替换
# 默认值可以不传递
# 默认值一般写在最后
# 不定长参数——参数的个数不确定,可能有也可能没有
# 位置传递 *args——接收会合并为元组
# 关键字传递 **kwargs——会使用字典接收
# 调用x=1 输出 {"x":1}
# 练习
# 1.定义打印个人信息
def person(name, age, gender):
print(f"{name}年龄{age}性别{gender}")
# 1.用位置参数传递
person("张三", "18", "男")
# 2.通过关键字传递参数
person(name="美美", gender="女", age=17)
# 3.通过位置或关键字传递
person("碗", gender="男", age=22)
# 4.打印个人信息,gender可选择传递
def person(name, age, gender="女"):
print(f"{name}年龄{age}性别{gender}")
person(age=16, name="小王")
# 5.定义一个函数求任意数字的和
def total(*args):
n = sum(args)
return n
print(total(1, 2, 3, 4, 5))
def person(**kwargs):
print(kwargs)
9.匿名函数
lambda 表达式
#为什么要学习:如果一个函数只有一行表达式,就直接使用lambda定义
#语法
f=lambda a,b:a+b
#自带return效果
#调用函数
print(f(1,2))
#字典的排序
students=[
{'name':'tom','age':20},
{'name':'tm','age':22},
{'name':'to','age':21},
]
#表示取列表中每一个字典的age的值,params表示每一个字典,params['age']表示age的值
res=sorted(students,key=lambda params:params['age'])
print(res)
10.递归
三要素:1.将复杂的内容做成重复的相同的事
2.出口
3.有返回值
# 递归
# 1.求1-10所有数的和
def get_sum(n):
if n == 1:
return 1
return get_sum(n - 1) + n
print(get_sum(10))
# 2.求1-10的阶乘
def get_jc(n):
if n == 1:
return 1
return n * get_jc(n - 1)
print(get_jc(10))
#斐波那契数列
def f(n):
if n==1:
return 1
if n==2:
return 1
return f(n-1)+f(n-2)
print(f(9))
#强化需求:求一个字典里有多少键
department={
'黑马程序员':{
'西安校区':3,
'北京校区':11,
},
"博学谷":{"狂野大模型":3},
"传智大学":1
}
#1.新建一个函数用于求字典有多少键
def get_partment(d):
total =0
total += len(d)
#2.判断值是否还为字典
for i in d:
#3.如果值为字典继续调用函数统计字典的值
if type(d[i]) is dict:
total += get_partment(d[i])
#4.返回值为键的个数
return total
print(get_partment(department))
#2.统计字典的所有值的和
def get_dpt_num(d):
total = 0
for i in d:
if type(d[i]) is int:
total += d[i]
else:
total += get_dpt_num(d[i])
return total