【第八课】 函数(上)



前言

hello,大家好。这一章分享函数。主要讲解的内容是函数的参数。


一、函数的定义

1、简介

函数是可重复使用的,用来实现单一功能的代码段。
函数是为了解决代码重复性的问题,就像循环一样。不过函数是灵活地实现某一个功能。
我们可以把函数想象成一个盒子,这个盒子可以实现各种各样的功能。只有使用的时候,盒子的功能才会生效。

2、函数的格式

def test(): # def 是定义函数的关键字,test()是函数名
    print('hello world')  # 此处是函数的代码块


test()

# 输出结果如下
hello world

这里有以下几个需要注的问题

1.使用def关键字定义函数
2.def 与函数名之间有空格
3.函数名后要有括号,括号内可以传入参数,也可以不传入参数。传入的参数叫 形参
4.函数定义完之后要有一对 冒号 :
5.代码块一定要缩进
6.函数调用时才会实现函数的功能,函数调用不需要缩进
7.形参是用来接收实参的(这样可以使函数更灵活)

函数调用:函数名 ( )

二、函数的类型

函数整体可以分为自定义函数和内置函数
在这里插入图片描述

三、函数的参数

1.可变类型参数与不可变类型参数

类型在函数体内是否可变

不可变类型:

def test(a):
    print('a赋值前:{}'.format(a))
    a = 20
    print('a赋值后:{}'.format(a))


a = 10 # 传入的参数为不可变类型
test(a)
print('函数体外的a:{}'.format(a)) 

# 输出结果如下:
a赋值前:10
a赋值后:20
函数体外的a:10 # 函数体外的值未修改

可变类型:

def test(a):
    print('a添加前:{}'.format(a))
    a.append(4)
    print('a添加后:{}'.format(a))


a = [1, 2, 3] # 传入的参数为可变类型
test(a)
print('函数体外的a:{}'.format(a))

# 输出结果如下:
a添加前:[1, 2, 3]
a添加后:[1, 2, 3, 4]
函数体外的a:[1, 2, 3, 4] # 函数体外的值已修改

总结:

1.可变类型传入的参数是可变的,不可变类型传入的参数是不可变的(像整型,元组)
2.可变类型参数在函数体内可以被修改,不可变类型参数在函数体内不可以被修改
3.两个参数内存地址的区别

2.位置参数

实参与形参的个数一致,传入的实参与形参位置一一对应

def test(a, b): # a 和 b是接收的形参
    print('a:{}'.format(a))
    print('b:{}'.format(b))


test(1, 2) # 在此处 1 和 2为实参

# 输出结果如下:
a:1
b:2

在此处,位置参数是通过默认的方式,将实参一一传入形参中。通过位置一一对应传入参数

3.关键字参数

传入实参时,指定形参

def test(a, b):
    print('a:{}'.format(a))
    print('b:{}'.format(b))


test(a=2, b=1) # 指定形参,无视位置顺序

# 输出结果如下:
a:2
b:1

通过与上面的位置参数对比,我们不难发现:

关键字参数是在实参处,通过指定形参,无视位置、无视顺序将参数传入

4.默认值参数

定义函数时,在形参处赋值
如果实参处也赋值,会不会有冲突呢?
实参未赋值:

def test(a=20):
    print('a:{}'.format(a))


test()

# 输出结果:
a:20

实参处赋值:

def test(a=20):
    print('a:{}'.format(a))


test(30)

# 输出结果:
a:30

通过两次对比我们可以总结:

  1. 使用默认值参数时,默认值参数的位置可以不用传入实参
  2. 如果默认值参数传入实参,则传入的参数会覆盖默认值

5.可变类型参数

*args:传入实参,返回元组

**kwargs:传入实参,返回字典。实参以键值对传入

5.1 当作为形参时

打包过程
*args:
将实参打包成元组,直接传入实参

def test(*args): # 可以是*a, *b...(*args只是比较规范)
    print(args)


test(1, 2, 3, 4) # 传入参数

# 输出结果如下:
(1, 2, 3, 4) # 返回元组

**kwargs:
将实参打包成字典,实参以键值对传入

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


test(a=1, b=2, c=3, d=4) # 参数以键值对形式传入
# 输出结果如下:
{'a': 1, 'b': 2, 'c': 3, 'd': 4} # 返回一个字典

5.2 当作为实参时

拆包过程
*args:
将实参(实参是序列格式)解包,并一个个传入

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


test(*(1, 2, 3)) # 将()内的值一一拆开,并传入形参
# 输出结果如下:
1 2 3

**kwargs:
将实参(实参是字典格式)解包,并以关键字传入

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


test(**{'a': 5, 'b': 2, 'c': 3}) # 实参以字典形式传入,在实参处,形参需要引号括起来
# 输出结果如下:
5 2 3

总结

今天主要讲解了函数的各种参数,我们应该分清楚形参与实参的区别。欢迎各位大佬评论交流。如有错误的地方,还希望批评指正。

系列文章目录

【第一课】Python的环境搭建(python,pycharm与pip)

【第二课】Python基础知识准备

【第三课】Python运算符

【第四课】 Python基本数据类型(一)

【第五课 】Python基本数据类型(二)

【第六课】Python基本数据类型(三)

【第七课】Python的判断和循环语句

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值