收获
- 掌握python 函数结构
- 掌握python 面向过程的编程思想
任务1:函数的灵魂三问
1、 什么是函数?
数学里有函数、我们经常使用的Excel表格处理软件里有求和函数、求最大值、求平均值等函数。每一门软件开发语言也都有函数的概念,大多数开发都喜欢把“函数”叫做“方法”。另外,函数的英语叫做function,这个单词的中文翻译是功能,所以,我们可以把函数理解成“某个具体的功能”,函数里所编写的代码就是满足具体功能的固定代码块。
在软件开发中,函数的使用分两个步骤:
函数的定义(设计函数,然后写出代码)
函数的调用(使用函数)
2、 为什么要使用函数?
实现功能复用(反复使用、重复使用)
提升代码维护性(写的函数功能需求变化了,它被调用了一百万次,我也只需要改一次!)
函数也是单元测试的最小单位
3、 如何使用函数?
def 函数名(形式参数):
(Tab缩进) 函数具体功能的固定代码块
(Tab缩进) return 函数结果
注意点:
Python中定义函数的关键字不是function,是def(单词define,定义的意思)。
函数名自己随意取名,但是必须满足命名规则:
函数名称全小写,其他情况和变量命名差不多
单词间的空格以“下划线”替代
不可以使用Python内置名字(函数、变量等)
设计函数时,可以是“有参函数”,也可以是“无参函数”。
return返回值必须写在函数体固定代码块的最后一行,但可以不写,写不写由你决定,按照实际情况设计,如果不写return,默认return None。
函数的定义代码必须要在函数的调用代码的上方,不然调用不到!!!
我们习惯在一个模块(.py文件)里,把所有设计的函数统一放在最上方管理。
任务2:Python函数核心语法
1、 无参函数
# 无参函数
# 定义函数(设计函数,我的函数我做主)
def draw_a_line():
print('-'*36)
# 我们讨论对于这个函数,要不要设计下面的返回值?
return '一条横线画完了。'
# 调用函数draw_a_line()
draw_a_line()
# 如果需要拿函数的返回值,可以使用一个变量去接收;
# 行业内喜欢使用ret作为变量命名去接收函数返回值,因为ret = return
# 【思考】上面我们已经调用过一次draw_a_line()了,
# 这次,我想要接收函数返回值,下面这样写对吗?
ret = draw_a_line() # 不用时,请注释掉本行,并把ret写到上面的第一次调用
print('draw_a_line()函数的返回结果是:{0}'.format(ret))
参考结果:
2、有参函数(位置参数)
位置参数概念:
固定住参数的位置,即:定义时是什么位置,调用时也要是什么位置,不可多,不可少。
可以只设计一个位置参数,也可以设计多个位置参数,多个参数之间“西文逗号”隔开。
# 有参函数(位置参数)
# 需求:写一个程序,给出两个数字,可以自动计算出两数相加之和。
# 上函数课之前,我们这样实现:
x = 10
y = 20
z = x + y
print('两数相加之和:{}'.format(z))
# 上函数课之后,我们这样实现:
# 定义函数add(),名字可以任取,你可以不叫add(),叫jia_fa()也行
# 这里设计了2个位置参数(形式参数,形参):a, b
# 形参如果用英语解释,就是:Someone occupy the toilet, but not shitting.
def add(a, b):
return a + b
# 调用函数add()
# 调用时位置参数要和设计时一致,前后顺序和个数都要一致!
# 调用函数很随意,你想要调用多少次就多少次。# 第一次调用:直接给出“对应的”常量作为参数(实际参数,实参)。
# 实参就是实际使用时的具体的值。
add(1, 2)
# 如上,虽然函数调用成功了,Python也计算了,但是用户看不到任何输出,正确的解开方式如下:# 第二次调用:先定义变量,再把变量传入函数add()作为实参。
# 使用ret变量接收函数被执行后(调用后)的返回值
aa = 1
bb = 2
ret = add(aa, bb)
# 打印出返回值结果
print('(1) 两数相加之和:{}'.format(ret))# 第三次调用:更像软件了,让用户随意输入
aaa = int(input('请输入第一个数字:'))
bbb = int(input('请输入第二个数字:'))
# 知识补充:res也可以作为返回值的变量命名,res = result = 结果
res = add(aaa, bbb)
# 打印出返回值结果
print('(2) 两数相加之和:{}'.format(res))输出打印结果:
任务3:函数的四种形态
1、无参数无返回
2、无参数有返回(前任务已覆盖)
3、有参数无返回
4、有参数有返回(前任务案例覆盖)
#1、无参数无返回
def draw_a_line():
print('-'*36)
# 知识补充:下面可以直接写一个return,
# 等同于return None,也可以不写return,都是“无返回”的表现
return
#2、有参数无返回
def add(a, b):
c = a + b
print('两数相加之和:{}'.format(c))
# print('两数相加之和:{}'.format(a + b)) # 直接运算也可以
# 调用函数add()
add(6, 6)
任务4:Python函数的另外三种参数
1、默认(值)参数
默认参数概念:
默认参数的“设定位置”必须在“所有”位置参数之后,可变参数或关键字参数之前。
2、在参数设计时,对形参给出一个值的就是默认参数。
3、可以只设计一个默认参数,也可以设计多个默认参数,多个参数之间“西文逗号”隔开。
4、在函数调用时,不用去对应默认参数的位置和个数,即:可以不给默认参数的实参。
5、如果需要改变默认值,则需要给出实参。
# 默认参数
# 知识补充:
# 我们一般在函数体内的最上方写一段注释,解释这个函数有哪些功能或者哪些返回值,
# PyCharm提供了一个快捷方式用法,在函数体内的第一行输入一对连续的三个双引号,
# 然后来到这对引号的正中间,按下回车键,PyCharm会为你自动生成格式,如下:
def i_am_a_singer(name, gender, age, interest='唱歌'):
"""
我是一名歌手
:return: None
"""
print('大家好,我是{1}歌手{0},我今年{2}岁,我的兴趣是{3}。'.format(name, gender, age, interest))
# 第一次调用函数i_am_a_singer(),不给默认实参
i_am_a_singer('骆志翔', '男', '40多')# 第二次调用函数i_am_a_singer(),给默认实参(第1种形式)
i_am_a_singer('骆志翔', '男', '40多', '唱歌')# 第三次调用函数i_am_a_singer(),给默认实参(第2种形式)
i_am_a_singer('骆志翔', '男', '才18', interest='时间管理')
2、可变参数概念:
定义函数时,如果需要声明可变参数,需要参数名前加*号。
可变参数只可以声明一个,即:*可变参数名称,经典变量名:*argu
函数体内使用可变参数,把*号去掉。
调用函数时,可以传入无限个值作为可变参数,多个值之间以“西文逗号”隔开。
函数体内,可变参数无论接收多少值,都以元组形式展现,即:永远只有一个元组数据。
定义函数时,即使设计了可变参数(形参),调用时是可以不使用的。
def the_master_of_time_mgmt(name, interest='时间管理', girl_friend='周羊清', *girl_friends):
"""
时间管理大师
:return: xiao_zhu
"""
print('大家好,我是歌手{0},我的兴趣是{1},我的女朋友是{2}。'.format(name, interest, girl_friend))
print('可变参数的类型:', type(girl_friends)) # 可变参数以元组的形式展现
# 如果没有给可变参数,则不会进入这个循环,里面的“小秘密”是不会打印的
# 函数体内使用可变参数形参,不需要打*(如下:girl_friends没有*号)
# 星号只是申明形参时证明它是可变参数的印记
for gf in girl_friends:
print('告诉你一个秘密,我还有女朋友:{}'.format(gf))
xiao_zhu = '我为时间代言!'
return xiao_zhu
# 第一次调用函数the_master_of_time_mgmt(),但没有给出可变参数
ret = the_master_of_time_mgmt('骆志翔', '时间管理', '周羊清')
print(ret)# 第二次调用函数the_master_of_time_mgmt(),给出可变参数
ret = the_master_of_time_mgmt('骆志翔', '时间管理', '周羊清', '某女A', '某女B')
print(ret)
参考结果:
3.关键字参数(key-value形态)
1、 定义函数时,如果需要声明关键字参数,需要参数名前加**(两个星号)。
2、 关键字参数只可以声明一个,即:**关键字参数名称,经典变量名:**kw
3、 函数体内使用关键字参数,把**(两个星号)去掉。
4、 关键字参数其实就是字典(键值对形式),即:{“键1”: “值1”, “键2”: “值2”, ...}
5、 调用函数时,可以传入无限个“键值对”作为关键字参数,多个“键值对”之间以“西文逗号”隔开;“键值对”写入实参的格式是:键1=’值1’, 键n=’值n’
6、函数体内,关键字参数无论接收多少“键值对”,都以字典形式展现,即:永远只有一个字典数据。
7、 定义函数时,即使设计了关键字参数(形参),调用时是可以不使用的。
# 虽然是讲关键字参数知识点,但是这个函数的参数类型已经大满贯了
# 也请注意参数类型的先后顺序(如果全部出现,必须是这个顺序)
def person(name, age, gender='女', *argu, **kw):
print('可变参数接收到的值:{}'.format(argu))
print('姓名:{},年龄:{},性别:{},密码{},其他信息:{}'.format(name, age, gender,argu, kw))# 请注意,给实参时,只要不是默认参数和可变参数共存,默认参数依然可以使用“默认参数名=值”的形式
person('黄自陶', 28, '男', 99,11,12,city='山东', interest='make up 化妆')
输出:
任务5: 函数、模块和包的关系
1、函数:功能的集合。
2、模块:函数的集合,在Python语言里,一个py文件就是一个模块。
3、包:Python包是模块的集合,“属于包下的模块”里的函数是可以被别的模块调用的。包文件夹下面都是.py文件(即:模块),包文件夹下面是不可能直接写函数、写代码的。