py12.函数的参数

形参与实参

形参:即在定义函数时,括号内声明的参数。形参本质就是一个变量名,用来接收外部传来的值。
实参:即在调用函数时,括号内传入的值,值可以是常量、变量、表达式或三者的组合。

def func(x,y)  #x,y是形参
	pass
func(10,11)  #10,11是实参

注意:在调用函数时,实参值(变量的值)会赋值给形参(变量名),两者的绑定关系只在函数调用时才会生效,在调用函数结束后就立刻解除绑定

参数的形式
1、位置参数:通过位置从左到右的顺序依次定义的参数
def foo(a,b)
	print(a,b)
foo(1,2)

注意:
1、位置形参的特性是在调用函数时必须为其传值,而且多一个少一个都不行
2、位置实参与形参一一对应
2、关键字参数:在调用函数时,按照key=value的形式定义的实参,称为关键字参数
def foo(x,y,z):
	print(x,y,z)1
foo(x=1,y=2,z=3)
注意:
1、相当于指名道姓地为形参传值,意味着即便是不按照顺序定义,仍然能为指定参数传值
2、在调用函数时,位置实参与关键字实参可以混合使用,但关键字实参必须要放在位置实参后,不能为同一个形参重复传值
3、默认参数:在定义阶段,已经为某个形参赋值,那么该参数称为默认参数
注意:
1、定义阶段已经有值,意味着调用阶段可以不传值,但如果在实参的时候传入新参数,就会使用新参数
def register(name,age,sex='male'):
	print(name,age,sex)
register('egon',18,'male')
register('alex',73,'female')
register('wxx',84,'male')

2、默认参数的值只在定义阶段赋值一次,也就是说默认参数的值在定义阶段就固定死了
m = 10
def foo(x,y=m)
	print(x,y)
m=111111
foo(1)
>>>1,10
>

3、默认参数在传值的时候,不要将可变类型当作参数传值
def register(name,hobby,l=[]):
    l.append(hobby)
    print(name,l)
register('egon','play')
register('alex','AK')
register('wxx','gun')


def register(name,hobby,l=[]):
    l.append(hobby)
    print(name,l)
register('egon','play',[])	#egon ['play']
register('alex','AK',[])	#alex ['AK']
register('wxx','gun',[])	#wxx ['gun']


def register(name,hobby,l=None):
    if l == None:
        l=[]
        l.append(hobby)
        print(name,l)
register('egon','play')  #egon ['play']
register('alex','AK')	#alex ['AK']
register('wxx','gun')	#wxx ['gun']

应用:对于经常需要变化的值,需要将对应的形参定义为位置形参,对于大多数值都一样的情况,需要将对于的形参定义成默认形参。

4、可变长参数

可变长指的是参数的个数可以不固定。实参有按位置定义的实参 和 按关键字定义的实参,所以可变长的实参指的就是按照这两种形式定义的实参个数可以不固定,然而实参终究是要给形参传值的,所以形参必须要有两种对应的解决方案来分别处理以上两种形式可变长度的实参

foo(1,2)
foo(1,2,3)
foo(1,2,3,4)

foo(x=1,y=2)
foo(x=1,y=2,z=3)

形参包含*/**

*会将溢出的位置实参全部接受,然后保存成元组的形式赋值给args


def foo(x,y,z,*args):
	print(x,y,z)
	print(args)
foo(1,2,3,4,5,6)
>>>123
>>>(4,5,6)
**会将溢出的关键字实参全部接受,然后保存成字典的形式赋值**后面的变量中
def foo(x,y,z,**kwargs):
	print(x,y,z)
	print(kwargs)
foo(x=1,y=2,z=3,d=4,f=5,e=6)
>>>1 2 3
>>>{'d': 4, 'f': 5, 'e': 6}

实参里包含*/**

*:一旦碰到实参加*,打散你传入的容器类型

def foo(x,y,z,*args):
	print(x,y,z)
	print(args)
foo(1,2,3,*[4,5,6])     #--->foo(1,2,3,4,5,6)
>>>1 2 3
>>>(4, 5, 6)
**:一旦碰到实参加**,就把字典打散成关键字参数传入形参

#定义函数
def test(*args, **kwargs):
    print(args)
    print(kwargs)
#定义一个元组和一个字典
tuple = (1,2,3,4,5)
dict = {'a':1,'b':2,'c':3}
#tuple和dict两个参数会作为一个元组传递给*args参数,而没有实参传递给**kwargs参数。
test(tuple,dict)
>>>((1, 2, 3, 4, 5), {'a': 1, 'b': 2, 'c': 3})
>>>{}
#打散传参
test(*tuple, **dict)  #test(1,2,3,4,5,a=1,b=2,c=3)
>>>(1, 2, 3, 4, 5)
>>>{'a': 1, 'b': 2, 'c': 3}

组合使用:如果一个函数的形参为*args与**kwargs,那么代表该函数可以接收任何形式、任意长度的参数

def wrapper(*args,**kwargs):
	print(args)
	print(kwargs)
wrapper(1,2,3,4,5,6,x=6666,y=2222)
>>>(1, 2, 3, 4, 5, 6)
>>>{'x': 6666, 'y': 2222}
5、命名关键字参数(了解)

格式:在后面的参数都是命名关键字参数
特征:后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递

def index(x, y, z, a=1, *args, b, **kwargs):
    print(x, y, z)
    print(a)
    print(args)
    print(b)
    print(kwargs)

index(1, 2, 3,354353, 4342, 3213123, b=222, c=333, d=444)
输出结果:
1 2 3
354353
(4342, 3213123)
222
{'c': 333, 'd': 444}

<think>根据用户的问题“我想查找Python不同.py文件参数传入的方法”,结合提供的引用内容,我将整理几种Python中不同.py文件之间传递参数的方法。引用中提到了多种场景,包括命令行参数传递、动态导入模块传参、配置文件传参等。下面将分类说明: 1. **命令行参数传递(引用[1]和引用[3])**: - 使用`sys.argv`:这是最基础的方式,通过命令行运行脚本时传入参数,在目标脚本中使用`sys.argv`列表获取参数。注意`sys.argv[0]`是脚本名,真正的参数从`sys.argv[1]`开始。 - 示例(引用[3]): ```python import sys if __name__ == "__main__": if len(sys.argv) > 1: for arg in sys.argv[1:]: print(f'参数: {arg}') else: print('没有参数') ``` - 调用方式:`python script.py arg1 arg2` 2. **动态导入模块并调用函数传参(引用[2])**: - 使用`importlib.import_module`动态导入其他模块,然后通过函数调用传递参数。 - 示例(引用[2]): ```python import importlib # 动态导入模块 module = importlib.import_module('module_name') # 调用模块中的函数并传递参数 getattr(module, 'function_name')(arg1, arg2) ``` 3. **使用配置文件传递参数(引用[4])**: - 将参数保存在一个配置文件中(如.py文件),然后在其他脚本中导入该配置文件获取参数。 - 示例(引用[4]中提到的思路): - 创建`config.py`: ```python START_DATE = '2023-01-01' END_DATE = '2023-01-31' ``` - 在另一个脚本中使用: ```python import config print(config.START_DATE, config.END_DATE) ``` 4. **通过外部文件(如SQL文件)读取参数(引用[4])**: - 在SQL文件中使用占位符,然后在Python中读取配置文件参数,替换SQL中的占位符。 - 示例(引用[4]中的场景): ```python # 从config.py读取参数 from config import START_DATE, END_DATE # 读取SQL文件 with open('query.sql') as f: sql = f.read() # 替换占位符 sql = sql.replace('${START_DATE}', START_DATE).replace('${END_DATE}', END_DATE) # 然后执行SQL ``` 5. **使用子进程执行并传参(引用[1]和引用[5])**: - 使用`os.system`或`subprocess`模块调用另一个Python脚本,并通过命令行传递参数。 - 示例(引用[1]): ```python import os os.system('python another_script.py arg1 arg2') ``` - 或者使用`subprocess`(更灵活): ```python import subprocess subprocess.run(['python', 'another_script.py', 'arg1', 'arg2']) ``` **总结**: - 命令行参数(`sys.argv`)适用于简单参数传递。 - 动态导入适用于需要调用其他模块函数并传递参数的场景。 - 配置文件适用于需要集中管理参数的场景。 - 子进程调用适用于将另一个脚本作为独立进程运行并传参。 §§相关问题§§ 1. 如何安全地传递敏感参数(如密码)? 2. 在大型项目中如何管理多个配置文件? 3. 除了上述方法,还有哪些高级的参数传递方式(如环境变量)? </think> ### Python不同.py文件参数传入方法详解 以下是Python中不同.py文件之间传递参数的常用方法,结合您的引用内容进行归纳: --- #### 1. **命令行参数传递(最常用)** 通过`sys.argv`接收命令行参数,适用于脚本间的独立调用: ```python # file1.py import sys print("接收到的参数:", sys.argv[1:]) # 索引0是文件名,1开始是参数 # 调用方式 # python file1.py arg1 arg2 ``` - **特点**:跨文件通用性强,适合一次性参数传递[^3]。 - **引用示例**:YOLOv5推理脚本通过`--weight`等参数传递模型路径[^1]。 --- #### 2. **动态导入模块传参** 通过`importlib`动态导入其他脚本并调用其函数: ```python # main.py import importlib # 动态导入目标模块 module = importlib.import_module("target_module") # 调用目标函数并传参 module.target_function(param1, param2) ``` - **适用场景**:需要调用其他脚本的特定函数时[^2]。 - **注意**:需确保目标模块在Python路径中[^2]。 --- #### 3. **配置文件共享参数** 创建共享的配置文件(如`config.py`): ```python # config.py PARAM1 = "value1" PARAM2 = 100 # file_a.py import config print(config.PARAM1) # 输出 value1 # file_b.py import config config.PARAM2 = 200 # 修改全局参数 ``` - **优势**:多脚本共享同一套参数,修改集中[^4]。 - **典型应用**:数据库查询中的日期范围参数同步[^4]。 --- #### 4. **子进程执行传参** 使用`os.system`或`subprocess`调用其他脚本: ```python # caller.py import os # 带参数调用其他脚本 os.system('python target_script.py arg1 arg2') # 使用subprocess(更灵活) import subprocess subprocess.run(['python', 'target_script.py', 'arg1', 'arg2']) ``` - **适用场景**:将目标脚本作为独立进程运行[^1][^5]。 - **引用示例**:YOLOv5通过命令行调用`detect.py`并传递模型路径。 --- #### 5. **参数化SQL文件** 将Python变量注入SQL脚本: ```python # query_runner.py from config import START_DATE, END_DATE # 从配置文件导入 with open('query.sql') as f: sql = f.read().replace('${START_DATE}', START_DATE) # 替换占位符 # 执行修改后的SQL ``` - **关键点**:在SQL中使用`${变量}`作为占位符[^4]。 --- ### 方法对比 | **方法** | 适用场景 | 优点 | 缺点 | |-------------------|----------------------------------|--------------------------|--------------------| | 命令行参数 | 脚本独立运行 | 简单通用,调试方便 | 不适合复杂数据结构 | | 动态导入模块 | 需要调用特定函数 | 可直接操作函数和变量 | 模块需在路径中 | | 配置文件 | 多脚本共享参数 | 集中管理,修改方便 | 非实时同步 | | 子进程执行 | 隔离运行环境 | 避免命名冲突,进程独立 | 启动开销较大 | | SQL参数化 | 数据库操作 | 分离代码与SQL,易于维护 | 仅适用于SQL场景 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琴声浮或沉__听懂只一人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值