《python编程从入门到实践》16.2.6节函数的理解

《python编程从入门到实践》个人认为是本非常适合入门的书籍,本人是非相关专业的学生,通过这本书一路自学,几乎没有遇到障碍,但在16.2.6节的这个函数遇到了一点困难,并且书上解释甚少,经过网上的查找以及自己愚笨脑袋的思考,我把我个人的理解记录下来

以下是本节代码

from itertools import groupby

def draw_line(x_date,y_date,title,y_legend):
    xy_map = []
    #zip()将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
    for x,y in groupby(sorted(zip(x_date,y_date)),key=lambda _:_[0]):
        y_list = [v for _,v in y]
        xy_map.append([x,sum(y_list)/len(y_list)])
    x_unique,y_mean = [*zip(*xy_map)]
    line_chart = pygal.Line()
    line_chart.title = title
    line_chart.x_labels = x_unique
    line_chart.add(y_legend,y_mean)
    line_chart.render_to_file(title+'.svg')
    return line_chart

pygal的一些应用就不加赘述了,本书的前面部分已经讲得很好了,主要的难点是for循环那一块内容
首先,把书上未介绍的函数说明一下:
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。

a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)     # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c)              # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped)          # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]

zip()介绍来自菜鸟教程

lambda具体介绍看https://blog.csdn.net/zjuxsl/article/details/79437563

students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>> sorted(students, key=lambda s: s[2])            # 按年龄排序
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
 

如例子,例子中[2]代表元组第三个元素,可见这个函数中的sorted就是按[0]即x_date的值进行排序

zip()将两个列表压缩成元组的列表后,sorted将这个列表排序,再用groupby将其分组,于是乎,这个for循环就是遍历{a1:[ ],a2:[ ],·····an:[] }这样的字典,x就是a1,a2,····,y就是[ ]列表(或许不准确,但是上方zip方法中有说明),这样下去就容易理解了,y_list就是一个列表,xy_map就是由x,和y_list的平均值的两个元素的列表组成的列表的列表,形式如[ [a1,b1],[a2,b2],······,[an,bn] ]

还有一个难点

x_unique,y_mean = [*zip(*xy_map)]

这篇博客中有关于号的解释https://www.cnblogs.com/jony7/p/8035376.html
虽然不知道什么原理,也没有找到相关解释,但是在试验中发现
号可以去掉列表两边的中括号,如

q = [1,2,3,4]
print(*q)
结果为1,2,3,4

希望有人告知本人*号在这的使用原理,本人将万分感谢

于是*xy_map就为[a1,b1],[a2,b2],······[an,bn] 共n个含有两个元素的列表,再将这n个列表压缩,即zip(xy_map):
得到[(a1,a2,·····,an),(b1,b2,······bn)]这样的列表,当然python3中为一个对象,但是结果相同,
然后
zip(*xy_map)为:
(a1,a2,······,an)(b1,b1,······bn)
最后x_unique,y_mean = [*zip(*xy_map)]就是x_unique,y_mean分别为[a1,a2,····an],[b1,b2,······bn]

终于稀里糊涂地写完了第一篇博客,希望自己加油努力,争取成为一个合格技术人员吧(成为技术大牛心里想着不敢说出来。。)

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值