day10-函数进阶

总结

一. 函数的参数

1. 位置参数和关键字参数

根据实参的提供方式不同将实参分为位置参数和关键字参数

1) 位置参数

调用函数的时候ran实参和形参在位置上一一对应

2)关键字参数

调用函数的时候以'形参名=值'的形式确定形参对应的实参

3)位置参数和关键字参数混用

位置参数必须在关键参数前面, 同时必须保证每个参数都会有值

def func1(x, y, z):
    print(f'x:{x}, y:{y}, z:{z}')


# 位置参数
func1(10, 20, 30)
func1(10, 30, 20)

# 关键字参数
func1(x=10, y=20, z=30)
func1(z=30, x=10, y=20)

# 混用
func1(10, 20, z=30)
func1(10, z=30, y=20)
# func1(x=10, 20, z=30)   # SyntaxError: positional argument follows keyword argument

2.参数默认值

定义函数的时候可以直接在新村后面用=给参数赋默认值

有默认值的参数在调用的时候可以不用传参

如果有的参数有默认值有的没有,有默认值的参数必须放在没有默认值参数的后面

def func2(x=10, y=20, z=30):
    # x = 100
    print(f'x:{x}, y:{y}, z:{z}')


func2()
func2(100)
func2(z=300)


def func3(z, x=10, y=20):
    print(f'x:{x}, y:{y}, z:{z}')


func3(100)
func3(z=200)

print(10, 20, end='\n', sep=',')
print(10, 20, sep=',', end='\n')

3. 参数类型的说明

无默认参数的类型说明 - 类型名

有默认值的参数默认值的类型就是参数对应的类型

4. 不定长参数

1) 带*的不定长参数:

在某个形参前加*, 那么这个形参就是一个不定长参数, 它可以接收多个实参

带*的参数本质就是一个元组, 对应的实参是元组中的元素

注意:*的不定长参数对应的实参必须用位置参数传参

2)带**的不定长参数:

在某个形参前加**, 那么这个形参就是一个不定长参数, 它可以接收任意多个实参

带**的参数本质就是一个字典,对应的关键字参数就是字典中的键值对

注意: **的不定长参数对应的实参必须使用关键字参数传参
a. 定长参数在*的不定长参数前, 定长和不定长都使用位置参数传参
b. 定长在*的不定长参数后, *后面的定长参数必须是用关键字参数传参
c.定长参数在**的不定长前,定长既可以用位置参数也可以用关键字参数
d.定长参数不能放在**对应的不定长参数后面
e. 带的不定长参数和带的不定长参数可以一起使用, 带*****的必须放在带*的后面

二.函数的返回值

1. 返回值

返回值的作用就是将函数内部的数据传递到函数外部

2. 怎么确定函数返回值 - 怎么将函数内容的数据传递到外部

在函数体中用return关键字来返回返回值(一个函数只有一个返回值)

什么时候需要返回值: 如果函数的功能产生了新的数据, 将新的数据返回

3.怎么获取函数返回值

获取函数调用变大时的值就是获取函数返回值

函数调用表达式 - 调用函数的语句

函数调用表达式的值就是函数返回值, 函数返回值能做的事情,函数调用表达式都可以做

4. 函数调用过程

第一步: 回到函数定义的位置

第二步: 传参

第三步: 执行函数体

第四步:执行函数体的时候确定函数返回值

(看执行函数体的时候有没有遇到return,如果遇到return,return后面的值是什么, 函数返回值就是什么

并且在遇到return的时候函数直接结束. 如果没有遇到return, 函数的返回值是None)

第五步: 回到函数调用的位置(这个时候函数调用表达式的值才是函数的返回值)

三. 变量的作用域

1. 变量的作用域 - 已经定义过的变量能使用的范围

根据变量作用域的不同, 将变量分为全局变量和局部变量两种

2.全局变量

没有定义在函数里面或者类里面的变量就是全局变量

全局变量的作用域: 从定义开始到程序结束的任何位置都可以使用

3. 局部变量

定义在函数里面的变量就是局部变量(形参也是局部变量)

局部变量的作用域: 从定义开始到函数结束

4. 函数调用过程就是压栈的过程

调用函数的时候, 系统会自动在栈区间为这个函数创建一个临时栈区间, 用来保存在函数中产生的数据

当函数调用结束, 这个临时的栈区间会自动释放(释放之前会将返回值传递到临时栈区间的外部).

5. global

在函数中修改一个全局变量的值或者在函数定义一个全局变量

global 变量名

使用变量

作业

  1. 编写一个函数,计算一个整数的各位数的平方和
例如: sum1(12) -> 5(1的平方加上2的平方)    sum1(123) -> 14
def sum1(int1:int):
    '''
    计算一个整数的各位数的平方和
    :param int1: 输入一个整数
    :return: 返回输入整数的个位数平方和
    '''
    num1 = str(int1)
    result = 0
    for x in num1:
        result += int(x)**2
    return result
  1. 写一个函数,求一个数字列表中绝对值最大的元素
例如:nums = [-23, 100, 89, -56, -234, 123], 最大值是:-234
def abs_max(list1:list):
    '''
    求list1中绝对值最大的元素
    :param list1: 输入一个纯数字列表
    :return: 返回列表中绝对值最大的元素
    '''
    abs_max1 = 0
    for x in list1:
        if abs(x) > abs(abs_max1):
            abs_max1 = x
    return abs_max1
  1. 编写函数实现字符串join方法的功能,将指定序列中的元素通过指定字符串合并成一个新的字符串
def new_join(seq, str1: str):
    '''
    将指定序列seq中的元素通过str1合并参数一个新的字符串
    :param seq: 指定序列
    :param str1:用来连接的字符串
    :return:新的字符串
    '''
    str2 = str(seq[0]) + str1
    for x in seq[1:]:
        str2 = str2 + str(x) + str1
    return str2[:-1]
  1. 写一个函数实现列表extend的功能,将指定序列中的元素全部添加到指定列表中
def new_extend(list1: list, seq):
    '''
    将seq中的元素全部添加到list1中
    :param list1:指定的列表
    :param seq:指定序列
    :return:新的列表
    '''
    # list2 = []
    for x in seq:
        list1.append(x)
    return list1
  1. 写一个函数实现简易计算器的功能:输入第一个数字,输入运算符,输入第二个数字,计算结果。
执行过程1:
计算器:
>10
>+
>20
=30

执行过程1:
计算器:
>10
>x
>20
=200

....
def counter(num1 = input('>'), str1 = input('>'), num2 = input('>')):
    '''
    计算器
    :param num1: 输入第一个数
    :param str1: 输入运算符号
    :param num2: 输入第一个数
    :return: 输出结果
    '''
    result = num1[0]
    if not num1 or str1 not in ('+', '-', '*', '/'):
        return None
    elif str1 == '+':
        return int(num1) + int(num2)
    elif str1 == '-':
        return int(num1) - int(num2)
    elif str1 == '*':
        return int(num1) * int(num2)
    elif str1 == '/':
        return int(num1) / int(num2)
  1. 已经列表points中保存的是每个点的坐标(坐标是用元组表示的,第一个值是x坐标,第二个值是y坐标)
points = [
  (10, 20), (0, 100), (20, 30), (-10, 20), (30, -100)
]

1)获取列表中y坐标最大的点

def y_max(list1: list):
    ymax = list1[0][1]
    count = 0
    for x in range(1, len(list1)):
        if list1[x][1] > ymax:
            ymax = list1[x][1]
            count = x
    return list1[count]

2)获取列表中x坐标最小的点

def x_min(list1: list):
    xmin = list1[0][0]
    count = 0
    for x in range(1, len(list1)):
        if list1[x][0] < xmin:
            xmin = list1[x][0]
            count = x
    return list1[count]

3)获取列表中距离原点最远的点

def far(list1: list):
    new_far = list1[0][0]**2 + list1[0][1]**2
    count = 0
    for x in range(1, len(list1)):
        if list1[x][0]**2 + list1[x][1]**2 > new_far:
            new_far = list1[x][0]**2 + list1[x][1]**2
            count = x
    return list1[count]

4)将点按照点到x轴的距离大小从大到小排序

def x_dist(list1: list):
    res = []
    list2 = sorted(set([abs(x[-1]) for x in list1]), reverse=True)
    for y in list2:
        res.extend([x for x in list1 if x[-1] in [y, -y]])
    return res
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、函数的返回值 1.什么是返回值1)返回值的作用: 将函数里面的数据传递到函数外面2)初学怎么确定需不需要返回子...
    孤独的死小孩阅读 270评论 0 1
  • 函数的返回值 1.什么是返回值 返回值的作用:将函数里面的数据传递到函数外面 初学者怎么确定需不需要返回值:看函数...
    碧潭飘雪ikaros阅读 267评论 0 1
  • 函数的调用过程:回到函数声明的位置,用实参给形参赋值(传参)执行函数体,返回值,回到函数调用位置 压栈调用函数的时...
    L_4bc8阅读 342评论 0 0
  • 函数的高级使用 匿名函数 1.什么是匿名函数 匿名函数还是函数,只是声明的格式和普通函数不一样。只适用于函数功能比...
    馒头不要面阅读 200评论 0 0
  • 1.什么是函数 函数就是对实现对某一特定功能的代码段的封装 2.函数的分类 内置函数(系统函数):python已经...
    Givemeasmi_75e7阅读 389评论 0 0

友情链接更多精彩内容