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

输出结果如下:



再看一个图



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

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

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


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270