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

文章背景

  • 学习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

输出结果如下:

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

再看一个图

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

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

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 + 鼠标左击】就能跳转到这个方法的说明:

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

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

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

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

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

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

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入门 - 面向对象思想 小白入门详解》

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

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

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

输出结果如下:

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

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

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

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

输出结果如下:

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

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

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

直接从结果看,它就是一个列表。如果你不相信,你可以这么操作,使用前面提及到的
type() 方法来查看

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

  • 前面说到的 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)

输出结果如下:

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

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

输出结果如下:

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

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

line 变量

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

输出结果如下:

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

  • 我们继续看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())

输出结果如下:

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

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

参考答案

读取文件

_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入门 - 面向对象思想 小白入门详解》

就是我最开始给的那张图

小白如果还有不懂的,欢迎留言~~~

    原文作者:Spareribs
    原文地址: https://www.jianshu.com/p/1ab049db1410
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞