论抽象思维

所谓抽象思维,就是把一个问题变成很多问题。

为什么我们希望把一个问题变成很多问题?难道是因为我们太闲么?
因为现实世界是不断变化的。

一个问题

你的朋友找你帮忙写个程序,计算5的阶乘是多少。于是你写了这样一个代码给他。

# 这是解决一个问题的代码
def getAnswer():
    a= 1
    for i in range(5):
        a*=(i+1)
    return a

print(getAnswer())

或者为了方便你的朋友使用,你把它做成了一个窗口界面的程序。

from tkinter import *

def getAnswer():
    a= 1
    for i in range(5):
        a*=(i+1)
    return a

root= Tk()
Label(root, text=str(getAnswer())).pack()
root.mainloop()

运行效果如下(只是简单地显示结果):
在这里插入图片描述
这真是彻底的一事一议。

很多问题

然后你无意中问他,你确定只算5的阶乘么?发现他不能确定,你就只好把这一个问题变成很多(无数个)问题。写一个能够计算任何数字阶乘的程序。然后给他一个传入数字作为参数并启动计算的方法。

from tkinter import *

def getAnswer(n):
    a= 1
    for i in range(n):
        a*=(i+1)
    return a
def calc():
    a= int(entry.get())
    b= getAnswer(a)
    lb['text']= str(b)

root= Tk()
entry=Entry(root)
entry.grid(column=1, row=1)
Button(root, text='计算', command=calc).grid(column=2, row=1)
lb= Label(root, text='等待计算')
lb.grid(column=1, row=2)
root.mainloop()

运行效果如下(输入数字,点击按钮进行计算):
在这里插入图片描述
界面的复杂度增加我们暂且不论,核心的计算函数是getAnswer,略有变化而已。
我们注意到,在这里,设计程序是程序员的工作,而传入参数,实际只是用户的工作。

虽然这个例子非常简单,但已经初步了展示了何为抽象思维。
让我们继续看。

两个问题

你的程序帮了朋友很大的忙,现在他回来找你希望修改一下程序,增加一个功能,计算从1到100的累加和。
有了抽象思维,你肯定不会只写一个如此局限的1到100的累加,经过询问你的朋友,你发现这个问题可以扩展为很多问题:计算从1到任何数的累加和。
于是你修改了代码,增加了功能。

from tkinter import *

def getAnswer1(n):
    a= 1
    for i in range(n):
        a*=(i+1)
    return a

def getAnswer2(n):
    a= 0
    for i in range(n):
        a+=(i+1)
    return a

def calc1():
    a= int(entry1.get())
    b= getAnswer(a)
    lb['text']= str(b)

def calc2():
    a= int(entry2.get())
    b= getAnswer2(a)
    lb['text']= str(b)

root= Tk()
entry1=Entry(root)
entry1.grid(column=1, row=1)
Button(root, text='计算阶乘', command=calc1).grid(column=2, row=1)
entry2=Entry(root)
entry2.grid(column=1, row=2)
Button(root, text='计算累加', command=calc2).grid(column=2, row=2)
lb= Label(root, text='等待计算')
lb.grid(column=1, row=3)
root.mainloop()

运行效果如下(有两个可计算的按钮):
在这里插入图片描述

更多问题

如果你仔细看这次的代码,或许你已经感觉到不满意。因为有明显的重复。所以,当你的朋友跟你说需求又有了变化,希望你没有感到意外:其实有时不仅仅是求和,还有求平方和的需求。
我们已经把两个问题抽象为了两倍的很多问题,但第三个问题的出现告诉我们,显然还是不够的,我们必须进一步抽象。让这三个问题在某个更为广大的视角中融合为一大类问题。(所谓的统一力场似乎就是在干这样的事)
你和朋友约定,给他两个输入参数,第一个是数字N,软件的计算范围就是从1到N。第二个参数,输入一个公式。
阶乘:x* y
累加:x+ y
平方和:x+ y** 2
以后如果还有立方和:x+ y** 3
等等,规律是想计算累计和,就在x与y之间用+,想计算累计积,就在x与y之间用*,想对数字做什么转换处理,都对y进行。代码如下:

from tkinter import *
from functools import reduce

def getAnswer(n, f):
    a= reduce(f, range(1, n+1))
    return a

def calc():
    a= int(entry.get())
    strFunc= entryFunc.get()
    f= eval('lambda x, y: '+ strFunc)
    b= getAnswer(a, f)
    lb['text']= str(b)


root= Tk()
Label(root, text='输入计算数').grid(column=1, row=1)
entry=Entry(root)
entry.grid(column=2, row=1)
Label(root, text='输入计算公式').grid(column=1, row=2)
entryFunc=Entry(root)
entryFunc.grid(column=2, row=2)
Button(root, text='通用计算', command=calc).grid(column=2, row=3)
lb= Label(root, text='等待计算')
lb.grid(column=1, row=3)
root.mainloop()

运行效果:
在这里插入图片描述
在这个抽象级别上,用户不得不承担更多的参数输入,而且必须对计算公式有所了解才行。

扫描二维码关注公众号,回复: 11348851 查看本文章

抽象的极限

这个活动还可以继续下去,可以预见,如果你的朋友持续提出更复杂的需求,为了保持灵活性,他就必须掌握更多的知识。最后,为了得到终极的灵活性,恐怕得把整个python交给他才行。在编程语言层面上,我们可以说,所有的问题都是一类问题:编程问题。这种做法,堪称万事一议。

所以,抽象的极限就是图灵机

终极的抽象,也可以说是平凡的抽象。因为这种抽象程度,对我们没有实质的帮助。真正有意义的抽象思维,则置于一事一议与万事一议之间。

猜你喜欢

转载自blog.csdn.net/xiaorang/article/details/105766169