Day10_函数进阶
笔记:
函数的参数
1.位置参数和关键字参数
- 根据实参提供的不同分为位置参数和关键字参数
"""
1)位置参数:调用函数的时候让形参和实参在位置上一一对应
2)关键字参数:调用函数的时候以"形参名 = 值"的形式确定对应实参。
3)位置参数和关键字参数混用:位置参数必须在关键字参数前面,同一形参不能多次赋值,所有形参都必须赋值
"""
- 参数默认值
- 定义函数的时候可以直接在形参后面用 = 给形参赋默认值
- 有默认值的参数在调用的时候可以不用传参
- 如果有的参数有默认值,有的没有,有默认值的参数必须放在没有默认值参数的后面
- 参数类型说明
- 无默认值参数的类型说明 - :类型名
- 有默认值的参数,默认值的类型就是参数对应类型
- 不定长参数
"""
1)带*的不定长参数:在某个形参前面加*,那么这个形参就是一个不定长参数,它可以接受任意多个实参。
带*的参数本质就是一个元组,对应实参就是元组中的元素
注意:带*的不定长参数对应的实参必须用位置参数传参
2)带**的不定长参数:在某个形参前加**,那么这个形参就是一个不定长参数,它可以接受任意多个实参。
带**的参数本质就是一个字典,对应的关键字参数就是字典中的键值对
注意:**的不定长参数对应的实参必须使用关键字参数传参
- 定长参数在*的不定长参数前,定长和不定长都适用位置参数传参
- 定长在*的不定长参数后面,*后面的不定长参数必须是用关键字参数传参
- 定长参数在**的不定长前,定长既可以用位置参数也可以用关键字参数
- 定长参数不能放在**对应不定长参数后面
- 带的不定长参数和带**的不定参数可以一起用,带的必须放在带**的前面
函数返回值
- 返回值
- 返回值的作用就是将函数内部的数据传递到函数外部
- 怎么确定函数返回值 - 怎么将函数内容的数据传递到外部
- 在函数体中用return关键字来返回返回值(一个函数只有一个返回值)
- 什么时候需要返回值:如果函数的功能产生了新的数据,将新的数据都返回
- 怎么获取函数的返回值
- 获取函数调用表达式的值就是获取函数返回值
- 函数调用表达式 - 调用函数的语句
- 函数表达式的值就是函数返回值,函数返回值能做的事情,函数调用表达式都可以做
- 函数调用过程
"""
第一步:回到函数定义的位置
第二步:传参(用实参给形参赋值,这个时候要保证每个参数都有值)
第三步:执行函数体
第四步:执行完函数体的时候确定函数返回值
(看执行函数体的时候有没有遇到return,如果遇到return后面的值是什么,函数
返回值就是什么,并且函数在遇到return直接结束。如果没有遇到return,函数返回值是None)
第五步:回到函数调用的位置(这个时候函数调用表达式的值才是函数的返回值)
"""
变量的作用域
- 变量的作用域
- 已定义过的变量能使用的范围
- 根据变量的作用域不同,将变量分为全局变量和局部变量两种
- 全局变量
- 没有定义在函数里面或者类里面的变量就是全局变量
- 全局变量的作用域:从定义开始到程序结束的任何位置都可以使用
- 局部变量
- 定义在函数里面的变量就是局部变量(形参也是局部变量)
- 局部变量的作用域:从定义到函数结束
- 函数调用过程就是压栈过程
"""
调用函数的时候,系统会自动在栈区间为这个函数创建一个临时栈区间,用来保存在函数中产生的数据,局部变量。当函数调用结束,这个临时栈区间会自动释放(释放之前会将返回值传递到临时栈区间的外部)。
"""
- global
- 在函数里面去修改一个全局变量的值或者定义一个全局变量
"""
global 变量名
使用变量或者给变量赋值
"""
作业:
- 编写一个函数,计算一个整数的各位数的平方和
例如: sum1(12) -> 5(1的平方加上2的平方) sum1(123) -> 14
def quadratic_sum(num:int):
"""
一个整数的各位数的平方和
:param num: 一个整数
:return: 各位数上的平方和值
"""
str_num = str(num)
sum1 = 0
for x in str_num:
sum1 += int(x)**2
return sum1
- 写一个函数,求一个数字列表中绝对值最大的元素
例如:nums = [-23, 100, 89, -56, -234, 123], 最大值是:-234
def list_max_value(list1: list):
"""
一个数字列表中绝对值最大的元素
:param list1: 一个数字列表
:return: 列表中绝对值最大元素的值
"""
list2 = [-x if x < 0 else x for x in list1]
max_value = list2[0]
num1 = 0
for index in range(1, len(list2)):
if list2[index] > max_value:
max_value = list2[index]
num1 = index
return list1[num1]
- 编写函数实现字符串join方法的功能,将指定序列中的元素通过指定字符串合并成一个新的字符串
def join(str_sep: str, seq):
"""
将指定序列中的元素通过指定字符串合并成一个新的字符串
:param str_sep: 指定字符串
:param seq: 指定序列
:return: 新字符串
"""
str0 = ''
for x in seq:
str0 += str(x) + str_sep
return str0[:-len(str_sep)]
- 写一个函数实现列表extend的功能,将指定序列中的元素全部添加到指定列表中
def extend(list1: list, seq):
"""
将指定序列中的元素全部添加到指定列表中
:param list1: 指定列表
:param seq: 指定序列
:return: 新列表
"""
list2 = [x for x in seq]
list_sum = list1 + list2
return list_sum
- 写一个函数实现简易计算器的功能:输入第一个数字,输入运算符,输入第二个数字,计算结果。
def calculator(num1: float, operator: str, num2: float):
"""
计算两个数的运算结果
:param num1: 数字1
:param operator: 运算符号
:param num2: 数字2
:return: 计算结果
"""
if operator == '+':
result = num1 + num2
return result
if operator == '*':
result = num1 * num2
return result
if operator == '-':
result = num1 - num2
return result
if operator == '/':
result = num1 / num2
return result
if operator == '//':
result = num1 // num2
return result
if operator == '%':
result = num1 % num2
return result
if operator == '**':
result = num1 ** num2
return result
- 已经列表points中保存的是每个点的坐标(坐标是用元组表示的,第一个值是x坐标,第二个值是y坐标)
points = [
(10, 20), (0, 100), (20, 30), (-10, 20), (30, -100)
]
# 1)获取列表中y坐标最大的点
point_y = [x[1] if x[1] >= 0 else -x[1] for x in points]
max_y = point_y[0]
index0 = 0
for index in range(1, len(point_y)):
if point_y[index] > max_y:
index0 = index
print(f'y坐标最大的点{points[index0]}')
# 2)获取列表中x坐标最小的点
point_x = [x[0] if x[0] >= 0 else -x[0] for x in points]
min_x = point_x[0]
index0 = 0
for index in range(1, len(point_x)):
if point_x[index] < min_x:
index0 = index
print(f'x坐标最小的点{points[index0]}')
# 3)获取列表中距离原点最远的点
max_len = points[0][0]**2+points[0][1]**2
index0 = 0
for index in range(1,len(points)):
if points[index][0]**2+points[index][1]**2 > max_len:
index0 = index
print(f'距离原点最远的点{points[index0]}')
#4)将点按照点到x轴的距离大小从大到小排序
new_list = []
new_points = points[:]
point_y = [x[1] if x[1] >= 0 else -x[1] for x in points]
point_y_sort = sorted(point_y, reverse=True)
for y in point_y_sort:
for x in new_points:
if y ** 2 == x[1] ** 2:
if x not in new_list:
new_list.append(x)
print(new_list)
1)获取列表中y坐标最大的点
2)获取列表中x坐标最小的点
3)获取列表中距离原点最远的点
4)将点按照点到x轴的距离大小从大到小排序