1901010071-关于入门我是被一脚踹进来的

关于入门我是被一脚踹进来的

作者:李龙斌(自学训练营学习2群)

学完14天编程营最直观的感受就是:

通往编程的门是窄的,我被编程营一脚踹进来了,然后我拿着手里的三两贝壳,望着远方的大海愣住了。

之所以有这个感受,是因为听过自学小能手许岑讲过他自学钢琴的故事。许岑为了逼自己,买了最贵的钢琴,找了最牛的老师。钢琴老师并没有一板一眼的从头教他弹钢琴,而是问了他一件事。

你学会钢琴后最想弹的是哪首曲子?

许岑说了,然后钢琴老师在接下来一段时间里教会了他弹这首曲子。许岑先是不解,后来开心极了。因为能够直接弹奏他最喜欢的曲子,所以他学起弹钢琴来更有兴趣了,即使从最基础的练起也不太容易放弃了,最近听说的是许岑一天要练十个小时左右的钢琴。

所以我们参加这个14天的编程训练营不是为了让我们在能14天内就编程打遍天下无敌手,而是通过一系列作业让我们快速入门的,甚至在最后通过一个微信机器人实例让所有学到这的人知道怎么用起来。当编好的机器人把朋友分享过来的文章拆解成文字并返回一张统计图片的时候,自己获得的那种幸福感是极其强烈的,接下来就会想着怎么把学到的这个东西用到其它地方去,让自己获得更多的快乐,会上瘾!

如果14天编程营没有让你享受到入门的乐趣,那是编程营的错;如果你从此就以为自己掌握了编程,那是你的错。

一路兵荒马乱的跑完14天的课程,我虽然勉强入门了,但自己的基础是不牢靠的,前面也说了,当然这也是李笑来老师一直强调的。

速成绝无可能,但快速入门是可以的。

《自学是门手艺》如果现在再去看的话,一定已经打开了一层封印,我可以理解更多的东西了,我后面要做的事情估计也是老生常谈了。

书读百遍,其义自见。无他,唯手熟尔。

最后要感谢的是一路前进过程中的各种小伙伴们,还有教练和助教的默默鼓励和支持。每次自己写的程序出了问题的时候或者编不下去的时候,看着一个营的小伙伴在默默提交作业,自己都在想,那么大的人了,赶紧滚去再写。

每次写完作业和总结交上去的时候总会得到教练、助教和辅导员的鼓励,开始的时候不觉得怎么样,但到后面编程编到怀疑人生的时候得到鼓励还是觉得心里面暖暖的,然后就一路摸爬滚打向前了,以后我也要经常去鼓励他人,期待在远方的时候我们再见!

day13

这个做图一开始看着挺令人犯难的,因为前一天返回的数据不知道怎么拿来用,看了下别的同学的成果才知道,需要把结果字典化。

1
2
3
result = dict(text) 
keys,values = zip(*r_dic.items())
# 利用keys和value把词组和词频分开来用

然后再利用阅读材料中给定的表格编制样本,稍微调整改一下参数,就运行起来了,登录自己的小号,发文章测试了下,得到如下结果:

返回结果

其中在测试的时候图标中的文字一度不能显示为中文,是一些框框,看了issues中的同学的方法才解决的。直接在issues中的Filters搜索:1710可以找到这个问题。win系统解决方案如下:

1
2
plt.rcParams['font.sans-serif']=['SimHei'] # 加在下一句前面
ax.barh(y_pos, frequency, xerr=error, align='center', color='green', ecolor='black')

Day12

今天的内容直接开始玩微信自动回复了,好玩。按照介绍编好了自动回复程序试运行起来,然后直接跳出一个二维码出来,扫描后微信网页登录。初次运行的时候老是跑不起来,然后检查了下自己的代码,发现是代码输入有问题。再次运行的时候,显示已经登录,然后给我匹配的朋友发了句:

请给我分享一篇文章

感觉自己特别像个机器人,但是朋友文章分享过来后返回的内容有问题,再次查看,还是有输错的代码,再次重输调试。最后终于运行成功,给对方返回了day11的字词统计,中英文一起统计,瞬间幸福感爆棚。

从今天开始,感觉前几天的内容串起来了,一遍又一遍的让我们调试自己编写的函数,就是让我们对函数有更加深入的了解,从而在调用别人的函数的时候不会有太大的生硬感,然后对python编程有了更加深入的了解。

内心对这些开源程序大牛更加佩服了,他们搭好一个又一个积木,让后面的人能拼出更牛的作品,而且是完全免费开源的,开源世界真是太棒了。

Day11

今天的作业就比较好玩了,直接上手了实用的内容。采铜是一个我很喜欢的作者,没想到今天的作业是要把采铜一篇爆文中所采用的办法用python程序来实现,而且一劳永逸,内心不禁泛起了欢乐,不知道采铜知道了会怎么想。

我想今天的内容已经接触到了网页爬虫,用的是这个库:

requests

比较厉害,抓到网页后需要处理,尝试只在抓取后用print()函数测试抓到了什么,结果显示空白。然后需要用到的是这个库:

PyQuery

这个库我也用print()函数测试了下,第一次处理打印出来的是一大堆网页编码,文章混杂在其中,必须要用到作业中的第二步处理方法,打印出来的就是文字了。

然后就是愉快的用我们自己前几天编好的函数进行处理了,其中一步会用到

str() # 将结果转化为str类型

这一步必须进行,否则的话邮件是发不出去的,会报错。

然后就是编辑设置getpass和yagmail进行结果邮件发送了,必须注意的是要设置邮箱smpt码,然后用这个码发送要方便点。

Day10

day10的作业是要求词频统计,要求引入一个外部的库结巴,听起来很傻,但确实一个厉害的断词的库。
结巴一共有三种模式:

全模式、精确模式、搜索模式

作业要求的是精确模式。这是一个很神奇的库,有点类似于我们小学时候老师教的断句。

我/来自 /云南省/曲靖

以前是我们用自己的小脑袋来识别断句,现在是教会程序断句,我们直接调取来用就行了。

想想我们现在所调试的函数,封装起来的话也算是勉强拿的出手给别人用用的库了吧。

最后就是open(),close()与with语句。在使用open()函数的时候,一定会加一句file.close(),例如《自学是门手艺》第一部分第7章的例子:

1
2
3
f = open('test-file.txt', 'w')
print(f.name)
f.close()

因为文件用完必须被关闭,不然的话会占用系统资源,且系统同一时间能打开的文件是有限的。

因为每次都这么写都太繁琐了,所以python把这个close()函数包裹进了with语句中去,直接写:

1
2
with open(...) as f:
f.write(...)

就好了,不用再加上close()函数在结尾了。

Day9

改写了好几天的函数,对函数有了一点点更加深入的认识.今天布置的作业是要在前几天作业的基础上加上collections.Counter most_common([n])这个函数,当看到这个函数中这一行介绍时有点难过

1
2
>>> Counter('abracadabra').most_common(3)  # doctest: +SKIP
[('a', 5), ('r', 2), ('b', 2)]

意味这我前几天写的函数是一个重复啰嗦的函数,而我只要调用已经封装好的函数,我写的那几行代码完全可以删掉了。于是我原本的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import re
def stats_text_en(t_en):
if not isinstance(t_en,str):
raise ValueError('输入的不是文本格式,请重新输入:')
'''英文词频统计'''
a = t_en.replace(',','').replace('.','').replace(':','').replace(';','').replace('"','').replace('!','').replace('?','').replace('、','').replace(',','').replace('。','').replace('“','').replace('”','').replace(':','').replace(';','').replace('\n','').replace('!','').replace('?','').replace('/','').replace('*',' ').replace('--',' ')
a = a.lower()
a = re.sub("[^A-Za-z]", " ", a)
a = a.split()
b = {}
for i in a:
count = a.count(i)
r1 = {i:count}
b.update(r1)
c = sorted(b.items(),key=lambda x:x[1],reverse=True)
print('英文单词统计频率如下: \n',c)

可以精简成如下函数:

1
2
3
4
5
6
7
8
9
10
11
import collections
import re

def stats_text_en(t_en,count):
'''该函数返回一个英文单词词频统计,样式为(word,count)'''
if type(t_en) == str:
text_en = re.sub("[^A-Za-z]", " ", t_en.strip())
enlist = text_en.split()
return collections.Counter(enlist).most_common(count)
else:
raise ValueError("输入不为字符串")

还有就是几乎可以嗅到一件可怕的事,那就是我好几天就看到counter函数了,而我只要在官方文档里查查看就可以试着拿来用,而我没有,这就意味这我的“未经声明,不能引用”的内置程序启用了,得赶紧删除了。

=======

upstream/master

Day8

短跑过半了,坚持,坚持!

Day7

又是在前一天的基础上完成任务,虽然看着很简单的,但依然折腾了一天,开始是在jupyterlab上测试,老是显示错误,后面在Terimal中测试又可行。我把anaconda,jupyterlab等全部升级了一遍后不显示错误了,但还是有地方不对,因为第二个调用函数,虽然执行了结果,但会返回连个None,None.不清楚,不明了。

Day6

心得如下:

1.进行到这一部分的时候干了一件蠢事,因为一看到要做一个函数,心理比较慌,下意识的去看了下别人是怎么做的,意图参考,然后我渡过了最难过的2天。

别人的鞋不合脚呀

想了一下午才想明白,其实day6的内容早在day5就完成了一大半,我只要把day5的内容改装一下封装进day6的函数就可以了呀,真是蠢到家了,然后在1个小时内就把两个函数写出来了。

2.别人的作业也不是不可看

但要合理借鉴

我参考过两个同学的作业,一个同学写的简单,但两个函数只能单独统计。就是一个函数只能统计纯英文,另一个函数只能统计纯中文

然后是1班同学的,那叫一个复杂,直接调用了collections(集合) 和 re(正则表达式)模块,看不懂,想抄都没有办法。

我的作业本来也是两个函数分开统计纯英文或者纯中文,但我实在想改进一下,让函数能够区分中英文,在统计英文的时候去掉中文,统计中文的时候去掉英文。然后就注意到了尖子生的正则表达式。

虽然不懂,但不妨碍我拿来用。

试了一下调用正则表达式模块,果然可以用,心理高兴极了,吃饭都嫌麻烦,调试了半天。

3.我现在把这个正则表达式函数列出给大家看看,以防大家可以用到。

1
2
3
4
5
6
import re # 调用正则表达式模块
a = "simple is better than complex简单比复杂更好"
b = re.sub("[^A-Za-z]", " ", a) # re.sub(pattern, repl, string, count=0, flags=0)
c = re.sub("[A-Za-z]", "",a) # 注意A前面的^,对比下结果你应该明白这个符号是干嘛的
print(b)
print(c)

输出结果

1
2
simple is better than complex        
简单比复杂更好

另外,大家感兴趣可以根据我的学号去看看我的作业,在大作业仓库的exercises文件夹中,应该相对简单一点。

Day5

一天不敲代码,现在总觉得心里面空唠唠的。今天是清明节假期,敲代码上瘾。

这一次的收获:

1.慢下来总能对代码有所理解的,学习后面的内容总能对前面的内容有更进一步的认识和理解。

2.怕麻烦真的好费钱呀

怕麻烦的人的钱都被不怕麻烦的人赚走了

3.假期要拿来好好学习,要好总结下《自学是门手艺》第一部分的内容。

Day4

今天有点难过,任务是编一个乘法表,要求用for…in..等语句完成任务。我翻看了这一章介绍后,感觉无从下手,就像给你工具,材料,然后让你砌墙时,从来没砌过墙的你拿着工具盯着作业场地有点茫然。没有办法,还是先看看别人是怎么完成的吧。搜到几个教程,很花哨,有花式排列乘法表的,有加了制表函数,做成带框表格的。没有理那些YYJH,我还是找了个自己看得懂的慢慢琢磨。

老司机才炫技,新手还是乖乖跟着开慢车吧。

心得要点

1.for循环跟range()函数是个固定搭配,例如:

1
2
for i in range(10):
print(i)

这个表达式会列出0-9这10个数字。

2.过程中我是先照者别人的写一遍,可以执行后,我又换个参数自己慢慢写一遍,看不懂的地方我就挪挪位置,换个方式,改变下参数看看会有什么变化,以便自己可以更理解这个写法。比如最开始的乘法表我把<print ()>这一行去掉了,也能运行,但结果是没有阶梯排序的乘法表。虽然还是不理解是什么原理,但我知道了这一行的重要性。同理我把去偶数乘法表最下面的<y += 1>,和<x += 1>去掉后,引发了程序的无限循环,看来这两行也挺重要,应该是终止循环的语句。

3.在第二个去除偶数的任务中,参照了别的编程营小伙伴的作业,但觉得他们那个编写方法看不明白,我就想起了不是有break语句吗,怎么都没人用,我就自己尝试了下,写入:

1
2
if x % 2 == 0: # 如果x除以2余数为零,说明是偶数,那么就终止
break

敲入结果一看,果然把左边的偶数干掉了,不禁有点小开心,貌似是比小伙伴们找到了个更好的解决方案。

Day3

今天的课程是要编写一个计算器,如果说前两天是带你认识工具的话,今天直接就要你用工具做出一个产品来了。画风不对呀,虽然有说明书,但怎么感觉中间少了n个要学的东西,懵了。

还好我们有“老师”–“谷歌,必应”,大作业仓库,厚着脸皮先看看尖子生是怎么写的,再把别人的计算器“拆了”,自己组装一下。

看了下别人的程序实现,有超级复杂的,调用了tkinter模块,直接输出了一个计算机可视化界面,跟win上的类似;也有超级简单的,只调用了int(),input(),print()函数利用if语句就实现了;也有隔壁的尖子生,直接定义函数实现的。

我照着最简单的方法敲了个最简单的计算器,不仅有“加、减、乘、除法”,我自己加上了“幂、余”都能实现,然后我发现原代码不支持小数计算,翻看了一下函数那章,换了个float()浮点数函数就可以实现小数运算了,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# float()支持小数运算
# 如果用int()函数的话就只支持输入整数
# input()接收键盘输入

a=float(input('请输入数值1'))
b=input('请输入运算符号')
c=float(input('请输入数值2'))
if b=="+":
print(a+c)
elif b=="-":
print(a-c)
elif b=="*":
print(a*c)
elif b=="/":
print(a/c)
elif b=="**":
print(a**c)
elif b=="%":
print(a%c)

然后我试了试第二种方法,也是可以用的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
choice = float(input('请选择运算: \n1.加\n2.减\n3.乘\n4.除\n5.幂\n6.余\n请选择你的算法: '))
num1 = float(input('请输入第一个数: '))
num2 = float(input('请输入第二个数: '))
if choice == 1:
print('{} + {} = {}'.format(num1, num2 ,num1+num2))
elif choice == 2:
print('{} - {} = {}'.format(num1, num2 ,num1-num2))
elif choice == 3:
print('{} *{} = {}'.format(num1, num2 ,num1*num2))
elif choice == 4:
print('{} / {} = {}'.format(num1, num2 ,num1/num2))
elif choice == 5:
print('{} ** {} = {}'.format(num1, num2 ,num1**num2))
elif choice == 6:
print('{} % {} = {}'.format(num1, num2 ,num1%num2))

以用带练,多学多用!

DAY2

今天在运行hello world程序的时候踩了个莫名其妙的坑,那就是输入print函数括号里面的点符号踩的坑。我开始输入的是esc下面那个`,因为为看着别人好像也是输入的这个,然后程序一直报错,我快疯了,后面换了”才没有报错,最后我才发现是这个’(“不用shift的’)。

建立hello_world.py文件的方法有三种:

1.在vscode中可以直接通过点击建立。

2.通过终端建立,在cd 文件夹后,输入

1
2
touch hello_world.py
`

这个方法在windows中会报告错误,没找到解决方案,我是在电脑上用virtualbox安装了ubuntu系统然后在Ubuntu系统中的终端上实现的。

3.直接在jupyterlab中建立一个hello_world.ipyb文件。

执行hello_world.py的方法有三种:

1.打开终端,cd打开hello_world.py程序所在的文件夹,执行

1
python hello_world.py

可以看到输出结果

2.在vscode中右键单击hello_world.py再点击在终端中运行也可以看到输出结果

3.在jupyterlab中直接shift+enter,也可以直接看到输出结果。

DAY1

今天进行了自学营的第一次训练,本来以为自己已经早就熟练掌握了github的创建仓库,提交更改之类的,但是今天发现自己仍然只是知道一部分。参加自学营前参加了刘娟娟的”you can you up,no bb”以为自己闯过了第一关,守关人跟我说你并没通过的时候,我理直气壮的跟他说,我完成了呀。守关人并没有说什么,让我去了第二关,今天才知道我真的是没有通过,人家一看截图,没有分支,没有commit,真是懒得理我。学习真的是切记骄傲啊。