数据蛙数据分析每周作业理财与人生机器学习与数据挖掘

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

2019-01-29  本文已影响225人  Spareribs

文章背景

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

题目

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

homework.txt 文件内容如下:

python学习 咖喱 胡骞  
leetcode刷题 老表 陈焕森  
编程集训 孙超 小熊  
统计学 李奇峰 蓝昔  
ML项目实践 杨冰楠 孙涛  
高级算法梳理 于鸿飞 小雪  
基础算法梳理 sm1les 钱令武  
知乎小组 李严 黑桃  
学习群 咖喱 排骨  

学习群(空格)咖喱(空格)排骨(换行符)

分析

题目可以拆解成两部分

详细解释

读取 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 这种方法更为优雅,这里也是挑选第二种方法来讲解。

那我们要怎么看这个方法呢?这里教大家看一下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))

输出结果如下:


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

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

输出结果如下:


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

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

输出结果如下:


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


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

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

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

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

输出结果如下:


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))

输出结果如下:


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

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


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

猜你喜欢

热点阅读