您的位置:首页 > 编程语言 > Python开发

我要偷偷的学Python,然后惊呆所有人(第四天)

2020-10-21 12:13 901 查看

标题无意冒犯,就是觉得这个广告挺好玩的
上面这张思维导图喜欢就拿走,反正我也学不了这么多

文章目录

  • csv模块操作Excel图表
  • 我画了个圈,欢迎大家来我们的小圈子
  • 前言

    前期回顾:我要偷偷学Python,然后惊呆所有人(第三天)
    上面这篇里面写了python的一些知识基础,主要是Python对于文件的读写操作,可能是字数比较少吧,每次我自己点开都觉得有点尴尬。
    但是也是因为文件读写相对于前面两篇会比较难一点吧

    那么今天,我们就看一下能让Python成为‘万金油’的东西,模块!如果对基础还不是很熟练的话可以再扎实一下基础,毕竟万丈高楼平地起嘛,基础不老实是很危险的。

    本系列文默认各位有一定的C或C++基础,因为我是学了点C++的皮毛之后入手的Python,这里也要感谢齐锋学长送来的支持。
    本系列文默认各位会百度,学习‘模块’这个模块的话,还是建议大家有自己的编辑器和编译器的,上一篇已经给大家做了推荐啦?
    
    我要的不多,点个关注就好啦
    然后呢,本系列的目录嘛,说实话我个人比较倾向于那两本 Primer Plus,所以就跟着它们的目录结构吧。
    
    本系列也会着重培养各位的自主动手能力,毕竟我不可能把所有知识点都给你讲到,所以自己解决需求的能力就尤为重要,所以我在文中埋得坑请不要把它们看成坑,那是我留给你们的锻炼机会,请各显神通,自行解决。

    好,接下来切入正题。

    什么是模块?

    如果有学过其他高级语言的朋友就会知道,在C/C++的源文件开头,一般都会有一大堆的‘include’,这是引用头文件,一个头文件当中会有一些比方说类、函数、变量等等,而你要使用这些东西,你就要事先做一个声明。

    这样讲实在是太空泛了。

    假设现在有个QQ群,群里有成员,有文件资料,有聊天记录,你要获取这些东西并使用,你是不是得加群?
    掉用模块就是这个道理,模块里面有类、有函数、有变量,你要使用这些东西,你就得导入模块。

    这样讲就通畅多了嘛。

    emmm,总觉得还是少了点什么,对,我们来扫描一个模块,瞟一眼就好啊,不求看懂,大概知道里面是啥,咱心里有点数:

    以下是一块 random 模块中的截取:

    from warnings import warn as _warn
    from types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethodType
    from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
    from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin
    from os import urandom as _urandom
    from _collections_abc import Set as _Set, Sequence as _Sequence
    from hashlib import sha512 as _sha512
    import _random
    
    __all__ = ["Random","seed","random","uniform","randint","choice","sample",
    "randrange","shuffle","normalvariate","lognormvariate",
    "expovariate","vonmisesvariate","gammavariate","triangular",
    "gauss","betavariate","paretovariate","weibullvariate",
    "getstate","setstate", "getrandbits",
    "SystemRandom"]
    
    NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0)
    TWOPI = 2.0*_pi
    LOG4 = _log(4.0)
    SG_MAGICCONST = 1.0 + _log(4.5)
    BPF = 53        # Number of bits in a float
    RECIP_BPF = 2**-BPF
    
    class Random(_random.Random):
    VERSION = 3     # used by getstate/setstate
    
    def __init__(self, x=None):
    self.seed(x)
    self.gauss_next = None
    
    def seed(self, a=None, version=2):
    if a is None:
    try:
    # Seed with enough bytes to span the 19937 bit
    # state space for the Mersenne Twister
    a = int.from_bytes(_urandom(2500), 'big')
    except NotImplementedError:
    import time
    a = int(time.time() * 256) # use fractional seconds
    
    if version == 2:
    if isinstance(a, (str, bytes, bytearray)):
    if isinstance(a, str):
    a = a.encode()
    a += _sha512(a).digest()
    a = int.from_bytes(a, 'big')
    
    super().seed(a)
    self.gauss_next = None
    ……

    可以看到,开头那个它调了一堆的包(import…,现在看不懂没关系),然后接下来时一些变量,接着是个类,类里面有函数。
    好,大概瞟一眼就好啊,我们继续

    定义变量需要用赋值语句,封装函数需要用def语句,封装类需要用class语句,但封装模块不需要任何语句。

    之所以不用任何语句,是因为每一份单独的Python代码文件(后缀名是.py的文件)就是一个单独的模块。

    这个也不难理解吧。

    封装模块的目的也是为了把程序代码和数据存放起来以便再次利用。如果封装成类和函数,主要还是便于自己调用,但封装了模块,我们不仅能自己使用,文件的方式也很容易共享给其他人使用。

    跟我一起动手导入自己的模块

    怎么说呢,别人的模块千千万,但是学习的时候还是用自己写的模块比较得心应手,因为以后也少不了自己写模块的时候。

    第一步:新建一个模块

    照图中的顺序,把模块新建出来,然后把代码写上。

    第二步:调用模块

    好,这是一个很简单的小栗子。

    调用模块不同方法。

    就像上一篇的文件打开有两种方法,一种直接了当的打开,另一种用别名,这里调用模块也有不同的方法。

    第一种直接import已经见过了,不过这里可以再说一点,如果模块名过长,可以取个别名
    比方说

    import test
    ,你觉得test有点长,后面使用不方便,你可以这样:
    import test as t

    不过后面就只能用 t 来指代那个模块,而不能再用 test 了,它已经被顶包了。

    第二种方法,叫 from…import…
    这种方法是什么,还是上面那个例子,我现在就想用test里面的那个test3类,其他的我不要,那我为什么要把其他的东西都导进来,那不是太庞大了吗?这时候就可以用这种方法,精准定位。

    看图:
    这是一个典型的错误写法:既然你已经精准定位了,就不要再纠缠与以前的那个大水池了

    这里测试了一下如果只导入某部分,其余没被导入的部分被导入部分应用会不会有冲突:

    这是验证结果:

    这是别名的使用,照样是可以使用的:

    这里再提一点,如果想要导入多个模块呢?也是可以的,不同模块之间用逗号割开即可,大家动起来,自己尝试一下。

    if __name__ == '__main__'

    对于Python和其他许多编程语言来说,程序都要有一个运行入口。

    在Python中,当我们在运行某一个py文件,就能启动程序 ——— 这个py文件就是程序的运行入口。

    但是,当我们有了一大堆py文件组成一个程序的时候:

    为了【指明】某个py文件是程序的运行入口,我们可以在该py文件中写出这样的代码:

    # 【文件:xx.py】
    
    代码块 ①……
    
    if __name__ == '__main__':
    代码块 ②……

    这句话的意思是这样的:

    这里的【if name == ‘main’】就相当于是 Python 模拟的程序入口。Python 本身并没有规定这么写,这是一种程序员达成共识的编码习惯。

    csv模块操作Excel图表

    首先我们要明确的知道,这是在使用别人的模块。其次我们只知道我们要实现的功能是简单操作Excel表格。

    那么我们的顺序就应该是:
    我要用什么模块?
    这个模块里有哪些功能?
    这些具体功能该怎么使用?
    好的,我去用了。

    我要用什么模块?

    这个其实很好办,也很不好办。
    说好办嘛,你问度娘就好啦:

    是吧,一搜全都有。
    说不好办吧,很多前人的经验你是搜不到的,你得去问。

    比如说我们今天就使用csv模块,因为它简单易上手。

    这个模块里有哪些东西?

    那这个问题也很好办嘛,如果觉得自己英语没问题,或者想锻炼一下英语的朋友,可以去官网,因为官网是有更新到最新版的。
    中文翻译版嘛,有时候不能很有效的找到最新版。

    嘿嘿,开个玩笑,中文版也有
    Python手册(官方中文版)

    好,我们找到csv模块(有搜索框的):CSV

    有兴趣的话可以连中文带英文一起看,赶时间的话就直接看它的示例代码即可啦。

    使用csv模块

    首先我们建个表:

    然后打开这个表,就像打开文件一样,如果文件操作还不熟练的朋友可以回到这篇温习一下:
    我要偷偷学Python(3)

    import csv
    
    with open('test.csv', newline = '', encoding = 'GBK')  as f:
    #参数encoding = 'utf-8'防止出现乱码
    reader = csv.reader(f)
    #使用csv的reader()方法,创建一个reader对象
    for row in reader:
    print(row)

    先创建一个变量名为writer(也可以是其他名字)的实例,创建方式是writer = csv.writer(x),然后使用writer.writerow(列表)就可以给csv文件写入一行列表中的内容。

    import csv
    
    with open('test.csv','a', newline='',encoding='utf-8') as f:
    writer  = csv.writer(f)
    writer.writerow(['6', '小黑', '65', '82', '86'])
    writer.writerow(['7', '小红', '78', '64', '31'])


    到这里,最基本的csv表格读取和录入方法我们就已经学会了。

    今日份任务:
    大家尝试一下将多个csv文件合并到一个csv文件中吧,这个说难其实也不难,说简单也不是那么的直观啦。

    下一篇我会放上我的代码。

    然后呢,我平均三四天更一篇“偷偷学Python”系列文咯,所以大家不要着急,一切都会如期而至。

    下一篇是实操文,带大家从头回顾这些天的学习内容,练习会比较多哦。

    我画了个圈,欢迎大家来我们的小圈子

    我建了一个Python学习答疑群,有兴趣的朋友可以了解一下:这是个什么群

    直通群的传送门:传送门


    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: