Python入门 - 面向对象思想 小白入门详解

作者: Spareribs | 来源:发表于2019-01-29 20:19 被阅读225次

    文章背景

    • 学习Python 变量 字典 列表 字符串 这些基础之后,入门第一个小的作业。
    • 那我该怎么入门呢?我该怎么去学习呢?
    • 这里我给大家讲解一下面向对象的编程方法,也是我初入门的时候比较疑惑的地方:如何去解决一个问题

    题目

    读取一个文件,将文件中转换为字典,key值为学习项目,value值为一个负责人列表,并判断字典中是否有负责人负责多个学习项目。

    homework.txt 文件内容如下:
    
    python学习 咖喱 胡骞  
    leetcode刷题 老表 陈焕森  
    编程集训 孙超 小熊  
    统计学 李奇峰 蓝昔  
    ML项目实践 杨冰楠 孙涛  
    高级算法梳理 于鸿飞 小雪  
    基础算法梳理 sm1les 钱令武  
    知乎小组 李严 黑桃  
    学习群 咖喱 排骨  
    
    学习群(空格)咖喱(空格)排骨(换行符)
    

    分析

    题目可以拆解成两部分

    • 读取文件,将 key值为学习项目,value值为一个负责人列表
      • 【难点】怎么读取文件?怎么去提取里面的数据?
      • 读取文件的方法,在廖雪峰的官网就有,照葫芦画瓢就可以了
      • 字符串切割字符的方法
    • 判断是否有负责人负责多个学习项目
      • 这个我觉得不难,只是一个逻辑判断
      • 具体实现的方式有很多。看你自己处理这个问题的方法

    详细解释

    读取 homework.txt 这个文件

    先看下我实现这个功能的代码,如果看不懂没关系

    _dict = {}  # 建立空字典
    with open('homework.txt', encoding='utf-8') as f:  # 读取文件
        # print(type(f)) # 查询类型
        # print(dir(f)) # 查询方法
        for line in f.readlines():
            word = line.split() # 对每一行进行切割
            _group = word[0]  # 提取key值
            _name_list = [word[1], word[2]]  # 提取value值
            _dict[_group] = _name_list
    

    输出结果如下:



    再看一个图



    如果看不懂,没关系。继续往下~~

    open() 方法

    首先我们来看看怎么读取一个文件,看廖雪峰的教程 IO编程-文件读写,教程里面有教比较基础的方法,我这里挑出重要部分讲解。

    # 方法一 
    f = open('/path/to/file', encoding='utf-8')
    print(f.read())
    f.close()
    
    # 方法二
    with open('/path/to/file', encoding='utf-8') as f: 
        print(f.read())
    

    这两种方法都可打开这个文件,with ... as 这种方法更为优雅,这里也是挑选第二种方法来讲解。

    • 首先我们要看一下有哪些东西我们需要去理解的。with 是关键字,as 也是关键字,open() 是方法,f 是变量。
    • 关键字就是关键字,没有可以理解的地方,这个就是固定语法,就像拼音一样。
    • 我们去理解的是 open()方法f 变量

    那我们要怎么看这个方法呢?这里教大家看一下open这个方法的源码~~

    注意:本人使用的是Pycharm,如果是 notebook或者是其他的软件方法估计类似,可以自己研究一下~~

    方法一: 在pycharm里面 【按住Ctrl + 鼠标左击】就能跳转到这个方法的说明:


    我们不难看到open()这个方法的说明和它需要传入的参数。如果觉得这个操作太麻烦,英文不是很好,那么可以Google和百度嘛~~

    方法二: 使用关键字搜索 python 文件 open方法


    搜索出来的链接可以自己去查看 点击跳转

    我们回到我们要理解的代码

    with open('homework.txt', encoding='utf-8') as f:
    

    其实就是以utf-8的编码方式来打开文件,以句柄的方式存入f 变量 中。这个操作,就是把 文件的内容,转成了一个 <class '_io.TextIOWrapper'> 类对象,存入 f 变量 中。

    为什么我会知道是 <class '_io.TextIOWrapper'> 的类对象呢?

    f 变量 或者 class '_io.TextIOWrapper' 的类对象分析

    其实我自己也不知道 <class '_io.TextIOWrapper'> 类对象 具体是什么东西,但是我可以通过type() , dir()help() 来查看。

    我们先用 type() 来看一下f变量 是什么类型

    with open('homework.txt', encoding='utf-8') as f:
        print(type(f))
    

    输出结果如下:


    • python是面向对象的编程,一切皆对象~~~
    • f 变量是个 _io.TextIOWrapper 类对象
    • 不懂??没关系先记住,我们继续往下

    再用 dir() 看看 f变量 能使用那些方法:

    with open('homework.txt', encoding='utf-8') as f:
        print(dir(f)) 
    

    输出结果如下:


    • 不难发现read,readline,readlines这些方法都在里面
    • 怎么用呢?其实就是f 变量后面能使用哪些方法
    • 其实就是f.read(),f.readline()f.readlines()

    具体的使用说明,我们用help()查看,说明文档都是比较多的,这里截取我们用到的 readline() 看看说明文档

    with open('homework.txt', encoding='utf-8') as f:
        print(help(f)) 
    

    输出结果如下:


    readlines() 读取 f变量中的每一行信息


    直接从结果看,它就是一个列表。如果你不相信,你可以这么操作,使用前面提及到的type() 方法来查看
    • 前面说到的 f 变量 是个 _io.TextIOWrapper 类对象 看不懂
    • 那么这里 f.readlines() 就是一个 列表list 类对象 列表操作看懂了吧

    不要怀疑你自己,它的结果就是一个列表,我们就按照列表的方式操作。

    for ... in ... 操作 得到 line变量

    with open('homework.txt', encoding='utf-8') as f:
        for line in f.readlines():
            print(line)
    

    输出结果如下:


    • 这里为什么要用 for...in... 呢?
    • 列表是一个迭代对象,可以用 for...in... 的方式读取列表里面的内容。具体不懂自己可以尝试一下,例如:
    test_list = ['python学习 咖喱 胡骞\n',
           'leetcode刷题 老表 陈焕森\n', 
           '编程集训 孙超 小熊\n']
    for line in test_list :
       print(line)
    

    输出结果如下:


    所以使用 for...in... 读取 f.readlines() 列表对象的内容, 读取每一行的数据

    line 变量

    with open('homework.txt', encoding='utf-8') as f:
        for line in f.readlines():
            print(line, type(line))
    

    输出结果如下:


    • 我们继续看line变量,其实就是一个str字符串,字符串切割有什么方法呢?
    • 前面刚说完的dir(line) 和 help(line)这时候又派上用场了,这里不详细说明了。直接使用split()操作

    split()

    with open('homework.txt', encoding='utf-8') as f:
         for line in f.readlines():
                print(line.split())
    

    输出结果如下:


    剩下的存字典代码就不再一步步解说了~~ 基本方法就折这样

    参考答案

    读取文件

    _dict = {}  # 建立空字典
    with open('homework.txt', encoding='utf-8') as f:  # 读取文件
        # print(type(f)) # 查询类型
        # print(dir(f)) # 查询方法
        for line in f.readlines():
            word = line.split()  # 对每一行进行切割
            _group = word[0]  # 提取key值
            _name_list = [word[1], word[2]]  # 提取value值
            _dict[_group] = _name_list
    

    列表判断重复

    """
    方法2:存入列表,eg: ['咖喱', '胡骞']
    """
    _all_name_list = []
    for _group in _dict.keys():
        _name_list = _dict.get(_group)  # 获取到学习项目的负责人列表
        for _name in _name_list:
            _all_name_list.append(_name) # 将当前学习营的人员加入总列表
    
    print(_all_name_list)
    # set去重 对比长度就知道有没有重复了
    if len(set(_all_name_list)) - len(_all_name_list) !=0:
        print("重复了")
    else:
        print("没有重复")
    

    字典判断重复

    """===========
    方法2:存入字典的方式,eg: {'咖喱': 2, '胡骞': 1}
    """
    _name_dict = {}
    # print(_dict.keys()) # 获取到字典里面的所有key
    for _group in _dict.keys():
        _name_list = _dict.get(_group)  # 获取到学习项目的负责人列表
        # print(_name_list)
        for _name in _name_list:
            if _name_dict.get(_name):
                _name_dict[_name] += 1
            else:
                _name_dict[_name] = 1
    
    # print(_name_dict)
    
    for _name in _name_dict.keys():
        if _name_dict.get(_name) > 1:
            print("{0} 重复了".format(_name))
    

    总结

    python其实很简单,开发功能的时候,你要清楚自己【当前操作】是一个什么对象,【操作完】又是一个什么对象,再用逻辑(条件判断,循环等)把这一串对象转换过程串起来就可以了~~

    文件读取过程,对象的转换如下:


    就是我最开始给的那张图
    小白如果还有不懂的,欢迎留言~~~

    相关文章

      网友评论

        本文标题:Python入门 - 面向对象思想 小白入门详解

        本文链接:https://www.haomeiwen.com/subject/ixlfsqtx.html