Python 中的星号原来可以这么用 ~~
一、用做不定长参数名,可以接收多个参数值
- 案例1:比如我定义一个求和的函数,无论传入几个值,都可以计算出求和的结果
- 代码1.1:
def add(num1,num2): return num1 + num2 res = add(10,20) print(res) # 输出结果:30
问题:以上代码实现传入2个参数值的和,但是如何我要求的是大于2个参数值的和,如:10+20+30=或者 1+2+3+4+5+..=这种情况下我们必须要重写add方法,往里面去加参数名,但是这种情况下,扩展性太差,脚本的维护性也不好。因此我们的不定长参数的出现,就可以在不重写add方法的前提下,也能满足求多个参数值的和。
- 代码1.2:
def add(*num): sum = 0 for i in num: sum += i return sum res = add(10,20) print(res) # 输出结果:30 res2 = add(10,20,30) print(res2) # 输出结果:60 res3 = add(1,2,3,4,5) print(res3) # 输出结果:15
总结:*num(不定长参数),可以接收0个或者N个值,接收的值会存储在一个元组中;调用函数的时候,要使用位置传值,也就是直接写值就可以。
二、用做解包,将可迭代对象中的元素解包
- 案例2:比如我定义一个函数,无论传入几个值,都可以计算出从传入值的和与乘积的结果,并获取和与积的结果
- 代码2.1:
def add_mul(*num): sum = 0 mul = 1 for i in num: sum += i for i in num: if i == 0: mul = 0 else: mul *= i return sum,mul res = add_mul(10,20) print(res) # 输出结果:(30,200) -->这个一个元组整体 # 方式一:可以声明2个变量来接收返回的值 res1,res2 = add_mul(10,20) print('和:',res1) # 输出结果: 和: 30 print('积:',res2) # 输出结果: 积: 200 # 方式二:可以在得到的res结果前面加上一个*号,会自动将里面的元素解包出来 res3 = add_mul(10,20) print(*res) # 输出结果:30 200 -->这是元组中的2个元素
总结:除了列表对象可以解包之外,任何可迭代对象都支持解包;可迭代对象包括元组、字典、集合、字符串、生成器实现了__next__方法的一切对象。
但是字典解包后,只会把字典的 key 取出来,value 则丢掉了。
- 代码2.2:
dit = {'id':1001,'name':'lemon'} print(*dit) # 输出结果:id name
解包也可以用在参数值的传递中
- 代码2.3:
def add(*num): sum = 0 for i in num: sum += i return sum tpl = (10,20) lst = [10,20,30] res1 = add(*tpl) # 将元组(10,20)解包位2个值,分别是10,20 print(res1) # 输出结果:30 res2 = add(*lst) # # 将列表[10,20,30]解包位3个值,分别是10,20,30 print(res2) # 输出结果:60
总结:调用add方法时,直接传入一个tpl元组,则*num会把整个元组值作为一个参数值传入,就会变成((10,20),),那么对于add方法中的循环则无法计算结果。所以我们在调用函数时,将*tpl传入,会现将这个元组整体解包为2个元素值传入,用*num接收后就变成了(10,20)。这个时候对于add中的循环就可以去进行计算了。
三、常运用场景
结合DDT用作测试用例的多次执行
- 案例3:执行百度搜索,第一次搜索柠檬班,第二次搜索软件测试
- 代码3.1:
# coding = utf-8 import unittest from selenium import webdriver from ddt import ddt,data import time # 百度搜索的测试数据 test_date = ['柠檬班','软件测试'] @ddt class TestBaidu(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.get('https://www.baidu.com') @data(*test_date) # 接收测试数据,并将列表整体解包为2个值 def test(self,txt): # txt用来接收解包后的每一个值 print('在百度搜索中输入:',txt) self.driver.find_element_by_id('kw').send_keys(txt) # 在搜索框中输入对应的值 self.driver.find_element_by_id('su').click() def tearDown(self): time.sleep(3) self.driver.quit() if __name__ == '__main__': unittest.main()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?