函数参数
函数参数之位置参数
| 位置参数指的是按顺序定义的参数,需要从两个角度去看: |
| 1位置形参 |
| 在定义函数时,按照从左到右的顺序依次定义形参,称为位置形参,凡是按照这种形式定义的形参都必须被传值 |
| def funcl(a,b,c):pass 代码行只有一行可以直接写在冒号后面 |
| 2位置实参 |
| 在调用函数时,按照从左到右的顺序依次定义实参,称为位置实参,凡是按照这种形式定义的实参会按照从左到右的顺序与形参一一对应 |
| funcl(1,2,3) |
| |
| |
| eg: |
| def a(a,b): |
| print(a,b) |
| a(1,2) |
| a(1) |
| a(1,2,3) |
| a(b=1,a=2) |
| a(b=1,2) |
| a(2,b=1) |
| a(1,a=2,b=3) |
| name='jason' |
| pwd=123 |
| a(name,pwd) |
| a(a=name,b=pwd) |
| 口诀: |
| 越短的越简单的越靠前 |
| 越长的越复杂的越靠后 |
| 但是遇到下列的情况除外 |
| 同一个形参在调用的时候不能多次赋值 |
| |
默认参数
| 本质其实就是关键字形参(关键字实参上述内容已经讲了) |
| 别名叫默认参数:提前就已经给了 用户可以不传 也可以传 |
| 定义时应遵循: |
| 默认参数的定义也遵循短的简单的靠前 长的复杂的靠后。 |
| def a(name,age,gender='male'): |
| print(""" |
| --------学员信息---------- |
| 姓名:{name} |
| 年龄:{age} |
| 性别:{gender} |
| ------------------------- |
| """) |
| a('tom',18) |
| a('jerk',28,'female') |
| a('jerry',10,gender="female") |
| |
运行结果

可变长形参
| 一个函数能处理比当初声明时更多的参数。这些参数叫做可变长参数 |
| 基本语法如下: |
| def functionname([formal_args,] *var_args_tuple ): |
| "函数_文档字符串" |
| function_suite |
| return [expression] |
| 加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。 |
| def a(*args): |
| print(args) |
| a() |
| a(1) |
| a(1, 2) |
| def a(**kwargs): |
| print(kwargs) |
| a() |
| a(a=1) |
| a(a=1, b=2) |
| 混合使用: |
| def a(*args, **kwargs): |
| print(args, kwargs) |
| |
| |
| a() |
| a(a=1) |
| a(a=1, b=2, c=3) |
| a(a=1, b=2, c=3, x='jason', y='kevin') |
| |
| def a(n, *args, **kwargs): |
| print(n, args, kwargs) |
| |
| |
| |
| a(1, 2, 3) |
| a(111, a=1, b=2, c=3) |
| a(n=111, a=1, b=2, c=3) |
| a(a=1, b=2, c=3, n=111) |
| a(1, 2, 3, a=1, b=2, c=3) |
| 注意: |
| 由于*和**在函数的形参中使用频率很高 后面跟的变量名推荐使用 |
| *args |
| **kwargs |
| def index(*args,**kwargs):pass |
可变长实参
| def a(a, b, c): |
| print(a, b, c) |
| |
| |
| l1 = [123, 321, 132] |
| |
| a(l1[0], l1[1], l1[2]) |
| |
| a(*l1) |
| l2 = ['aaa', 'bbb', 'ccc'] |
| a(*l2) |
| s1 = 'tom' |
| a(*s1) |
| set1 = {123, 1231, 321} |
| a(*set1) |
| dic1 = {'username': 'jason', 'pwd': 123, 'age': 18} |
| a(*dic1) |
| a(*dic1.values()) |
| *在实参中 |
| 类似于for循环 将所有循环遍历出来的数据按照位置参数一次性传给函数 |
| def user_info(name, password, age): |
| print(name, password, age) |
| |
| |
| d1 = {'name': 'mingming', 'password': 123, 'age': 18} |
| user_info(name=d1['name'], password=d1['password'], age=d1['age']) |
| user_info(*d1.values()) |
| user_info(**d1) |
| user_info(name='mingming', password=123, age=18) |
| **在实参中 |
| 将字典打散成关键字参数的形式传递给函数 |
| def a(*args, **kwargs): |
| print(args, kwargs) |
| a(*[11, 22, 33, 44]) |
| a(*(11, 22, 33, 44)) |
| |
命名关键参数
| 形参必须按照关键字参数传值>>>:命名关键字参数 |
| def a(name, *args, gender='male', **kwargs): |
| print(name, args, gender, kwargs) |
| |
| |
| a('mingming', 1, 2, 3, 4, 5, a=1, b=2) |
| a('leilei', 1, 2, 2, 2, gender='female', a=1, b=2) |
| |
名称空间与作用域
名称空间
| name = 'jason' |
| 1.申请内存空间存储jason |
| 2.给jason绑定一个变量名name |
| 3.后续通过变量名name就可以访问到jason |
| 名称空间即存放名字与对象映射/绑定关系的地方。对于x=3,Python会申请内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间中,del x表示清除该绑定关系。 |
| 在程序执行期间最多会存在三种名称空间 |
1.内置名称空间
| python解释器打开会自动加载内置的名称空间,储存的多是内置关键字名字 |
| eg :open input print with def |
2.全局名称空间
| py文件执行过程中产生的名字都会存放于该名称空间中 |
| import sys |
| x=1 |
| if x == 1: |
| y=2 |
| def foo(x): |
| y=1 |
| def bar(): |
| pass |
| Class Bar: |
| pass |
3局部名称空间
| 函数的调用/结束而临时产生/回收,函数的形参、函数内定义的名字都会被存放于该名称空间中 |
| def foo(x): |
| y=3 |
名称空间存活周期及作用域
| 存活周期 |
| 内置名称空间 |
| python解释器启动则创建 关闭则销毁 |
| 全局名称空间 |
| py文件执行则创建 运行结束则销毁 |
| 局部名称空间 |
| 函数体代码运行创建 函数体代码结束则销毁(类暂且不考虑) |
| 作用域 |
| 内置名称空间 |
| 解释器级别的全局有效 |
| 全局名称空间 |
| py文件级别的全局有效 |
| 局部名称空间 |
| 函数体代码内有效 |
名字的查找顺序
| 1.当我们在局部名称空间中的时候 |
| 局部名称空间 >>> 全局名称空间 >>> 内置名称空间 |
| 2.当我们在全局名称空间中的时候 |
| 全局名称空间 >>> 内置名称空间 |
| ps:其实名字的查找顺序是可以打破的 |
查找顺序案例
| 1在python文件中相互独立的方法的命名空间默认是不能够互相访问的 |
| def a(): |
| name = 'jason' |
| print(age) |
| |
| def b(): |
| age = 18 |
| print(name) |
| 2局部空间嵌套 |
| 先从自己的局部名称空间查找 之后由内而外依次查找 |
| x = '123321' |
| def func1(): |
| x = 1 |
| def func2(): |
| x = 2 |
| def func3(): |
| x = 3 |
| print(x) |
| func3() |
| print(x) |
| func2() |
| print(x) |
| func1() |
| print(x) |

作业
| |
| |
| money = 100 |
| def index(): |
| money = 666 |
| print(money) |
| |
| |
| money = 100 |
| def func1(): |
| money = 666 |
| def func2(): |
| money = 888 |
| func2() |
| print(money) |
| money = 100 |
| def index(): |
| money = 666 |
| print(money) |
| index() |
| money = 100 |
| def func1(): |
| money = 666 |
| def func2(): |
| money = 888 |
| print(money) |
| func2() |
| print(money) |
| func1() |
| print(money) |
| |
| |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!