今日学习内容: 内容简要:
函数的定义与调用函数的分类函数的返回值函数的参数(内容较多)
内容详细: 函数的定义与调用
1.函数一定要遵循先定义后调用的原则
2.函数在定义阶段只检测语法不执行代码
3.函数体代码只有在调用函数的时候才会执行
4.函数名其实相当于是变量名指向的是内存中函数体代码所在的位置
对于函数的定义和调用更加详细的运用技巧请参考我上一篇博客
函数的分类
对于python的函数类型的分类,在函数定义方式上来看会被分成两大类:内置函数,自定义函数。
| 名称 | 解释 |
|---|---|
| 内置函数 | python解释器提前定义好可以直接调用的函数 |
| 自定义函数 | 程序员自己编写的函数 |
在自定义函数上又有了一些分类:
| 名称 | 解释 |
|---|---|
| 无参函数 | 在函数定义阶段括号内没有参数 |
| 有参函数 | 在函数定义阶段括号内有参数 |
| 空函数 | 在定义阶段函数体代码是用pass或者…占位 |
举例:
1.内置函数:
类似:print(), input(),len(),open().... 这些可以直接调用的方法都是属于内置函数
2.自定义函数:
在编写脚本的过程中,对于要重复完成的工作,我们可以提取出来,将其编写为函数,在脚本中使用时,调用即可,在python中,函数必须先声明,然后才能在脚本中使用。使用函数时,只要按照函数定义形式向函数传递必须的参数,就可以调用函数完成所需的功能。
2.1:无参函数
举例:
def index():
print('hi,python!')
# 调用无参函数:括号内也不需要写参数
index()
运行结果:
2.2:有参函数
举例:
def index(a):
print('hi,python!',a)
# 调用有参函数:在函数调用阶段括号内也必须传参数>>>:类似于变量值
index()
运行结果:
2.3:空函数
举例:
def index():
pass
运行结果:
空函数感觉一点用都没有啊 但是非常有用
前期能够通过空函数快速的罗列出程序中大致的功能
让程序整体框架清晰 空函数大量的使用在项目前期的功能框架搭建eg:编写一套钢铁侠程序
功能也可以看成是函数 函数也可以看成是功能
函数的返回值
1.什么是函数返回值 ?
函数的返回值其实就是在调用函数之后返回的结果
2.如何获取函数的返回值 ?:
''' 变量名 = 函数调用 '''
3.如何操作返回值 ?
| 类别 | 详情 |
|---|---|
| 方式一 | 当函数体代码没有return关键字的时候 返回值是None |
| 方式二 | 当函数体代码写了return但是没有跟任何值得时候 返回值也是None |
| 方式三 | 当函数体代码写了return并且跟了数据 那么写什么就返回什么 |
| 方式四 | return后面还可以跟多个值 逗号隔开 会自动组织成元组返回出去后 |
举例:
# 方式一:
def index():
print('方式一')
res = index()
print(res) # None
# 方式二:
def index():
print('方式二')
return
res = index()
print(res) # None
# 方式三:
def index():
print('方式三')
name = 'jason'
return name
res = index()
print(res) # jason
# 方式四:
def index():
print('方式四')
return 111, 'jason', 222
res = index()
print(res) # (111,'jason',222)
函数体代码里面写return相当于循环体代码里面写break,遇到了就立刻结束函数和循环的执行
函数的参数(重要)
1.函数的参数分类:
| 名称 | 解释 |
|---|---|
| 形参 | 函数在定义阶段括号内写的参数 ,我们称之为’形式参数’ |
| 实参 | 函数在调用阶段括号内写的参数,我们称之为’实际参数’ |
2.形参与实参的关系
形参类似于是变量名、实参类似于是变量的值,在调用函数的时候传入实参 会与形参临时绑定,函数运行结束之后自动解除绑定
举例
def index(a,b): # a和b就是index函数的形参 print(a,b) index(1,2) # 1和2就是index函数的实参
1会临时绑定给形参a 2会临时绑定给形参b 函数体代码运行期间 可以通过形参直接使用到实参 函数体代码运行完毕之后 解除绑定 形参ab处于没有绑定值得状态 等待下一次函数调用传入实参进行绑定
3.参数分类
3.1.位置参数
| 名称 | 详情 |
|---|---|
| 位置形参 | 函数定义阶段括号内从左往右依次填写的变量名 |
| 位置实参 | 在函数调用阶段括号内从左往右依次传入的真实数据 |
位置参数的特征:
1.位置形参与位置实参在绑定关系的时候就是按照从左往右的顺序依次绑定
2.位置形参与位置实参的个数要一致 多一个不行少一个也不行
例子
def index(a, b):
print('a=%s' % a, 'b=%s' % b)
index(2, 1) # a=2 b=1
# index() # 报错
# index(111) # 报错
# index(111,222,333) # 报错
3.2.关键字参数
出现在实参中指名道姓的给形参传值 不需要遵循位置
例子
def index(a, b): print(a, b) index(b=111, a=222) # 指名道姓的说形参a接收数据222 b接收数据111 index(b=333,222) # 报错 关键字参数必须放在位置参数的后面 index(222,a=111) # 报错 形参只能指向一个实参 index(222,b=111) # 可以 相当于位置参数
实参"222"会按照位置绑定给形参a 然后又通过关键字参数给形参a重复绑值 这种情况是不被允许的!!!
3.3.默认参数
出现在形参中
在函数定义阶段就已经给一些形参赋值了
后续如果不传值则使用默认的
后续如果传值则使用传入的
默认参数的出现也打破了形参与实参之间个数一致的情况
默认参数必须定义在位置参数的后面
例子
def register(name, age, gender='猛男'):
"""
函数的形参在命名的时候也应该见名知意
"""
print("""
学员姓名:%s
学员年龄:%s
学员性别:%s
""" % (name, age, gender))
register('jason', 18) # 不传就使用默认的
register('jerry',22,'美女') # 传了就使用自己的
运行结果
3.4.可变长参数(重要)
需求:定义一个函数 无论传多少位置实参都可以正常执行
方法:
’ * '号在形参中
可以接收多余的位置参数 并组织成元组的形式赋值给*号后面的变量名
举例
def func(*a): print(a) func() # () func(1,2) # (1, 2) func(1,2,3,4,5,6) # (1, 2, 3, 4, 5, 6)
’ ** ‘号在形参中
用于接收多余的关键字参数 并且组织成字典的形式赋值给’ ** '后面的变量名
举例
def func(**k):
print(k)
func() # {}
func(a=1,b=2) # {'a': 1, 'b': 2}
func(a=1,b=2,c=3,d=4) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
思考题:如何定义一个无论接收多少个任意类型的参数都可以正常执行的函数
’ * ‘和’ ** '在形参中的使用 后面的变量名并不是关键 但是针对这两个特殊符号后面的变量名
def func(*a,**k):
print(a,k)
func() # () {}
func(1,2,3,4,name='jason',age=18) # (1, 2, 3, 4) {'name': 'jason', 'age': 18}
补充说明(重要)
*和**不单单可以在形参中使用 还可以在实参中使用
"""
*号在实参中
可以将列表或者元组打散成位置参数一一传入
def index(*[11,22,33]) 等价于 index(11,22,33)
def index(*(11,22,33)) 等价于 index(11,22,33)
如果真的理解不了 可以看成是*号会将列表和元组的括号去除 暴露出里面一个 个元素
"""
"""
**号在实参中
可以将字典打散成关键字参数一一传入
def index(**{'name':'jason'}) 等价于 index(name='jason')
"""
今日学习时间:
这里统计计划学习的时间
1、 上午8:30~12:30
2、 下午2:30~5:30
3、 晚上6:30~9:30
今日学习产出:
这里统计学习计划的总量



