如果一个可迭代对象的元素个数超过了变量的个数,会出现“解压值太多”的异常,python提供*号表达式(码夫破石的理解)来解决。
1,求一组平均值,就以类似学生成绩为例,要求是去掉第一个和最后一个学生的分数。
1 #!usr/bin/env python3 2 # -*-Coding:utf-8 -*- 3 ''' 4 如果一个可迭代对象的元素个数超过变量个数时,会出现“太多解压值”的异常 5 ''' 6 7 #求一组数据的平均值(类似学生成绩),但是你只知道要去除第一个和最后一个,中间有多少值并不知道 8 def average(grades): 9 #定义函数,用以求平均值 10 first, *middle, last = grades 11 #print(first) #打印第一个值 12 #print(middle) #打印中间值,一定是列表 13 #print(last) #打印最后一个值 14 return sum(middle) / len(middle) #求中间列表的平均值 15 16 scores = [91,90,98,99,100,92,95,99,89] #定义列表,用以存储学生成绩 17 avg_score = average(scores) #调用函数并赋值给变量avg_score 18 print(avg_score) #打印平均值
2,有一组用户记录列表,包含名字,邮箱,地址,还有电话号码,但是电话号码是不确定的
1 #有一组用户记录列表,包含名字,邮箱,地址,还有电话号码,但是电话号码是不确定的 2 record = ['eric','[email protected]','13838384388','15838383838',] #定义列表 3 name, email, *phone_numbers = record #将列表中的各组值赋给name,email,phone_numbers,其中phone_numers不确定有多少。 4 print(name) #打印name 5 print(email) #打印email 6 print(phone_numbers) #打印phone_numbers列表,即使是空的也不会报错。
3,有一组10个月销售数据的序列,突然想看看前9个月的平均值和第十个月的销售额对比:
1 def compare(sales_record): #定义函数 2 *trailing_qtrs, current_qtr = sales_record #将销售的前9个月数据存储在trailing_qtrs里面,第10个月的存储在current_qtr 3 print(trailing_qtrs,len(trailing_qtrs)) #打印看是否符合预期 4 print(current_qtr) #打印看是否符合预期 5 trailing_avg = sum(trailing_qtrs) / len(trailing_qtrs) #求前9个月的平均值 6 return [trailing_avg,current_qtr] #返回一个列表,前9个月的平均值和当前月份的数据 7 8 sales_record = [10,8,8,7,1,9,2,3,4,3] #定义10个月的销售数据 9 n = compare(sales_record) #调用函数compare,并赋值给变量n 10 print(n) #打印n
4,星号表达式在可变长元组的序列的应用:
1 #定义列表。列表元素为元组 2 records = [ 3 ('foo',1,2), 4 ('bar','hello'), 5 ('foo1',3,4,5), 6 ] 7 8 tags = [] #定义空列表 9 args = [] #定义空列表 10 for tag, *arg in records: #通过循环获取列表里各元组的第一个值给tag,通过星号表达式将第一个值后的全部值赋给arg 11 print(tag) #打印是否符合预期 12 print(arg) #打印是否符合预期 13 tags.append(tag) #将预期的值附加到列表tags末尾形成新列表tags 14 args.append(arg) #将预期的值附加到列表args末尾形成新列表args 15 print(tags) #打印看是否符合预期 16 print(args) #打印看是否符合预期 17 18 #定义函数 19 def do_foo(x,y): 20 #查找列表里的第一组元组,并打印出来 21 print("The function do foo tag is: " + records[0][0], "x is: {}, y is: {}. ".format(x,y)) 22 23 #定义函数 24 def do_bar(s): 25 #查找元组里的第二组元素,并打印出来 26 print("The function do bar tag is: " + records[1][0], "s is: {}. ".format(s)) 27 28 #定义函数 29 def do_foo1(p,*q): #因为解压出来的arg是三个,所以这里用星号表达式取得arg里的后两个值 30 #查找元组里的第三组元素,并打印出来 31 print("The function do foo1 tag is: " + records[2][0], "p is: {}, q is: {}. ".format(p,q)) 32 print(type(q)) #得到的类型是元组类型 33 #循环读取records里的第一个元素和第一个元素后的所有元素 34 for tag, *args in records: 35 if tag == 'foo': 36 do_foo(*args) #将arg里的元素分别赋值给x,y 37 elif tag == 'bar': 38 do_bar(*args) #将arg里的元素分别赋值给s 39 elif tag == 'foo1': 40 do_foo1(*args) #将arg里的元素分别赋值给p,q 41 """ 42 一个问题,就是do_foo1的参数*q,在前面验证过,通过星号表达式得到的元素组成的都是列表,但是这里的q是元组,而不是列表 43 """
历史遗留问题:就是上面代码do_foo1的参数*q,在前面验证过,通过星号表达式得到的元素组成的都是列表,哪怕0个,但是这里的q得到是元组,而不是列表,请高手解答, 不胜感激。
5,星号表示法分割字符串:
1 #星号表示法分割字符串 2 strings = 'Nobody:*:-2:02:213:Unprivilleged User:/var/empty:/usr/bin/ptyon3' 3 4 uname, *field, homedir, shelldir = strings.split(":") #解压赋值,用:断句; 5 print(uname) 6 print(field) 7 print(homedir) 8 print(shelldir)
6,解压一些元素,然后丢弃,不能简单的使用*,可以使用一个普通的废弃名称如_或者ign.
1 #解压一些元素,然后丢弃,不能简单的使用*,可以使用一个普通的废弃名称如_或者ign. 2 3 records = ['Eric',50,132.45,(12,18,2020)] #定义列表 4 name, *_, (*_, year) = records #解压并赋值 5 print(name) #打印 6 print(*_) #打印 7 print(*_) #打印 8 print(year) #打印