函数的定义与调用
——------------------------------------------------------------------------
- 函数一定要遵循先定义后调用的原则
- 函数在定义阶段只检测语法不执行代码
- 函数体代码只有在调用函数的时候才会执行
- 函数名其实相当于是变量名指向的是内存中函数体代码所在的位
| '''不遵循先定义后调用原则''' |
| func() |
| |
| def func(): |
| print('hello world') |
| '''遵循先定义后调用原则''' |
| |
| def func(): |
| print('hello world') |
| |
| func() |
函数的分类
——------------------------------------------------------------------------
内置函数
| 内置函数 |
| 它的底层使用c++来写的 |
| python解释器提前定义好可以直接调用的函数 |
| eg:len、cunt、open... |
自定义函数
| 自定义函数 |
| 再使用到某些功能内置函数无法实现时,自己编写的函数 |
| 1.无参函数 |
| 2.有参函数 |
| 3.空函数 |
| '''无参函数''' |
| |
| def index(): |
| print('玩个勾吧游戏!') |
| |
| index() |
| |
| '''有参函数''' |
| |
| def index(a): |
| print('玩个勾吧游戏!',a) |
| |
| index(123) |
| |
| '''空函数''' |
| |
| def index(): |
| pass |
| ''' |
| 空函数的作用 |
| 在前期能够通过空函数快速的罗列出程序中大致的功能 |
| 让整体的功能框架更清晰 |
| 后续想要再实现对应的功能只要在空函数里加程序代码即可 |
| 空函数大量的使用在项目前期的功能框架搭建 |
| ''' |
函数的返回值
——------------------------------------------------------------------------
| '''函数的返回值 就是函数被调用后 并不会出错时返回的结果''' |
| eg: |
| st = 'hello girl' |
| res = len(st) |
| print(res) |
| |
| |
| 变量名 = 函数调用 |
| |
| |
| '一般情况下函数的返回值用return 空格 返回的类型' |
| 1.当函数体代码最后没有return关键字时 返回值为空 None |
| def play(): |
| print('玩个勾吧游戏!') |
| game = play() |
| print(game) |
| |
| 2.当函数体代码写了return但是没有跟任何值得时候 返回值也是None |
| def play(): |
| print('玩个勾吧游戏!') |
| return |
| game = play() |
| print(game) |
| |
| 3.当函数体代码写了return并跟了数据 那么return后写了什么就返回什么 |
| return返回的只能是值,当你写值的话返回的就是你写的值 |
| 当你写的是变量名的话返回的则是变量名指向的值 |
| def play(): |
| print('玩个勾吧游戏!') |
| why = '垃圾游戏' |
| return why |
| game = play() |
| print(game) |
| 4.当return后面要跟多个值时 每个值间用逗号隔开 当返回出去时会变成元组的形式 |
| def play(): |
| print('玩个勾吧游戏!') |
| why = '垃圾游戏' |
| return why, '狗都不玩', '要学习啊' |
| game = play() |
| print(game) |
| 5.函数体代码中return后的代码不会被执行,遇到return后会立即结束函数体 |
| 函数体代码中的return相当于循环体代码中的break |
函数的参数
——------------------------------------------------------------------------
函数的参数分为两大类
- 形参
在函数的定义时函数名后的括号内要写的参数
称之为'形式参数' 简称>>>:形参
- 实参
在调用函数时函数名后的括号内要写的参数
称之为'实际参数' 简称>>>:实参
| ''' 形参与实参的关系 |
| 形参类似于是变量名、实参类似于是变量的值 |
| 在调用函数的时候传入实参 会与形参临时绑定 |
| 函数运行结束之后自动解除绑定 |
| ''' |
| def info(a, b): |
| print(a, b) |
| |
| info(1, 2) |
| info('用户名', '密码') |
| """ |
| 1会临时绑定给形参a 2会临时绑定给形参b |
| 函数体代码运行期间 可以通过形参直接使用到实参 |
| 函数体代码运行完毕之后 解除绑定 |
| 形参ab处于没有绑定值得状态 等待下一次函数调用传入实参进行绑定 |
| 然后到'用户名'会临时绑定给形参a '密码'会临时绑定给形参b |
| 接着跟1 2 实参一样执行函数体代码 |
| """ |
| m = 1024 |
| n = 1101 |
| index(m,n) |

位置参数
| 位置形参 |
| 在函数定义阶段括号内从左往右依次填写的变量名 |
| def index(name,pwd): |
| pass |
| 位置实参 |
| 在函数调用阶段括号内从左往右依次传入的真实数据 |
| index('jason',123) |
| |
| 位置参数的特征 |
| 1.位置形参与位置实参在绑定关系的时候就是按照从左往右的顺序依次绑定 |
| 2.位置形参与位置实参的个数要一致 多一个不行少一个也不行 |
| |
| def play(tpey, name): |
| print('玩个勾吧%s游戏!' % tpey) |
| why = '垃圾游戏' |
| return name, why, '狗都不玩', '要学习啊' |
| '''位置实参 传多传少都会报错 要与形参一致''' |
| game = play('rpg', '原神') |
| print(game) |
关键字参数
| 出现在实参中 |
| 指名道姓的给形参传值 不需要遵循位置 |
| ''' |
| 注意要与位置传参时 关键字传参要写在位置参数后面否则报错 |
| 当位置实参已经与某个形参绑定了关键字实参就不可与绑定了的形参绑定 |
| ''' |
| def play(tpey, name): |
| print('玩个勾吧%s游戏!' % tpey) |
| why = '垃圾游戏' |
| return name, why |
| |
| |
| |
| game = play(name='原神', tpey='rpg') |
| game = play(name='王者','联盟') |
| game = play('rpg',tpey='原神') |
| game = play('rpg',name='原神') |
| |
| print(game) |
默认参数
| 出现在形参中 |
| 在函数定义阶段就已经给一些形参赋值了 |
| 后续如果不传值则使用默认的 |
| 后续如果传值则使用传入的 |
| 默认参数的出现也打破了形参与实参之间个数一致的情况 |
| 默认参数必须定义在位置参数的后面 |
| eg: |
| def user_info(name, sex, age='18'): |
| print(""" |
| 用户名:%s |
| 年龄:%s |
| 性别:%s |
| """ % (name, sex, age)) |
| user_info('aili', '女',20) |
| user_info('tom', '男') |
| user_info('malin', '女',) |
| |
可变长参数
| "----可变长形参----" |
| """ |
| *号在形参中 |
| 可以接收多余的位置参数 并组织成元组的形式赋值给*号后面的变量名 |
| """ |
| def index(a, b, *ag): |
| print(a, b, ag) |
| index(999) |
| index(1, 2) |
| index(1, 2, 3, 4, 5, 6, 7) |
| index(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) |
| """ |
| |
| **在形参中 |
| 用于接收多余的关键字参数 并且组织成字典的形式赋值给**后面的变量名 |
| """ |
| def index(a, b, **k): |
| print(a, b, k) |
| index(a=1, b=2) |
| index(a=1, b=2, c=3, name='jason') |
| index(1,2,name='jason',age=18,pwd=123) |
| |
| '''*与**一起用 |
| 无论接收多少参数和任意类型的参数都不会报错 能正常执行函数 |
| ''' |
| def show(*a, **k) |
| print(a, **k) |
| show(1,2,3,name='aimi',age=18) |
| '''一般不知道要写几个参数时就可以先用这种方法''' |
| |
补充
| ''' * 和 **在实参中的使用 ''' |
| def index(*args, **kwargs): |
| print(args, kwargs) |
| """ |
| *号在实参中 |
| 可以将列表或者元组打散成位置参数一一传入 |
| 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') |
| """ |
| |
——------------------------------------------------------------------------

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?