最近恰逢过年期间,聚会太多,还有论文以及笔者年后的实习培训,时隔几天,笔者终于在第一天更文之后,继续写第二篇了。
打算写这个,主要是想记录自己从0到1的过程,欢迎拍砖。
part one 思考部分
笔者觉得编程的过程可以形容成做菜,都要遵循一定的规律来创造价值。数据就是原材料,语句和功能就是做饭的过程,最后实现了什么需求或者解决什么问题,就是做成了一道什么菜。
层次一(原材料):数据(数据类型及数据结构)
既然做饭的原材料有鸡鸭鱼肉,那么在python中,笔者把数据的相关知识分为三类,数字,字符串以及数据结构。
其中数字分为三种(浮点、整型、复数)。基本的数据结构又分为四种(字典、集合、列表、元祖)。
‘原材料’的数据具体知识,请自行百度~传送门在这里
层次二(切菜、洗菜):数据运算以及语句(循环语句与条件控制)
针对数据以及数据结构,有相同的学习结构,都是加减乘除。
层次三(做饭的过程):编程思维——设计出解决问题的思维,映射在代码世界里。
在拿到实际应用场景或者一个问题,作为新手,一开始画出流程图应该是一个不错的方法。
层次四(调料及火候):功能(方法及函数)
def function(arg1,arg2) :
return 'someting'
函数一般适用于经常出现的某种需求,可以把它的解决方法封装起来,当作一种方法,需要的时候,就调用。
numpy以及pandas基础
其中pandas的绘图基础知识:
有关的库是matplotlib。
dataframe的数据结构,index将作为X轴,Y轴自己选取,即可画出简单的图。
import matplotlib as plt
from matplotlib import style
style.use('某格式')#选择格式
df['cloumns1'.plot()
plt.show()
#df.plot()绘制整个数据帧
#plt.show()
适合具有python基础的人,进阶的pandas教程。(传送门在此)
part two 行动部分
笔者在把教程的每一句代码,都打一遍之后,然后在想一个问题,为什么跟着教程的代码,打一遍,在碰到一个问题的时候,我还是毫无头绪?
发现原因有二:(1)常用方法及函数不熟悉(2)设计解决问题的思维能力欠缺,即解决问题在代码世界,映射的流程图,无法画出。
例如,这道题。
设计一个小游戏猜大小。游戏开始,首先玩家选择 Big or Small(押大小),选择完成后开始摇三个骰子计算总值,11 <= 总值 <=18 为 “大”,3 <= 总值 <= 10 为 “小”。然后告诉玩家猜对或是猜错的结果。
我看到这道题后,第一直觉是好麻烦,不想做。。然后开始画流程图。
我的流程图,其实并不准确,第二阶段准确的说应该是将色子总数转化成大小。因为让用户判断大小,是在第三阶段让计算机做的事情。计算机需要把数字总和转化成游戏规则的“大”或者“小”。
首先,第一个和第二个步骤是可以封装成函数的,第三阶段调用。
在摇色子的第一个阶段,这件事情的核心是——随机生成三次(1,6)的数字,再求和。
import
第二阶段,这件事情的核心是——判断三次总和处于哪个区间。
def result(total):
if total>=11 and total <=18:
return 'Big'
elif total>=3 and total<=10:
return 'Small'
第三阶段,这件事情的核心是——判断用户是否猜中,以及在什么位置调用之前的函数?
在第三阶段计算机正确的做法是:
(1)让用户输入是大是小
(2)随机生成三个数
()判断大小是否正确,用户赢或者输
#从第一步开始
print(<<<game start>>>)
chioce = [Big,Small]
your_chioce = input('输入你的选择:' )
#第一步结束
if yourchioce in chioce :
number = yaoyiyao()#调用函数,开始生成三个数
numbers = sum(number)
win = your_chioce == result(total)#调用函数,判断选择是否等于点数区间。
if win:
print('You win!')
else:
print('You lose')
else:
print('Invalid Words')
#这个也可以封装成一个函数。
这是笔者动手画出流程图的第一个编程,另外笔者的另一个作业,也发现一个问题。
题目如下。
我们在注册应用的时候,常常使用手机号作为账户名,在短信验证之前一般都会检验号码的真实性,如果是不存在的号码就不会发送验证码。检验规则如下:
(1)长度不少于11位;
(2)是移动、联通、电信号段中的一个电话号码;
(3)因为是输入号码界面,输入除号码外其他字符的可能性可以忽略;
移动号段,联通号段,电信号段如下:
CN_mobile = [134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705]
CN_union = [130,131,132,155,156,185,186,145,176,1709]
CN_telecom = [133,153,180,181,189,177,1700]
很明显,这个问题需要用到字符串切割(取前三位),if判断语句。
笔者当时觉得不需要用到while语句,代码敲完之后,发现需求也能实现。但是笔者忽略了一件事情,就是if语句需要判断三次,但是不能使用elif,因为这三次不是递进关系,而是并列关系,是需要同时进行的。
而三个if语句需要同时进行,三个if,最后一个else。这个else语句只会负责最后一个if语句,也就是说,如果输入的数字,判断出来是在前两个情况的话,最后一个if—else语句中的else也会打印出来,这样就不符合逻辑了。
因此需要用到while语句,我们需要用到break,在每一个if语句后面都跳出,就不会让if循环一直进行下去,而多打印出一个else语句。
————
这几天的学习问题:一旦陷入学习后,就想要把每一个概念都理解清楚。所以等到了numpy的时候,笔者又陷进去了,学起了线性代数、时间序列以及矩阵运算。。。但是笔者的当务之急只是赶紧熟悉pandas,然后在具体情境中迅速上手,分析数据。。
因为知识无法运用,只会迅速遗忘。
所以,接下来笔者的方向,是直接上手操作题目,在题目中总结。
(题目来自公众号:印客美学、这个小文章的参考资料有麻瓜编程,三天搞定python基础,链接见上一篇文章。)