期末作业第六章

第6章函数

学习目标

  1. 函数的概念及优势
  2. 函数的定义和使用,函数参数的传递
  3. 变量作用域
  4. 局部变量和全局变量,递归函数和匿名函数

函数
函数是一串有名字的代码,以函数名()的形式调用。
print() #输出
input() #输入

优点:
减少冗余代码,让结构更为清晰
提高开发人员的编程效率
方便后期维护与扩展

定义函数
使用关键字def来定义函数,语法格式如下:
调用函数
函数在定义完成后只有被调用才会执行。语法格式如下:
函数名([参数列表])
函数内部也可以嵌套其他函数
函数在定义时可以在内部嵌套定义另外一个函数,此时嵌套函数叫外层函数,被嵌套的叫内层函数。
在这里插入图片描述

函数外部无法直接调用内层函数
只能通过外层函数间接调用内层函数
示例:
有参函数:

def add_modify(a, b):
    result = a + b
    print(result)

无参函数:

def add():
    result = 11 + 22
    print(result)

调用函数
函数在定义完成后不会立刻执行,直到被程序调用时才会执行。
语法格式:
函数名([参数列表])
嵌套调用函数add()
调用函数示例:

def add_modify(a, b):
    result = a + b
    add()      #嵌套调用函数add()
print(result)
add_modify(10,20)

调用过程:

  1. 程序在调用函数的位置暂停执行。

  2. 将数据传递给函数参数。

  3. 执行函数体中的语句。

  4. 程序回到暂停处继续执行。

函数的嵌套
函数在定义时可以在其内部嵌套定义另外一个函数,此时嵌套的函数称为外层函数,被嵌套的函数称为内层函数。
在这里插入图片描述

函数参数的传递
定义函数时设置的参数叫形参,调用时传入的叫实参。参数传递指的是将实际参数传递给形式参数的过程。
参数的传递可以分为位置参数传递,关键字参数传递,默认参数传递,参数的打包与解包以及混合传递。

位置参数的传递
将第一个实参传递给第一个形参,将第二个实参传递给第二个形参,以此类推。
示例:

def get_max(a, b):
    if a > b:
        print(a,"是较大的值!")
    else:
        print(b,"是较大的值!")
get_max(8, 5)

关键字参数传递
通过实参=形参的格式将他俩关联,将实参按照相应的关键字传递给形参。
新增了/来限定部分形参只接受采用位置传递方式的实参。
示例:

def connect(ip, port):
    print(f"设备{ip}:{port}连接!")
connect(ip="127.0.0.1", port=8080)

默认参数传递
在定义时可以指定形参的默认值,如此被调用时可以选择是否带给默认值的形参传值。
示例:
定义函数:

def connect(ip, port):
    print(f"设备{ip}:{port}连接!")
connect(ip="127.0.0.1", port=8080)

调用函数:

connect(ip="127.0.0.1")
connect(ip="127.0.0.1", port=3306)

参数的打包与解包
1、打包

如果函数在定义时无法确定需要接收多少个数据,那么可以在定义函数时为形参添加“”或“**”:
p “ * ” —— 接收以 元组 形式打包的多个值
p “ ** ” —— 接收以 字典 形式打包的多个值
打包——"
"
示例:
定义函数:

*” —— 接收以元组形式打包的多个值
“**”—— 接收以字典形式打包的多个值

调用函数:

test(11, 22, 33, 44, 55)

打包——"**"
示例:

定义函数:

def test(**kwargs):
    print(kwargs)

调用函数:

test(a=11, b=22, c=33, d=44, e=55)

解包
实参是 元组 → 可以使用“ * ” 拆分 成多个值 → 按 位置 参数 传 给形参
实参是 字典 → 可以使用“ ** ” 拆分 成多个键值对 → 按 关键字 参数 传 给 形参
示例:
定义函数:

def test(a, b, c, d, e):
    print(a, b, c, d, e)

调用函数:

nums = (11, 22, 33, 44, 55)
test(*nums)

混合传递
使用混合传递要遵循以下原则:
优先按位置参数传递的方式
然后按关键字参数传递的方式
之后按默认参数传递的方式
最后按打包参数传递的方式

在定义函数时
带有默认值的参数必须位于普通参数之后。
带有标识的参数必须位于带有默认值的参数之后。
带有**标识的参数必须位于带有
的标识的参数之后。
示例:
定义函数:

def test(a, b, c=33, *args, **kwargs):
print(a, b, c, args, kwargs)

调用函数:

test(1, 2)
test(1, 2, 3)
test(1, 2, 3, 4)
test(1, 2, 3, 4, e=5)

函数的返回值
return语句在函数结束时将数据返回,同时让程序回到被调用的位置继续执行。
如果返回了多个值,这些值将保存在元组中。

变量作用域
变量的访问权限取决于变量定义的位置,所处的有效范围成为变量的作用域。

局部变量和全局变量
根据作用域不同 变量可以划分为局部变量和全局变量。
不同函数内部可以包含同名的局部变量 他们相互独立。
全局变量可以在整个程序的范围内,不受到函数范围的影响。
全局变量在内部只能被访问,而无法直接修改。
局部变量示例:

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

全局变量:

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

global和nonlocal关键字
global关键字
使用global关键字可以将局部变量声明为全局变量。
nonlocal
在局部作用域中修改嵌套作用域中定义的变量。
global示例:

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

nonlocal示例:

def test():
    number = 10
    def test_in():
        nonlocal number
        number = 20
    test_in()
    print(number)
test()

特殊形式的函数
递归函数
若函数内部调用了自身,则这个函数被称为递归函数。
递归函数在定义时需要满足两个条件:一个是递归公式,另一个是边界条件:
递归公式是求解原问题或相似的子问题的结构;
边界条件是最小化的子问题,也是递归终止的条件。

递推:地柜本次的执行都基于上一次的运算结果。
回溯:遇到终止条件时,则沿着递推往回一级一级的把值返回来。
递归函数的一般定义格式如下所示:

def函数名([参数列表]):
if 边界条件:
rerun 结果
else:
return 递归公式

匿名函数
匿名函数和普通函数的主要区别如下:

  1. 普通函数在定义时有名称,而匿名函数没有。
  2. 普通函数包含多条语句,而匿名函数只能有一个表达式。
  3. 普通函数可以实现比较复杂的功能,匿名只能实现比较简单的。
  4. 普通函数能被其他程序使用,而匿名函数不能。
    Python中使用lambda关键字定义匿名函数,它的语法格式:
    lambda <形式参数列表> :<表达式>
# 定义匿名函数,并将它返回的函数对象赋值给变量temp
temp = lambda x : pow(x, 2) 
temp(10) 

本章小结
主要讲解了函数的概述,定义和调用,参数的传递,返回值,变量作用域,特殊形式的函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值