查看原文
其他

扩展技能 | 《Python数据分析从小白到专家》

田越 编写 数据仓库与Python大数据 2022-11-29

前言:文末正版好书赠送《Python数据分析从小白到专家》活动5本,值得拥有,等你参与哦!


☞ 关注公众号『数据仓库与Python大数据』,获取更多优质资源与干货文章


编辑:洋洋


导读:作为大数据、数仓开发,Python是不可或缺的工具与技能。本节主要讲解Python的匿名函数lambda和Python类的相关知识,使读者了解Python的强大之处。(领书可直接滑到文末)


匿名函数lambda


匿名函数lambda属于函数式编程的范畴,但是Python不是天生的函数式编程语言。即便如此,虽然Python不适合函数式编程,但是匿名函数lambda迅速命名函数的方式可以使代码更加简洁。首先,来看看如何定义一个一般函数和匿名函数lambda,代码如下:

# 一般函数的定义def tellMeYourName(): return 'Tim'print(tellMeYourName())# 匿名函数lambda的定义tellMeYourNameV2 = lambda: 'TIM'print(tellMeYourNameV2())

输出结果:

TimTIMProcess finished with exit code 0

可见,对于这种只有一行的函数非常适合用匿名函数lambda来编写,因为使用lambda的代码只占一行,十分简明。调用方式也和普通的用def和return语句定义的函数一样。

匿名函数不会在任何空间里创建名字,所以可以节省大量内存,如下是匿名函数lambda的使用示例

a=lambda x,y=2:x+y

调用方式如下:

a(3)# 3+2a(3,5)# 3+5

输出结果:

58Process finished with exit code 0

Python函数式编程还拥有3个内建函数,即filter()、map()、reduce(),分别用于过滤、映射、迭代。先来看filter()过滤器的源代码:

def filter(bool_func,seq): filtered_seq=[] for eachItem in seq: if bool_func(eachItem): filtered_seq.append(eachItem)return filtered_seq

原理是当if bool_func(eachItem)被判为True时,把eachItem加入新的filtered_seq列表中,否则舍去。bool_func是过滤法则;seq是传入列表;filtered_seq是传出列表。下面的示例是先产生一个较大的随机数集合,然后过滤所有的偶数,留下奇数,代码如下:

from random import randintdef odd(n):return n%2allNums=[]for eachNum in range(9): allNums.append(randint(1,99))print(filter(odd,allNums))

输出结果:

<filter object at 0x03758070>Process finished with exit code 0

上述代码打印的是所在的地址,其作用实际上和下面这段代码的作用一样。

from random import randint as riprint(n for n in [ri(1,99)for i in range(9)]if n%2)

输出结果:

<generator object <genexpr> at 0x0398B8B0>Process finished with exit code 0

map()是映射函数,大致的源代码如下:

def map(func,seq): mapped_seq=[] for eachItem in seq: mapped_seq.append(eachItem)return mapped_seq

其中,func是映射规则;seq是传入的原列表;mapped_seq是返回后的映射内容,可用于哈希表(字典)的创建过程中。

reduce()是迭代器,也被称为“折叠”,示例代码如下:

reduce(func,[1,2,3])func(func(1,2),3)

具体的示例代码如下所示:

print('the total is:',reduce((lambda x,y:x+y),range(5))

输出结果:

the total is 10Process finished with exit code 0

Python自定义类与打印函数


首先介绍面向对象编程(OOP),其是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次进行系统建模,更贴近事物的自然运行模式。

确切地说,面向对象编程是通过“抽象”“继承”“封装”这3种方式来实现更佳的“人机友好”。抽象是将一些方法写为抽象类,一种不可以被实例化,只能被继承的类;通过“继承”衍生出各种子类,将方法“封装”在各个子类中以供使用者调用。这就是面向对象编程(OOP)的基本思想。

在Python中以class为关键字,在其后跟类名来创建一个自定义的类,在内部封装类对象和方法等,示例如下:

class Logger(object):    # 对象、方法等

定义方法和定义函数一样,都使用def语句,示例如下:

Import sysclass Logger(object): def __init__(self, fileN="Default.log"): self.terminal = sys.stdout self.log = open(fileN, "a", encoding="utf-8") def write(self, message): self.terminal.write(message) self.log.write(message) def flush(self):        pass

Logger类的作用是传入一个文件名(也可以不传,默认生成),如果该文件存在,则将屏幕打印的内容保存到一个TXT文件里,示例如下:

import sysclass Logger(object): def __init__(self, fileN="Default.log"): self.terminal = sys.stdout self.log = open(fileN, "a", encoding="utf-8") def write(self, message): self.terminal.write(message) self.log.write(message) def flush(self): passsys.stdout = Logger("E:\\example1.txt")for i in range(0, 30):    print(i)

输出结果:

012342526272829Process finished with exit code 0

读者可以在E盘中找到一个名为example1.txt的文件,其中存放了打印出的内容,如图1所示。

                            图1   用于保存输出结果的自定义类文件输出示例

     -本文章摘自《 Python数据分析从小白到专家》一书,有删改,以出版纸质书为准。


赠书环节


为感谢各位读者的喜欢,这次再送一本电子工业出版社的《Python数据分析从小白到专家》


推荐语:

系统:讲解了11 种数据分析方法,拿来就用
图示:全书包括100多张图表,方便读者学习
深入:剖析NumPy、Pandas、Matplotlib的使用方法
案例:全书包括142个案例,都附有详细源代码





赠书环节


送书环节来了,

公众号回复“066”,参与抽奖

一共5本正版图书

也欢迎把本次抽奖活动分享给更多的朋友

扫一扫回复:“066


温馨提示:本次送书活动为关注本公众号的粉丝专属福利

                 开奖后三天内和我们联系哦

                 不联系视为作废

                 我们以快递的方式给粉丝们包邮到家

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存