Python 中的星号原来可以这么用 ~~

本贴最后更新于 799 天前,其中的信息可能已经沧海桑田
一、用做不定长参数名,可以接收多个参数值
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方法的前提下,也能满足求多个参数值的和。

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个值,接收的值会存储在一个元组中;调用函数的时候,要使用位置传值,也就是直接写值就可以。

二、用做解包,将可迭代对象中的元素解包
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 则丢掉了。

dit = {'id':1001,'name':'lemon'}
print(*dit)  # 输出结果:id name

解包也可以用在参数值的传递中

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用作测试用例的多次执行

# 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()

图片.png

回帖
请输入回帖内容 ...