Python实用黑科技——解包元素(2)
需求:
前面的文章讲的是使用变量的个数需要和迭代器数据变量的元素个数相同的方法,但更多的时候确实不想根据元素个数n来定义相应多的变量,而是希望用较少的变量(
def drop_first_last(grades):
def avg(my_list):
return sum(my_list) / len(my_list)
first, *middle, last = sorted(grades)
return avg(middle)
1
2
3
4
5
当然,“星表达式”可以在任何位置,对应的解包元素存入之后,都会形成一个列表(即使没有对应元素,也是空列表)。这里可以再想像一个例子,你正在查看自己近1整年的工资流水,你想计算一下前11个月的工资平均值和当月的工资进行比较,自然可以这么做:
salary_record = (9000, 9000, 12000, 9000, 7000, 8000, 9000, 9000,
10000, 10000, 8500, 10500)
*trailing_months, current_month = salary_record
trailing_avg = sum(trailing_months) / len(trailing_months)
result = current_month > trailing_avg
1
2
3
4
5
扩展:
上面举的例子也许会让读者觉得多此一举,毕竟无论是元组还是列表,用更多其他方式来获取相应的结果,比如第一个可以直接这么获取:
middle_avg = sum(sorted(grades)[1 : len(grades) - 1]) / (len(grades) - 2)
1
当然还有很多办法,这就看大家觉得用什么方式实现更好的表达自己思想了。此外,“星表达式”对处理一种含有多个长度不等元组组成的列表的数据,有他自己独特的优势:
records = [
('Jason', 'SE', 6),
('Lee', 'Python'),
('Jason', 'Web', 2),
]
def show_jason(x, y):
print('Jason', x, y)
def show_lee(s):
print('Lee', s)
for tag, *args in records:
if tag == 'Jason':
show_jason(*args)
elif tag == 'Lee':
show_lee(*args)
In [67]: runfile('/home/jason/codes/test.py', wdir='/home/jason/codes')
Jason SE 6
Lee Python
Jason Web 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
这里还可以举一个求列表元素和的有趣的递归方法:
def sum(items):
head, *tail = items
return head + sum(tail) if tail else head
sum(range(10))
Out[71]: 45
1
2
3
4
5
6
当然,大家都懂得,递归从来都不是一个解决问题的好办法,所以看看也就行了。
————————————————
版权声明:本文为CSDN博主「哈北儿」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/skysword_li/article/details/77618926
Python实用黑科技——解包元素(2)的更多相关文章
- Python实用黑科技——解包元素(1)
需求: 很多时候手上已经有了一个具有n个元素的列表或者元组,你打算把这些元素单独取出来(解包)放入n个变量组成的集合(这里的集合和Python自己的set不同)中. 方法: 显然,最好的办法就是直接用 ...
- Python实用黑科技——找出最大/最小的n个元素
需求: 快速的获取一个列表中最大/最小的n个元素. 方法: 最简便的方法是使用heapq模组的两个方法nlargest()和nsmallest(),例如: In [1]: import heapqIn ...
- Python实用黑科技——找出序列里面出现次数最多的元素
需求: 如何从一个序列中快速获取出现次数最多的元素. 方法: 利用collections.Counter类可以解决这个问题,特别是他的most_common()方法更是处理此问题的最快途径.比如,现在 ...
- Python实用黑科技——以某个字段进行分组
需求: 当前有个字典实例,你想以某个字段比如”日期”对整个字典里面的元素进行分组. 方法: itertools.groupby()函数是专门用来干这个活的.请看下面这个例子,这里有一个列表构成的字典, ...
- python基础之打/解包及运算符与控制流程
python基础之打/解包及运算符与控制流程 python中的解压缩(即序列类型的打包和解包) python提供了两个设计元祖和其他序列类型的处理的便利,也就是自动打包与自动解包功能,比如: data ...
- Python特色的序列解包、链式赋值、链式比较
一.序列解包 序列解包(或可迭代对象解包):解包就是从序列中取出其中的元素的过程,将一个序列(或任何可迭代对象)解包,并将得到的值存储到一系列变量中. 一般情况下要解包的序列包含的元素个数必须与你在等 ...
- Python中的参数解包:`*`表达式和 `**`表达式
目录 1.参数解包:方法调用中的*表达式和**表达式 2.参数解包:方法定义中的*表达式和**表达式 3.在元组,列表,集合和字典中解包 4.Extended Unpacking:赋值表达式左边的*表 ...
- 第4.7节 Python特色的序列解包、链式赋值、链式比较
一.序列解包 序列解包(或可迭代对象解包):解包就是从序列中取出其中的元素的过程,将一个序列(或任何可迭代对象)解包,并将得到的值存储到一系列变量中. 一般情况下要解包的序列包含的元素个数必须与你在等 ...
- python收集参数与解包
收集任意数量的实参 def make_pizza(*toppings): """打印顾客点的所有配料""" print(toppings) ...
随机推荐
- ReLeQ:一种自动强化学习的神经网络深度量化方法
ReLeQ:一种自动强化学习的神经网络深度量化方法 ReLeQ:一种自动强化学习的神经网络深度量化方法ReLeQ: An Automatic Reinforcement Learning Ap ...
- docker 入门5 - 栈 【翻译】
入门,第 5 部分:堆栈 先决条件 安装 Docker 版本 1.13 或更高版本. 获取第 3 部分先决条件中所述的 Docker Compose. 获取 Docker Machine,如第 4 部 ...
- 使用.Net Core 2.2创建windows服务
使用.Net Core 2.2创建windows服务 我的环境 win 10 home Visual Studio 2019 v16.1.3 安装有.net core 2.2 创建项目 编辑项目文件 ...
- tinymce富文本是在modal框中弹出显示的问题
记录一下,在用tinymce富文本的时候,由于是用在modal 上的,始终无法获取焦点,后来才发现问题出在tinymce在modal前创建了,所以导致这个问题,解决方案就是用 v-if="v ...
- Django数据查询中对字段进行排序
Django数据查询中对字段进行排序 第一种方法:使用order_by进行排序 Articlelist = Article.objects.filter(**kwargs).order_by('n ...
- js Indexof的用法
JavaScript中indexOf()函数 JavaScript中indexOf()函数方法返回一个整数值,指出 String 对象内子字符串的开始位置.如果没有找到子字符串,则返回 -1.如果 ...
- Javascript的学习清单
Javascript的学习清单 Javascript学习资源 程序员必读书籍 深入理解JavaScript系列 es6教程 jQuery中文文档 vue官网 zeptojs中文版 常用的插件与UI组件 ...
- Navicat for MySQL 设置定时任务(事件)
1.查询界面输入命令,查看定时任务是否开启,未开始时OFF: show variables like '%event_scheduler%'; 2. 查询界面输入命令,开启定时任务: set glob ...
- bash shell脚本之查看当前日期以及登陆用户
查看当前日期以及登陆用户: cat test1: #!/bin/bash # This script displays the date and who's logged on echo -n The ...
- Delphi 从一个对象中继承数据和方法