2020-07-22 Python学习笔记28编程思维

一些关于自己学习Python的经历的内容,遇到的问题和思考等,方便以后查询和复习。

声明:本人学习是在扇贝编程通过网络学习的,相关的知识、案例来源于扇贝编程。如果使用请说明来源。

第28章 编程思维

学习笔记

卡耐基梅隆大学计算机教授 Jeannette Wing 提出 编程思维(Computational Thinking)的概念。编程思维 分为如下四点:

1 问题分解:把现实生活中的复杂问题,逐步拆分成容易解决的小问题;

2 模式识别:根据已有的知识和经验,找出新问题和以前解决过的问题的相似性;

3 抽象思维:将问题里涉及的数据抽象到数据结构(变量、列表、字典等),把数据处理过程可重复执行部分抽象成函数;

4 算法设计:根据前三步的分析成果,设计步骤,写出算法,从而解决问题。

编程思维的核心,不是编程语言,也不是语法,甚至不是算法或数据结构本身,而是如何分解问题,从中发现规律,建立解决问题的模型,并映射到合适的数据结构和算法上,然后才能根据算法写程序实现。

我们以计算文章难度为例:一篇英文文章中有很多单词,初始难度分为 0,每当出现一次生词就将难度分 +5,最终的难度分就代表这篇文章的难度。

问题分解

计算文章难度看上去很难,无从下手,我们来将它分解一下:

1 统计文章中的单词数

2  统计所有单词中生词的数

3 根据生词数计算难度分

模式识别

将问题分解后,接着我们开始着手解决这些小问题。“统计文章中的单词数”我们能联想到之前字符串中文本统计的做法。之前是按字统计,这次是词,本质上差别不大。

“统计所有单词中生词的数”和“根据生词数计算难度分”就是在所有单词中寻找生词,找到一个就给难度分 +5。无非就是循环、判断和求和的组合运用。在熟练掌握 Python 基础知识后,遇到问题我们能很快地判断出涉及到哪些知识点。

抽象思维

知道运用哪些知识点去解决问题后,我们还要完善代码,用更好的方式去解决问题。我们需要将问题抽象,比如文章、生词、词频、难度分等分别要用什么数据类型保存,整型?浮点型?字符串?列表还是字典?如何将代码封装成函数?

算法设计

前期的准备工作都做完了,数据准备好了,思路也理清楚了。接下来是最重要的一步:算法设计。我们要将之前的想法用代码写出来,从而解决问题。

我们之前说过,解决计算文章难度分为三步:统计文章中的单词数、统计所有单词中生词的数和根据生词数计算难度分。

“统计文章中的单词数”首先要将文章拆分成一个个单词,这里用到字符串方法里的 split() 方法,因为文章中有标点,我们还要用 replace() 方法将标点去除。

有了单词列表后我们可以统计出每个单词出现的次数,单词和次数这种一一对应的关系应该用字典存储,我们首先定义一个空字典,然后用循环遍历单词列表,如果字典里有了该单词,将对应的次数 +1,否则是第一次出现该单词,将对应的次数设为 1。

前面得到的单词列表是有问题的。因为有些单词的首字母是大写的,并不统一,因此在统计的时候会将大小写不一样的单词误认为是两个单词。所以我们需要将大小写统一,这里就调用字符串的 lower() 方法将其全都变成小写好了。

# 省略之前获取 word_list 代码

word_count = {}

for word in word_list:

  if word in word_count:

    word_count[word] += 1

  else:

    word_count[word] = 1

print(word_count)

# 输出:{'this': 2, 'is': 11, 'a': 5, 'photograph': 3, ... 'into': 1}

有一个疑问,遍历整个文本进行统计之后,这些信息时如何进入字典的,比如列表有一个添加到里表中的命令,这里没有任何的向空字典中添加键和值的命令啊。

练习:统计文章难度:

“统计文章中的单词数”吗?除此之外我们再将代码封装成一个函数。

要求:

定义一个名为 get_word_count 的函数;

函数的参数为文章内容,返回值是每个单词出现次数的字典;

函数的功能是“统计文章中的单词数”;

调用函数并打印出单词出现次数的字典。

article = '''This is a photograph of our village.

Our village is in a valley.

It is between two hills.

The village is on a river.

Here is another photograph of the village.

My wife and I are walking along the banks of the river.

We are on the left.

There is a boy in the water.

He is swimming across the river.

Here is another photograph.

This is the school building.

It is beside a park.

The park is on the right.

Some children are coming out of the building.

Some of them are going into the park.

'''

def get_word_count(article):  #包装成函数,代码的首行就是定义函数

  word_count = {}

  word_list = article.replace('.', ' ').lower().split()  #针对串的操作可以一次性进行

# print(word_list)

  for word in word_list:

  #word_count.append(word)

    if word in word_count:

      word_count[word] = word_count[word] + 1

    else:

      word_count[word] = 1

  return word_count  #至关重要的一句话

print(get_word_count(article))  #定义和打印时,都带有参数article


练习:统计课文的难度终极

我们之前完成了计算文章难度的第一步,还剩统计所有单词中生词的数和根据生词数计算难度分,我们来完成它们。

我们再来看一看题目要求:一篇英文文章中有很多单词,初始难度分为 0,每当出现一次生词就将难度分 +5,最终的难度分就代表这篇文章的难度。

如果你已经有了思路,可以忽略下面的内容直接开始写代码了,如果你还是一头雾水,可以再思考一下然后看下面的提示。

提示:我们在统计生词数的同时可以进行难度分的计算,因此可以合并成一个 get_difficulty() 函数,参数为每个单词出现次数的字典和生词列表。初始难度分为 0,遍历生词列表,如果生词在单词出现次数的字典中,难度分增加 5 * 该单词出现的次数,最终即可得到难度分。

article = '''This is a photograph of our village.

Our village is in a valley.

It is between two hills.

The village is on a river.

Here is another photograph of the village.

My wife and I are walking along the banks of the river.

We are on the left.

There is a boy in the water.

He is swimming across the river.

Here is another photograph.

This is the school building.

It is beside a park.

The park is on the right.

Some children are coming out of the building.

Some of them are going into the park.

'''

# 三引号,定义一个多行文本的字符串。

new_words = [

  'photograph',

  'village',

  'valley',

  'between',

  'hills',

  'another',

  'prep',

  'wife',

  'along',

  'banks',

  'water',

  'swimming',

  'building',

  'park',

  'into'

]

# 用一个列表来存放生词

def get_word_count(article):  #统计单词及其个数的函数,参数是字符串

  word_count = {}

  word_list = article.lower().replace('.', '').split()

  for word in word_list:

    if word in word_count:

      word_count[word] += 1  #这里的+=之间不可以有空格

    else:

      word_count[word] = 1


  return word_count

#print(get_word_count(article))

#在此处print(word_count),会反馈没有定义,但是这里可以打印函数运行的结果

def get_difficulty(word_count, new_words):  #定义一个计算难度的函数,要用到字典和列表

  difficulty = 0

  for word in new_words:

    if word in word_count:

      difficulty = difficulty + 5 * word_count[word]  #直接在字典中提取键对应的值

  return difficulty

word_count = get_word_count(article)  #函数运行的结果赋值给word_count.

print(word_count)                  #次数打印结果和前面打印函数运行结果相同

difficulty = get_difficulty(word_count, new_words)  #计算的难度结果赋值,以便下文打印

print(difficulty)    #上一行直接打印难度函数结果也可以



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