【无标题】

1.函数
函数(掌握)
函数加强(了解)
函数作用域(了解)
2.函数
问题:
如果需要在任意的地方打印10次九九乘法表,我应该怎么办呢? 会产生什么问题呢?
2.1.什么是函数
函数是具有名字的可重复执行的代码块,通过函数名字()去调用执行。
函数可以看作为完成一项功能的代码块,只有定义了才能够被调用执行。
2.2.简单函数的定义
2.2.1.语法

def 函数名():
功能代码

注意:
1.def是Python中定义函数的语法
2.函数名是该功能代码的标识,函数名字要遵循标识符的命名规则
3.功能代码被作为一个语句块出现,必须要缩进
2.2.2.案例1(九九乘法表)

你会发现当我们再次执行以上代码时,结果无法输出九九乘法表了,为什么呢?
2.3.函数的调用
2.3.1.语法
函数名()

注意:
1.def 函数():只是用来定义函数,而不是执行函数,函数只有调用才会执行。
2.函数必须先定义后调用,否则将会出现错误。
3.如果想多次执行函数,就多次调用。
2.3.2.案例1(多次调用九九乘法表执行)

2.3.3.案例2(介绍自己)

2.3.4.为什么要使用函数呢?
因为函数可以封装一个功能,该功能可以被多次使用从而达到代码重复使用的目的。函数是代码封装和代码复用的体现。

2.4.函数参数
函数的参数分为形式参数(也称为形参)和实际参数(也称为实参)
2.4.1.回顾初中二年级的一次函数
y = kb * x # (k,b是常数,k!=0)
需求:计算某城市的市内电话的月收费额y元
包含: 月租费用22元, 拨打电话x分钟的计时费按0. 1元/分钟收取

电信收费函数(公式):
y  =  22   +  0.1 * x


小丽三月份拨打电话时长为55分钟, 请计算小丽三月份的电话费y = 22+0.1*55
小明三月份拨打电话时长为550分钟, 请计算小明三月份的电话费y = 22+0.1*550


以上函数在定义时将未知数据通过x占位符代表. 真正在使用时才知道x真正的数据.

函数定义时占位符x和使用时x的真正数据在编程语言中叫做什么呢?

2.4.2.形式参数定义
形式参数写在函数定义时,出现在函数名的()里面
实际参数在函数被使用时作为具体的数据给形式参数赋值
def 函数名(形式参数1,形式参数2…):
功能代码

函数名(实际参数1,实际参数2…):
2.4.3.为什么使用参数
函数是用来完成一个功能, 但是要完成该功能时有未知数据(个数未知, 具体值未知)参与运算. 那么这些未知数据就可以通过形式参数占位. 当真正使用该功能(调用)时未知数据才能够确定. 确定的数据就是实际参数。
2.4.4.案例1(任意乘法表)

9 和 5 就是作为实际参数,将其赋值给num变量。 调用函数并且传入实际参数的过程就是将实际参数赋值给形式参数变量并且执行函数中代码的过程。
2.4.5.案例2(完成某人的自我介绍)
需求:
定义一个自我介绍的功能。
分析:
设计自我介绍功能时并不知道未来哪个人使用该功能,所以使用形式参数占位
代码实现:

执行效果:

执行过程: 实际参数分别赋值给形式参数后,函数才执行。
2.5.函数返回值
2.5.1.函数返回值定义
如果函数执行之后的结果数据需要参与后期运算时,可以通过return关键字返回函数执行的结果(返回值)。 将结果返回到函数被调用的位置。
def 函数名(形式参数1,形式参数2…):
功能代码
return 执行结果(返回值)
调用执行后的结果:
结果 = 函数名(实际参数1,实际参数2…)
解释: 将实际参数1,实际参数2赋值给形式参数1,形式参数2后,再执行函数代码块。函数的执行结果通过return关键字返回到函数调用位置,然后再赋值给 结果 变量
2.5.2.为什么用使用返回值
函数功能代码执行结果需要被后续程序继续使用。
2.5.3.案例1(加法)
需求:
定义一个两个数字相加功能并且打印出该功能的运行结果。
分析:
1.定义加法功能时并不知道是对哪两个数字进行相加,所以使用两个形式参数占位。
2.该功能的执行结果需要在后期使用(打印),所以将运算结果返回并且赋值给另外一个变量
代码实现:

执行结果:
函数执行结果为:6
2.5.4.注意事项
return在一个函数中不是必选项. 只有函数的执行结果需要参与后期运算时才将执行结果通过return返回.

函数可以看作是一个黑盒子,一个加工产品的工厂,给这个工厂一些原材料,他就能加工成需要的产品。这个产品也可以继续给下一个工厂继续加工。

2.6.定义三步曲
def 函数名(形式参数1,形式参数2…):
功能代码
return 执行结果(返回值)
调用执行后的结果:
结果 = 函数名(实际参数1,实际参数2…)
第一步:确定函数名字
根据函数的功能语义为函数命名,名字具备见名知意。
第二步:确定函数形式参数
站在函数内部(我自己是该功能)考虑问题: 完成该功能时是否有未知数据参与,如果有请使用形式参数占位,等待未来真正的使用者传递实际参数。
站在函数外部(要使用该功能)考虑问题: 当真正使用该功能时才确定需要什么参数。
第三步:确定函数返回值
站在函数外部(要使用该功能)考虑问题: 是否关心该功能的执行结果被其他程序所使用,如果需要则返回该执行结果。如果不需要则不返回。
什么时候要返回?
不清楚是否有返回值,那么就返回;
如果后续代码会使用到函数的计算结果,那就返回;
如果需求明确说明调用函数 获得/获取/得到 就需要返回;
如果调用函数的时候,明确输出/打印 那就不需要返回值.
2.6.1.案例1(求两个数的最大值)
需求:
比较两个数的最大值的功能并且在最大值的基础上添加10后打印出来。
分析:
1.确定函数名:因为比较最大值所以使用max作为函数名字。
2.确定形式参数:比较两个未知的数据的参与,所以需要两个形式参数占位并且真正的使用该功能时才知道比较那两个数据
3.确定返回值: 函数执行之后的结果还需要继续使用,在结果的基础上加10并且打印
代码实现:

3.空语句pass
3.1.什么是pass
pass是一个空的语句. 什么也不做
3.2.pass的作用
pass是一个空的语句. 不做任何事情,一般用做占位语句。是为了保持程序结构的完整性。
3.3.在哪里使用
在写代码的过程中为了程序的完整性从而不报错的一种临时写法.
if True:
pass

def info():
pass

info()

while True:
pass
4.函数加强
4.1.函数注释-语法
函数注释是对函数功能进行文字性说明,方便程序员对代码功能快速理解,写在第一行(函数名下面,代码上面),用多行注释 ,也需要缩进.
语法:
在函数名字下面通过 连续的三对引号 之间编写对函数的说明文字
例如:

注意:
函数注释必须和函数的名字对齐
4.2.名称加强
4.2.1.匿名函数(了解)
用lambda关键词能创建匿名函数。这种函数的定义省略了用def声明函数的标准步骤。
匿名函数的作用:作为实际参数使用
特点:
1.没有函数名的函数
2.在函数体中不需要手动返回,会自动返回运算的结果,也就是不需要写return
语法:
lambda 形式参数1,形式参数2,。。。 :函数代码语句
案例:

应用场景:
匿名函数作为实际参数传递给另外一个函数,在另外一个函数中被执行。
举例:
定义一个函数:有以下参数:数字1,数字2,操作函数(具体不知道如何操作)

4.3.参数加强
主要有3个点: 必需参数, 关键字参数, 默认参数
4.3.1.必需参数
定义函数时,如果形式参数没有默认值, 该参数被称为必需参数
调用的时候必须以正确的顺序传入实际参数,实参的数量必须和形参一样并且一一对应。
案例:

4.3.2.关键字参数
调用函数的时候, 给函数传递实际参数时为每个实参取一个名字,而这个名字就是形参的名字.
作用: 可以交换实际参数的顺序.
注意:关键字参数放后面
案例:

4.3.3.默认参数
定义函数时, 可以给形式参数赋值一个初始值, 该初始值被称为默认值
调用函数时,如果没有传递参数,则会使用默认参数。
以下实例中如果没有传入 age 参数,则使用默认值:

4.4.不定长参数(打包)
不定长参数的打包:
特点:
不定长, 参数的个数不确定(可多可少)
打包, 使用 元组 或者 字典 将 所有的参数集合到一起
不定长参数分类:
按位置分: 不定长位置参数打包, 使用 *args
def 函数名(*args):
args 将所有的位置参数打包成元组

按关键字分: 不定长关键字参数打包, 使用 **kwargs
    def 函数名(**kwargs):
        kwargs 将所有的关键字参数打包成了字典

总结:
*args:
接收未命名的多个参数,以元组形式表现
**kwargs:
接收已命名的多个参数,以字典形式表现
4.4.1.不定长位置参数----*args (可变长度的参数)
我们可以设计一个对多个数相加的功能? 因为不知道未来要传入多少个未知参数,所以无法确定形式参数的个数,我们可以使用不定长形式参数。
语法:
def 函数名字([其他形式参数,] *可变形式参数 ):
“函数_注释”
功能代码
return [返回值]

函数名字(值1,值2,…)

案例一:对多个数相加
代码实现:

运行结果:
21

案例二:介绍自己
代码实现:

运行结果:

4.4.2.不定长关键字参数----**kwargs (可变长度的关键字参数)
我们可以设计一个打印包含姓名,年龄的学生信息的函数,但是我们需要设计一个打印任何个数学生信息的函数怎么办呢? 因为不知道未来要传入多少个未知参数,所以无法确定形式参数的个数? 我们可以使用不定长关键字参数。
语法:
def 函数名字([其他形式参数,] **可变关键字形式参数 ):
“函数_文档字符串”
功能代码
return [返回值]

函数名字(关键字参数1=值1,关键字参数2=值2…)

案例一:打印出个人信息
代码实现:

运行结果:

4.5.拆包
实际参数的拆包:
1. 在函数调用的时候使用
2. 将 元组(列表) 或者 字典 进行拆解,作为实际参数传递给函数
4.5.1.对列表和元组拆包
拆包的使用方式:
#1 按位置拆分:
使用一个 * 元组/列表 , 自动将 元组/列表 中的元素 按照位置参数依次传递给函数
语法:
def 函数名字(形式参数1,形式参数2,形式参数3):
“函数_注释”
功能代码
return [返回值]

列表 =[元素1,元素2,元素3]
函数名字(*列表)

元组 = (元素1,元素2,元素3)
函数名字(*元组)
注意事项:
元组中的元素和形式参数的位置要一一对应.

案例一:对三个数求和
代码实现:

运行结果:
6
4.5.2.对字典拆包
将字典中的值对依次作为函数的实际参数使用。
语法:
def 函数名字(形式参数名字1,形式参数名字2,形式参数名字3):
“函数_注释”
功能代码
return [返回值]

字典 ={键1:值1, 键2:值2, 键3:值3}
函数名字(**字典)
注意事项:
字典中的键名和形式参数的名字要一一对应.
案例一:打印学生的信息
代码实现:

4.6.返回值加强
4.6.1.return关键字的作用
1.将数据返回到函数的调用位置
2.退出函数(终止函数继续执行)
4.6.2.无返回值(None)
1.return仅仅用来退出函数的执行。

2.如果函数没有明确的return 返回, 函数也会返回一个None值

4.6.3.多种返回值
函数可以根据不同的情况返回不同的值(可以有多个return语句,但是只能够执行一个)
需求:
根据传入的1,2,3,4 返回对应的季节。
代码实现:

4.6.4.返回多个值
函数可以一次性返回多个值,同时也需要多个变量保存这些返回值
语法:
def 函数名字(形式参数1,形式参数2):
return 返回值1,返回值2

变量1,变量2 = 函数名字(实际参数1,实际参数2)
需求:
同时对x,y进行求和,减运算。
代码实现:

4.7.嵌套函数调用
一个函数里面又调用了另外一个函数,这就是所谓的函数嵌套调用。(在一个功能中使用另外一个功能)

输出结果:

定义的函数my_func中以包含了函数max,min
5.变量的作用域
5.1.什么是变量作用域
变量的作用域即变量的有效范围。
函数将变量分为函数内变量和函数外变量。
函数外变量全局变量:在函数外面定义的变量就是全局变量
函数内变量局部变量:在函数内部定义的变量就是局部变量
x = “全局变量” # 定义在函数外的变量

#函数
def fn():
y = “局部变量” # 定义在函数内的变量
5.2.局部变量特点
局部变量:只能够在变量所在函数内使用,在函数外和其他函数中不能够被使用;
调用的时候开辟内存空间, 函数调用结束就释放, 起到节约空间和不会命名冲突的作用。
需求:
fn函数中定义的变量。但是在fn2中不能够使用,同时在函数外也不能够使用。
案例:

5.3.全局变量特点
5.3.1.默认情况下
1.可以被程序中的任何代码访问.
2.可以被外部的代码修改变量的值, 但函数内的代码不能够修改变量的值.
需求:
在fn函数外面中定义的变量x。可以在fn中可以访问同时在函数外使用,但是不能够在函数内修改它。
案例一:全局变量可以被任何代码访问

案例二:全局变量和局部变量同名(局部变量不会影响全局变量的值)

5.3.2.global关键字
如果一个全局变量需要在函数中被修改.那么在函数中通过global声明这个全局变量.

5.4.为什么要用变量作用域
局部变量可以在不同的函数中可以使用相同的变量名字。
局部变量在函数执行完毕之后立即释放,节约内存资源.
5.5.如何选择变量的作用域
如果变量的数据只在函数内部使用,请使用局部变量。
如果变量的数据函数内部和外部都要使用,请使用全局变量。
6.课程总结
6.1.重点
1.定义函数三步曲
6.2.难点
1.函数的理解
2.对函数返回值的理解
6.3.如何掌握?
1.深入理解定义函数三步曲
2.掌握代码的写法
3.写课堂代码
4.再做作业
6.4.排错技巧(技巧)
1.根据错误提示,仔细查看出错代码所在行与附近几行是否有语法错误。
2.使用排除法解决问题
3.打印打印在打印
6.5.待抄写理论
def 函数名(形式参数1,形式参数2…):
功能代码
return 执行结果(返回值)
调用执行后的结果:
结果 = 函数名(实际参数1,实际参数2…)

第一步:确定函数名字
根据函数的功能语义为函数命名,名字具备见名知意。
第二步:确定函数形式参数
站在函数内部(我自己是该功能)考虑问题: 完成该功能时是否有未知数据参与,如果有请使用形式占位,等待未来真正的使用者传递实际参数。
站在函数外部(要使用该功能)考虑问题: 当真正使用该功能时才确定需要什么参数。
第三步:确定函数返回值
站在函数外部(要使用该功能)考虑问题: 是否关心该功能的执行结果被其他程序所使用,如果需要则返回该直接结果。如果不需要再不返回。
7.课后练习
7.1.必做题:
1.封装函数,实现返回三个数的和
2.封装函数,实现返回三个数的最大值
3.封装函数,实现返回三个数的最小值
4.编写1个python程序,完成以下要求:
1.1 设计一个功能从键盘获取用户的姓名、性别、家庭地址
1.2 打印从该功能中获取的信息

5.设计根据QQ和密码登录的过程(QQ和密码预设为指定的值). 执行结果为登录是否成功(boolean类型的值)
6.将名片管理系统实现

7.2.选做题:
1.将名片管理系统中的每个功能设计成对应的函数.

8.面试题
1.lambda是什么?有什么用途
2.pass是干什么呢?
9.每日一练
1.如果获取一个变量的类型?
2.如果获取一个变量的地址值?

10.考试题
1.函数的语法结构? 定义函数三步曲是什么?

def 函数名字(形式参数1,形式参数2…):
pass
return 返回值

结果 = 函数名字(实际参数1,实际参数2…)

定义函数三步曲:
1.确定函数的名字: 根据功能语义命名. 见名知意.并且符合标识符的命名规范.
2.确定函数的形式参数:
A.站在函数内部考虑问题(将自己当成功能): 完成该功能时是否有未知数据参数运算. 那么这些未知数据就可以使用形式参数占位. 为了等待函数的使用者传入真正的数据.
B.站在函数外部考虑问题(函数的使用者): 明确知道要传入的数据.该数据通过实际参数传给形式参数
3. 确定函数的返回值:
站在函数外部考虑问题(函数的使用者), 使用该功能后是否关系该功能的执行结果. 该结果后期可能参与其他运算. 必须通过return将结果返回

2.变量的作用域分为几种?分别有什么特点?如何在函数内修改全局变量的值?
两种: 定义在函数外全局变量 定义在函数内局部变量

全局变量: 可以在函数外和函数内都被访问到. 但是在函数内不能够被修改(默认的情况)

局部变量: 只能够在当前函数内被使用(访问和修改). 当函数执行完毕之后内存就会被释放.

x = “全局变量”
def 函数():
global x

x = “新的全局变量”

3.匿名函数的语法结构?
变量 = lambda 形式参数1,形式参数2: 函数语句

结果 = 变量(实际参数1,实际参数2)

函数语句: 只能够是一行语句并且必须有运算结果

4.return、break、continue的作用是什么?
return作用:
1.将函数内的结果返回并且终止函数继续执行.
2.return 结果
3.return (结果1,结果2)
4.终止函数的执行
return 没有返回值的函数的返回值是None

break: 跳出循环while,for
continue: 跳过本次循环,继续下次循环while,for

5.哪些是可变类型?哪些是不可变类型? 分别有什么特点?
可变类型:列表,字典 可变类型

不可变类型:字符串,数字,布尔,元组

可变类型:里面的值发生改变时不会新生成一个变量.内存地址不变. 因为改变的数据会发生在内存里面.

不可变类型: 只要值发生了改变.就会重新开辟一个内存空间. 地址值也发生了改变.
6.*args和**args分别在什么情况下使用?有什么作用?
作为形式参数:
def 函数名字(*args): 收集实际参数放在元组中
pass

函数名字(实际参数1,实际参数2)

def 函数名字(**args): 收集关键字实际参数放在字典中
pass

函数名字(关键字1=实际参数1,关键字2=实际参数2)

作为实际参数: 将元组或者字典展开作为实际参数传给形式参数

def 函数名字(形式参数1,形式参数2):
pass

元组 = (数据1,数据2)
函数名字(*元组)

def 函数名字(name,age):
pass

字典 = {name:数据1,age:数据2}
函数名字(**字典)

参数类型说明 - 可以让形参在函数体中 使用的时候有相关代码提示
1> 没有默认值的参数直接在参数名后加":类型名" 类型名有 int str list tuple
2> 有默认值的参数默认值的类型就是说明的类型

def func(a:list,b=‘123’):
“”"
:param a: a : list 就是说明a 是列表类型
:param b: b=‘123’ 就是说明b 是字符串
:return:
“”"
pass

3> li = [{‘a’: 10, ‘b’: 20},
  {'a': 30, 'b': 'adc', 'c': 50}]
补充 : 通过类型注释对变量进行类型说明

c = li[-1][‘b’] # type: str

定义函数的时候再某个参数前面加**,就可以让这个参数同事接受多个实参(只能是关键字参数)

def fun(*args, **kwargs):
“”"
:param args:
:param kwargs: 存在的目的是为了让这个函数在调用的时候足够灵活(既可以使用不定个位置参数,也可以使用不定个关键字参数 可以一起使用)
:return:
“”"
pass

fun(10, 20)
fun(10, 20, 30, 40)
fun(k=1020, w=3040)
fun(10,20,k=1020, w=3040)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值