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) ...
随机推荐
- Ubuntu编写开机启动脚本
1 概述 服务器一般不可能百分之百不会挂,于是一般采用主备或者分布式来达到高可用. 挂掉的机器有很多处理策略,常用的就是重新启动,但是为了保证重启之后服务器能够恢复可用状态,需要配置开机启动脚本. 2 ...
- Python 数字(函数)
Python支持4种不同数值类型: 整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点. 长整型(long integers) - 无限大小的整数,整数最后是一个大写或小写的L. 浮 ...
- parseInt parseFloat Number三者转换的方式
1.parseInt:从左到右检测字符串,若能先检测到数字,则将数字转换成整形,否则返回NaN. 2.parseFloat:从左到右检测字符串,若能先检测到数字,则将数字转换成浮点型,否则返回NaN. ...
- NPOI 实现在已存在的Excel中任意位置开始插入任意数量行,并填充数据
1 npoi版本2.1.3.1 2 需要添加的引用: using NPOI.SS.UserModel;using NPOI.XSSF.UserModel;using System.IO;using N ...
- 第三章、Django之路由层
目录 第三章.Django之路由层 一 路由的作用 二 简单的路由配置 三 分组 四 路由分发 五 反向解析 六 名称空间 七 django2.0版的re_path与path 第三章.Django之路 ...
- 【Day3】1.正则表达式
1.正则表达式 2.案例 关闭贪婪模式
- sed交换任意两行
命令: sed -n 'A{h;n;B!{:a;N;C!ba;x;H;n};x;H;x};p' 文件名 解释: A.B分别是需要交换的行,C是B-1 其中,A.B.C可以是行号,也可以通过匹配模式,如 ...
- 轻量化模型之SqueezeNet
自 2012 年 AlexNet 以来,卷积神经网络在图像分类.目标检测.语义分割等领域获得广泛应用.随着性能要求越来越高,AlexNet 已经无法满足大家的需求,于是乎各路大牛纷纷提出性能更优越的 ...
- JAVA中AES对称加密和解密以及与Python兼容
引言:本文主要解决Java中用AES加密及解密,同时可通过Python脚本对Java加密后的字符进行解密的操作. 由于近期工作中用到需要使用Java对一串密钥进行加密,并且后台通过Python语言读取 ...
- 从0到1写rtos:事件的挂起
任务的状态: 未创建:只定义了任务代码,未调用tTaskInit()初始化 就绪:任务已经创建完毕,且等待机会占用CPU运行 运行:任务正在占用CPU运行代码 延时:任务调用tTaskDelay()延 ...