当前位置: 首页 > news >正文

python--实验7 函数(1)

知识点

函数的定义与调用

  • 函数分类:内置函数和自定义函数。
  • 函数定义:使用def关键字定义函数,包括函数名、参数列表和函数体。
  • 注意:
    • (1)即使该函数不需要接收任何参数,也必须保留一对空的圆括号。
    • (2)python的参数不需要声明数据类型
    • (3)括号后面的冒号不能省略。
    • (4)函数体相对于def关键字必须保持一定的空格缩进。  
    •   (5)return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return           相当于返回 None。强调了即使函数不需要参数,也必须保留空括号,参数不需要声明数据类型,函数体需要适当的缩进,以及return语句的使用。
  • 无参函数有参函数:无参数和有参数的函数。
  • 空函数:使用pass关键字定义空函数的情况
  • 函数调用:如何调用函数,包括无参数和有参数的情况。
    • 如果调用的是无参数函数,则实参列表省略。 通常将函数定义和函数调用都放在一个程序文件中,然后运行程序文件。
    • 嵌套调用

递归函数

  • 递归定义:指一个函数的函数体中又直接或间接地调用该函数本身的函数。
  • 递归出口与递归体:如何设置递归的终止条件(出口)和递归的计算过程(体)。
  • 实例:提供了计算阶乘和求和的递归函数示例。

函数参数的传递

  • 参数传递:Python中参数传递的机制,区分了不可变对象和可变对象的传递方式。在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。当参数类型为固定数据类型(如整数、浮点数、字符串、元组等)时,类似 C++ 的值传递,在函数内部直接修改形参的值不会影响实参。当参数类型为可变数据类型(如列表、字典、集合等)时,类似 C++ 的引用传递。在函数内部使用下标或其他方式为其增加、删除元素或修改元素值时,修改后的结果是可以反映到函数之外的,即实参也会得到相应的修改
  • 不可变参数类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。展示了在函数内部修改不可变类型参数不会影响外部变量。
  • 可变参数类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。展示了可变类型参数在函数内部的修改会影响到外部变量。

参数的类型

  • 位置参数:调用函数时实参和形参的顺序和数量必须一致。
  • 关键字参数:如何使用关键字参数来指定实参对应的形参,允许参数的顺序不固定。
    • 关键字参数的形式为:        形参名=实参值
    •   通过形式参数的名称来指示为哪个形参传递什么值,这可以跳过某些参数或脱离参数的顺序。(实参名来自形参的名字)
  • 默认值参数:展示了如何为函数参数设置默认值,以及相关的规则。
    • 默认值参数的形式为:     形参名=默认值
    • 注意: (1)默认值参数必须出现在形参表的最右端。也就是说,第一个形参使用默认值参数后,它后面的所有形参也必须使用默认值参数,否则会出错。 (2)所有的位置参数必须在默认参数前,包括函数定义和调用
  • 可变长度参数(形参):使用***来接受不定数量的参数,分别将它们存储在元组和字典中。可变长度参数永远放在参数的最后面。
    • 形参名前面加*,用来接受任意多个实参并将其放在一个元组中。
    • 元组可变长度形参
    • 形参名前面加**,可以接受任意多个 关键字=实参值 形式的实参。关键字参数和实参值参数被放入一个字典,分别作为字典的关键字和字典的值
    • 字典可变长度形参
  • 参数的解包裹传递:如何使用***来解包裹元组和字典,将它们作为参数传递给函数。包裹和解包裹并不是相反操作,是两个相对独立的过程。
    • 调用函数时,若函数接收的实参为元组或字典类型,可以对函数参数进行解包裹:
    • 使用* 可以解压待传递到函数中的元组、列表、字符串等类型,并按位置传递到函数入口参数中
    • 使用**可以解压待传递到函数的字典,并按关键字传递到函数入口参数中

                                                       代码部分 

  • 实验目的
  1. 熟练python编辑器pycharm的使用。
  2. 掌握python的函数的定义
  3. 掌握python的函数结构,参数位的设计,如何灵活使用不定长参数
  4. 理解python参数传递的过程
  5. 熟练并理解使用函数优化编程结构以及思路

二、实验环境

本次实验需使用实验室提供的Windows主机环境+pycharm

实验内容

说明:基础题为必做题,提高题为选做题

  1. (基础题)对于一个十进制的正整数, 定义函数f(n)为其各位数字的平方和,如:

    f(13)  : 10

    f(207) : 53

代码:

def f(n):return sum(int(digit)**2 for digit in str(n))# 测试代码
print(f(13))  # 输出: 10
print(f(207)) # 输出: 53

  1. (基础题)编写一个函数, 接收字符串参数, 返回一个元组,元组的第一个值为大写字母的个数, 第二个值为小写字母个数,‘hello WROLD’,返回:(5,5)

代码:

def count_letters(s):upper_count = sum(1 for char in s if char.isupper())lower_count = sum(1 for char in s if char.islower())return (upper_count, lower_count)# 测试代码
print(count_letters('helloWROLD')) # 输出: (5, 5)

提示:已知有字符串ls

ls.isupper() #判断是否为大写字母,若是,返回True

ls.islower() #判断是否为小写字母,若是,返回True

  1. (基础题) 定义一个函数,能够获取任意多个数(1-100以内)中的最大值

代码:

def max_value(*args):return max(args)# 测试代码
print(max_value(10, 20, 30, 40)) # 输出: 40

  1. (提高题)编写一个函数calcuate_ave, 可以接收任意多个数,返回的是一个元组.元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数

例如:calcuate_ave(10,13,14,15) 返回(13,[14,15])

      calcuate_ave(10,11,14,15,12) 返回(12.4,[14,15])

代码:

def calculate_ave(*args):total = sum(args)average = total / len(args)above_average = [num for num in args if num > average]return (average, above_average)# 测试代码
print(calculate_ave(10, 13, 14, 15)) # 输出: (12.75, [13, 14, 15])
print(calculate_ave(10, 11, 14, 15, 12)) # 输出: (12.4, [14, 15])

总结

        本节深入探讨了函数的基础知识,包括其定义、如何进行调用、不同参数传递机制以及装饰器的概念和使用,同时解释了变量的作用域。在Python编程语言中,函数不仅仅是数学概念中的函数映射,它更是一种执行特定运算或处理数据的程序单元。通过将代码封装进函数中,可以在程序的多个地方重复利用这段代码,而无需每次都重新编写,这正是函数带来的便利和效率。

http://www.lryc.cn/news/395657.html

相关文章:

  • 【力扣】数组中的第K个最大元素
  • WTM的项目中EFCore如何适配人大金仓数据库
  • 互联网3.0时代的变革者:华贝甄选大模型创新之道
  • Tomcat的安全配置
  • [笔记] 卷积 - 01 变速箱需要放置多少个加速度传感器?
  • Maya崩溃闪退常见原因及解决方案
  • 编码与梦想:我的CSDN创作5周年
  • Vue2 基础十Vuex
  • 【大模型】驾驭未知领域:LLM如何处理域外或无意义的提示
  • Docker容器 为MySQL创建新用户和授权
  • openssh9.8p1更新 修复漏洞(CVE-2024-6387)
  • 超市收银系统源码
  • word 使用手册
  • vue学习day03-指令修饰符、v-bind对于样式控制的增强、v-model应用于其他表单元素
  • JRE、JVM、JDK分别是什么。
  • 台灯护眼是真的吗?台灯怎么选对眼睛好?一文带你读懂!
  • 【学术会议征稿】第五届计算机工程与智能控制学术会议(ICCEIC 2024)
  • 【Golang】slice切片
  • 开源网安模糊测试平台SFuzz全新升级,从标准到实践助力车企安全出海
  • Go bytes包
  • 将List切割为多个指定长度的多个List
  • 【实战】mysql加密函数AES_ENCRYPT无缝迁移到磐维2.0的加密函数MY_ENCRYPT_AES128
  • 使用YOLO训练好自己的模型并持续训练【教程二】
  • STC32G/F/8H通用无刷电机驱动板
  • java Web 优秀本科毕业论文系统用eclipse定制开发mysql数据库BS模式java编程jdbc
  • SAP_MMABAP模块_MM60物料清单通过增强新增物料描述
  • lodash中flush的使用(debounce、throttle)
  • 设计高并发秒杀系统:保障稳定性与数据一致性
  • 从源码到成品:直播电商与短视频带货APP的开发之路
  • C++OCR API减轻人们文字录入的负担