目录

  • 1.1 函数概述
  • 1.2 定义函数和调用
    • 函数的定义
    • 函数的调用
  • 1.3 参数的传递
    • 位置参数的传递
    • 关键字参数的传递
    • 默认(缺省)参数的传递
    • 参数的打包与解包
    • 混合传递
  • 1.4 函数的返回值
  • 1.5 变量的作用域
    • 局部变量和全局变量
    • global和nonlocal关键字
      • global 关键字
      • nonlocal 关键字
  • 1.6 特殊形式的函数
    • 递归函数
    • 匿名函数
  • 实训案例
    • 实训案例1- 峡谷猜想
    • 实训案例2-饮品自动售货机
    • 实训案例3-兔子数列
    • 实训案例4-归并排序
  • 阶段案例-学生管理系统

1.1 函数概述

函数 是组织好的、实现单一功能相关联功能代码段。我们可以将函数视为一段有名字的代码,这类代码可以在需要的地方以“函数名()”的形式调用。

函数的优势 :

  • 使用函数来编程可使程序模块化,减少了冗余的代码
  • 让程序结构更为清晰
  • 能提高开发人员的编程效率
  • 方便后期的维护扩展

可以更高效地实现代码重用,复制粘贴也可以实现代码重复使用,但是效率低。

# # 方式1:print()打印
# # 打印边长为2个星号的正方形
# for i in range(2):
#     for j in range(2):
#         print('*', end='')
#     print()
#
# # 打印边长为3个星号的正方形
# for i in range(3):
#     for j in range(3):
#         print('*', end='')
#     print()
#
# # 打印边长为4个星号的正方形
# for i in range(4):
#     for j in range(4):
#         print('*', end='')
#     print()# 方式2:函数调用
def print_t(lenth):for i in range(lenth):          # i 代表 行for j in range(lenth):      # j 代表 列(x轴)print('*', end='')print('')print_t(2)                           # 函数调用
print_t(3)
print_t(4)# print(print_t(2))
# print(print_t(3))
# print(print_t(4))

1.2 定义函数和调用

原则: 先定义函数,再调用函数

函数的定义

前面使用的 print() 函数和 input() 都是 Python 的内置函数,这些函数由 Python 定义。

开发人员也可以根据自己的需求定义函数,Python中使用关键字def来定义函数,其语法格式如下:

示例:定义一个计算两数之和的函数


# 无参数函数的定义
def add():result = 11 + 22print(result)def add2(a,b):result2 = a + bprint(result2)add()           # 函数的调用
add2(100,233)   # 调用

函数的调用

函数在定义完成后不会立刻执行,直到被程序调用时才会执行。

函数调用的语法格式如下:

函数名 ([参数列表])

def add2(a,b):result2 = a + bprint(result2)add2(100,233)   # 调用

调用函数,计算机程序经历了以下4个步骤:

  • 程序在调用函数的位置暂停执行。
  • 将数据传递给函数参数
  • 执行函数体中的语句
  • 程序回到暂停处继续执行。

函数内部也可以调用其他函数,这被称之为函数的嵌套调用。

示例如下:

# 无参数函数的定义
def add():result = 11 + 22print(result)def add2(a,b):result2 = a + bprint(result2)add()                   # 函数嵌套调用# 函数的调用
add2(100,233)   # 调用

扩展

函数的嵌套定义

函数在定义时可以在其内部嵌套定义另外一个函数,此时嵌套的函数被称为外层函数,被嵌套的函数称为内层函数

示例如下:

# 函数的嵌套定义
# 注意:外层函数无法直接调用内层函数,只能在外层函数中调用内层函数
def add2(a,b):result2 = a + bprint(result2)def add():                                  # 定义add()内层函数print('test:函数嵌套定义的测试!')add()                                       # 调用add()内层函数add2(100,233)   # 调用

注意:外层函数无法直接调用内层函数,只能在外层函数中调用内层函数

1.3 参数的传递

我们通常将定义函数时设置的参数称为形式参数(简称为形参),将调用函数时传入的参数称为实际参数(简称为实参)。函数的参数传递是指将实际参数传递给形式参数的过程。

函数参数的传递可以分为:

  • 位置参数的传递
  • 关键字参数的传递
  • 默认参数参数的传递
  • 参数的打包解包
  • 混合传递

位置参数的传递

位置参数的传递

位置参数:调用函数时根据函数定义的实际参数位置来依次传递给形式参数,即将第1个实际参数传递个第1个形式参数,将第2个实际参数传递给第2个形式参数。

# 位置参数的传递
# 位置参数:调用函数时根据函数定义的参数位置来传递参数
def user_info(name, age, gender):print(f'名字是:{name}, 年龄是:{age}, 性别是:{gender}')user_info('小明', 42, '男')

注意:传递和定义的参数的 顺序个数必须一致

user_info('小明', '男', 42, 12)   # 参数的个数不一致会报错
user_info('小明', '男', 42)       # 参数顺序不一致不会报错,但数据无意义

关键字参数的传递

背景:若函数的参数数量较多,开发者很难记住每个参数的作用,再按照位置参数是不可取的。

此时可以使用关键字参数的方式传递参数。

关键字参数:“ = ” or "形参=实参"形式指定,让函数更加清晰,同时清除了参数的顺序需求。

注意:如果有位置参数和关键字参数同时存在时,应该将位置参数放在前面,关键字参数仍然不考虑顺序

# 关键字参数的传递
# 关键字参数:"键 = 值"形式指定,让函数更加清晰,同时清除了参数的顺序需求。
# 注意:如果有位置参数和关键字参数同时存在时,应该将位置参数放在前面,关键字参数仍然不考虑顺序def user_info(name, age, gender):print(f'名字是:{name}, 年龄是:{age}, 性别是:{gender}')user_info(name='小明', gender='男',age=13)
user_info('王芳',gender='女', age=20)

仅限制位置形参 使用斜杠符号"/ " ,说明指定位置的形参只能采用位置参数方式传递实参。

示例如下:

# 仅限位置形参
def user_info(name, age, /, gender):print(f'名字是:{name}, 年龄是:{age}, 性别是:{gender}')user_info('王芳',12, gender='男')

默认(缺省)参数的传递

默认参数简介:在函数定义的时候,给形式参数赋个默认值;在函数调用的时候可以根据需要选择是否使用默认值,若不需要,实参可重新给形参指定一个参数

注意:默认参数的位置必须在位置参数的后面(末尾)

# 默认(缺省)参数 传递
# 介绍:在函数定义的时候,给形式参数赋个默认值;在函数调用的时候可以根据需要选择是否使用默认值,若不需要,实参可重新给形参指定一个参数
# 注意:默认参数的位置必须在位置参数的后面(末尾)def user_info(name, age, gender='女'):print(f'名字是:{name}, 年龄是:{age}, 性别是:{gender}')user_info('王芳', 12)                       # 使用默认参数
user_info('王芳', 12, gender='男')          # 修改默认参数值

运行程序,输出结果如下:

参数的打包与解包

混合传递

1.4 函数的返回值

1.5 变量的作用域

变量并非在程序的任意位置都可以被访问,其访问权限取决于变量定义的位置。变量的有效范围称为该变量的作用域。本节将对变量作用域的相关知识进行详细讲解。

局部变量和全局变量

根据作用域的不同,变量可以分为局部变量全局变量。下面分别对局部变量和全局变量进行介绍。

局部变量是指在函数内部定义的变量,它只能在函数内部被使用,函数执行结束之后局部变量会被释放,此时无法进行访问。

def test_one():number = 10                                # 局部变量print(number)                              # 函数内部访问局部变量
test_one()
print(number)                                 # 函数外部访问局部变量

全局变量可以在整个程序的范围内起作用,它不会受函数范围的影响。

number = 10                  # 全局变量
def test_one():print(number)             # 函数内部访问全局变量
test_one()
print(number)                # 函数外部访问全局变量

多学一招:LEGB原则

LEGB是程序中搜索变量时所遵循的原则,该原则中的每个字母指代一种作用域,具体如下。

  • (1)L(Local):局部作用域。例如,局部变量和形参生效的区域。
  • (2)E(Enclosing):嵌套作用域。例如,嵌套定义的函数中外层函数声明的变量生效的区域。
  • (3)G(Global):全局作用域。例如,全局变量生效的区域。
  • (4)B(Built-in):内置作用域。例如,内置模块声明的变量生效的区域。

global和nonlocal关键字

函数内部无法直接修改全局变量在嵌套函数的外层函数声明的变量,但可以使用globalnonlocal关键字修饰变量以间接修改以上变量,下面将介绍global和nonlocal关键字的用法。

global 关键字

使用global关键字可以将局部变量声明为全局变量,其使用方法如下:

如此便可以在函数内部修改全局变量。在test_one()函数中使用global关键字声明全局变量number,然后在函数中重新给number赋值,代码如下:

number = 10                      # 定义全局变量
def test_one():global number                 # 使用global声明变量number为全局变量number += 1print(number)
test_one()
print(number)

运行代码,结果如下所示:
11
11
由结果可知代码能正常运行,说明使用global关键字修饰后可以在函数中修改全局变量。

nonlocal 关键字

使用nonlocal关键字可以在局部作用域中修改嵌套作用域中声明的变量,其使用方法如下:

def test():number = 10                        # 定义全局变量def test_in():nonlocal number                # 使用nonlocal关键字修饰了嵌套函数中的变量numbernumber = 20test_in()print(number)
test()

以上定义的test()函数中嵌套了函数test_in(),test()函数中声明了一个变量number,而在test.in()函数中使用nonlocal关键字修饰了变量number,并修改了number的值,调用test_in()函数后输出变量number的值。
运行代码,结果如下所示:
20

从程序的运行结果可以看出,程序在执行test_in()函数时成功地修改了变量number,并且打印了修改后number的值。

1.6 特殊形式的函数

递归函数

匿名函数

匿名函数是一类无须定义标识符的函数,它与普通函数一样可以在程序的任何位置使用。Python中使用lambda关键字定义匿名函数,它的语法格式如下:

lambda <形式参数列表> : <表达式>

结合以上语法格式可知,匿名函数与普通函数主要有以下区别

  • (1)普通函数在定义时有名称,而匿名函数没有名称
  • (2)普通函数的函数体中包含多条语句,而匿名函数的函数体只能是一个表达式
  • (3)普通函数可以实现比较复杂的功能,而匿名函数可实现的功能比较简单
  • (4)普通函数能被其他程序使用,而匿名函数不能被其他程序使用

定义好的匿名函数不能直接使用,最好使用一个变量保存它,以便后期可以随时使用这个函数。例如,定义一个计算数值平方的匿名函数,并赋值给一个变量,具体代码如下:

# 定义匿名函数,并将它返回的函数对象赋值给变量temp
temp = lambda x : pow(x, 2)

此时,变量temp可以作为匿名函数的临时名称调用函数,示例代码如下:

print(temp(10))

运行代码,结果如下所示:
100

实训案例

实训案例1- 峡谷猜想

角谷猜想又称冰雹猜想,是由日本数学家角谷静夫发现的一种数学现象,它的具体内容是:

以一个正整数n为例,

如果n为偶数,

就将它变为n/2,

如果除后变为奇数,

则将它乘3加1(即3n+1)。

不断重复这样的运算,经过有限步后,必然会得到1。

据日本和美国的数学家攻关研究,所有小于7×1 011的自然数,都符合这个规律。

本案例要求编写代码,计算用户输入的数据按照以上规律经多少次运算后可变为1。

import timedef guess(number):i = 0  # 统计变换的次数original_number = number  # 记录最初的numberwhile number != 1:if number % 2 == 0:  # number为偶数number = number / 2else:  # number为奇数number = number * 3 + 1print(f'number的值为:{number}')i += 1time.sleep(0.5)print(f"{original_number}经过{i}次变换后回到1")num = int(input("请输入一个大于1的正整数:"))
guess(num)

实训案例2-饮品自动售货机

实训案例3-兔子数列

实训案例4-归并排序

阶段案例-学生管理系统

"""
使用自定义函数,完成对程序的模块化
学生信息包含:姓名、性别、手机号
该系统具有的功能:添加、删除、修改、显示、退出系统
设计思路:
提示用户选择功操作
获取用户选择的功能
根据用户的选择,分别调用不同的函数
"""
# 新建一个列表,用来保存学生的所有信息
stu_info = []
# 功能打印
# 1.打印功能菜单
def print_menu():print('=' * 30)print('学生管理系统 V10.0')print('1.添加学生信息')print('2.删除学生信息')print('3.修改学生信息')print('4.查询所有学生信息')print('0.退出系统')print('=' * 30)# 2.添加学生信息
def add_stu_info():# 提示并获取学生的姓名new_name = input('请输入新学生的姓名:')# 提示并获取学生的性别new_sex = input('请输入新学生的性别:')# 提示并获取学生的手机号new_phone = input('请输入新学生的手机号码:')new_info = dict()new_info['name'] = new_namenew_info['sex'] = new_sexnew_info['phone'] = new_phonestu_info.append(new_info)# 3.删除学生信息
def del_stu_info(student):del_num = int(input('请输入要删除的序号:')) - 1del student[del_num]print("删除成功!")# 4.修改学生信息
def modify_stu_info():if len(stu_info) != 0:stu_id = int(input('请输入要修改学生的序号:'))new_name = input('请输入要修改学生的姓名:')new_sex = input('请输入要修改学生的性别:(男/女)')new_phone = input('请输入要修改学生的手机号码:')stu_info[stu_id - 1]['name'] = new_namestu_info[stu_id - 1]['sex'] = new_sexstu_info[stu_id - 1]['phone'] = new_phoneelse:print('学生信息表为空')# 5.显示所有的学生信息
def show_stu_info():print('学生的信息如下:')print('=' * 30)print('序号    姓名    性别    手机号码')i = 1for tempInfo in stu_info:print("%d    %s    %s    %s" % (i, tempInfo['name'],tempInfo['sex'], tempInfo['phone']))i += 1# 在main函数中执行不同的功能
def main():while True:print_menu()      # 打印功能菜单key = input("请输入功能对应的数字:")  # 获取用户输入的序号if key == '1':    # 添加学生信息add_stu_info()elif key == '2':  # 删除学生信息del_stu_info(stu_info)elif key == '3':  # 修改学生信息modify_stu_info()elif key == '4':  # 查询所有学生信息show_stu_info()elif key == '0':quit_confirm = input('亲,真的要退出么?(Yes or No):').lower()if quit_confirm == 'yes':print("谢谢使用!")break  # 跳出循环elif quit_confirm == 'no':continueelse:print('输入有误!')if __name__ == '__main__':main()

Python快速编程入门#学习笔记06# |第6章 :函数(学生管理系统)相关推荐

  1. Python快速编程入门#学习笔记08# |第8章 :面向对象

    目录 1. 面向对象概述 2. 类的定义 3.对象的创建与使用 类的成员 4.属性 1.类属性 2.实例属性 5.方法 1.实例方法 2.类方法 3.静态方法 6.私有成员 特殊方法 7.构造方法 8 ...

  2. Python快速编程入门#学习笔记01# |第一章 :Python基础知识 (Python发展历程、常见的开发工具、import模块导入)

    全文目录 ==先导知识== 1 认识Python 1.1.1 Python的发展历程 1.1.2 Python语言的特点 2. Python解释器的安装与Python程序运行 1.2.1 安装Pyth ...

  3. Python快速编程入门#学习笔记03# |第二章 :Python基础(代码格式、标识符关键字、变量和数据类型、数字类型以及运算符)

    全文目录 ==先导知识== 学习目标: 2.1 代码格式 2.1.1 注释 2.1.2 缩进 2.1.3 语句换行 2.2 标识符和关键字 2.2.1 标识符 2.2.2 关键字 2.3 变量和数据类 ...

  4. Python快速编程入门#学习笔记02# |第十章 :Python计算生态与常用库(附.小猴子接香蕉、双人乒乓球小游戏源码)

    全文目录 学习目标 1. Python计算生态概述 1.1 Python计算生态概述 2. Python生态库的构建与发布 2.1 模块的构建与使用 * 2.1.1第三方库/模块导入的格式 2.2 包 ...

  5. 【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV

    邂逅OpenCV 文章目录 邂逅OpenCV 前言 1.1 OpenCV周边概念认知 1.1.1 图像处理.计算机视觉与OpenCV 1.1.2 OpenCV概述 1.1.3 起源及发展 1.1.4 ...

  6. 【OpenCV3编程入门学习笔记】——第3章 HighGUI图形用户界面初步

    文章目录 前言 3.1 图形的载入.显示和输出到文件 3.1.1 OpenCV的命名空间 3.1.2 Mat类简析 3.1.3 图像的载入与显示概述 3.1.4 图像的载入:imread()函数 3. ...

  7. 【python快速编程入门 第2版】第一章 python概述 习题

    一.填空题 1.Python是面向___对象的高级语言. 2.Python 可以在多种平台运行,这体现了Python语言_可移植性的特性. 3.Python模块的本质是.py文件. 4.使用impor ...

  8. 01.Java 编程入门学习笔记20210307

    Java 编程入门学习笔记-day01 第0章:编程入门 1.计算机的概述 计算机 = 硬件 + 软件 1.1硬件:冯诺依曼体系 CPU: CPU的衡量标准:速度的计量单位是赫兹(Hz),1Hz相当于 ...

  9. python快速编程入门教程-终于懂得python快速编程入门教程

    为了提高模块加载的速度,每个模块都会在__pycache__文件夹中放置该模块的预编译模块,命名为module.version.pyc,version是模块的预编译版本编码,一般都包含Python的版 ...

最新文章

  1. 好文深思:1.3 万亿条数据查询,如何做到毫秒级响应?
  2. 学习韩立刚老师IT运维课程,成为韩立刚老师正式学生,在全国范围为你就近推荐工作。...
  3. leetcode139. 单词拆分
  4. Slimming Down Windows XP The Complete Guide 【 10章完整版 】
  5. Webpack3 从入门到放弃
  6. SetLayeredWindowAttributes 设置窗口透明
  7. 在Mybatis中处理sql中的大于号小于号
  8. iOS Xcode热重载工具: InjectionIII 使用简介(无需重启,快速刷新界面,动态调试)
  9. Kafka学习之broker配置(0.8.1版)(转)
  10. 计算机视觉专业名词中英文对照(转)
  11. 什么是运维?运维主要做哪些工作?
  12. 申通快递年营收253亿:净亏9亿 上年同期为盈利
  13. jmeter分布式操作之远程启动功能
  14. 汉旺镇震后第九日:强忍刺鼻恶臭向废墟下搜寻
  15. 爱普生荣膺第十届制博会机器人类唯一奖项
  16. BIOS追code之SEC phase
  17. PCB高速信号布线技巧
  18. 深圳软件测试培训:软件测试技术及工具
  19. 用python读取股票价格_借助Python获取股票实时价格的操作方法
  20. 常见的排序算法及java实现

热门文章

  1. 控制JetsonNano风扇命令
  2. Django笔记:应用和分布式路由(应用创建,分布式路由的配置,应用下的模板)
  3. 榆熙:拼多多商家提升销量的技巧
  4. 【小疯疯】百度云不限速下载
  5. 【转载】SQL Server dateTime类型 模糊查询
  6. 使用 matplotlib处理彩色图像
  7. 中文编码问题分析及几种乱码场景
  8. localhost无法访问的问题
  9. 微软编程规范(文档)
  10. A component required a bean of type 'com.xxx.xxx.service.xxxService' that could not be found的debug报错