前言 -> 计算思维
四要素
- 分解:把数据、过程或问题分解成更小的、易于管理或解决的部分
- 模式识别:观察数据的模式、趋势和规律
- 抽象:识别模式形成背后的一般原理
- 算法开发:为解决某一类问题撰写一系列详细的指令
什么是编程
很简单,编程(programming)就是告诉计算机要做什么。计算机只是一些没有生命的机器,它们自己可不知道该做什么,一切都得你来告诉它,而且你还必须把细节都说清楚。不过不要忘了,一定要自己动手试一试,如果只是纸上谈兵,只看不做,你就无法感受到程序成功运行那一刻的快乐和成就感。
什么是算法
算法就是计算或者解决问题的步骤。我们可以把它想象成食谱。要想做出特定的料理,就要遵循食谱上的步骤;同理,要想用计算机解决特定的问题,就要遵循算法。这里所说的特定问题多种多样,比如“将随意排列的数字按从小到大的顺序重新排列”,“寻找出发点到目的地的最短路径”,等等。
课程导学
面向编程零基础的Python语言入门课程,以引导学员自主思考为核心思想,不“念使用说明书”式的灌输型教学。鼓励学员勤动手,尝试多种可能性,进而推导出一般性规律,总结经验,掌握创造‘轮子’的能力。
本课程不教什么
由于 Python
语言的语法,非常接近自然语言的语法,所以市面上充斥着大量的《Python:从入门到精通》、《2小时学会Python》等等。此类课程更像是一场电影,听的时候什么能都听懂,内容非常精彩,但过后什么不记得。准确的说本质上什么都没有学会,仅仅是了解了世界上有一种开发语言,语法易懂,上手容易。
Python的语法简单易学,2小时从入门到“精通”后,大部分网络课程,就开始百科全书式的罗列常用模块,以及常用类中提供的各种“魔法”方法。在我们看来,这样跟通读Python官方文档,没有任何本质上的区别。
>>> la = [1, 2, 3, 4, 5, 6]
>>> lb = la[::-1]
>>> lb
[6, 5, 4, 3, 2, 1]
简单的一个操作 la[::-1]
,得到倒序排列的数组 [6, 5, 4, 3, 2, 1]
,厉害吧?不,这仅仅是Python为我们提供了很多便捷的“操作”而已。这个操作很“厉害”,但学员并不一定厉害,真正掌握了背后的处理原理,甚至自己写出一套更加便捷的处理程序,才算是真正的“厉害”。
本课程不教:语法“糖”,不罗列“魔法”方法,不百科全书式的念文档、举例子、展示执行结果。
本课程教什么
会说话吗?会看懂220个基本的 Sight Words 吗?那么你一定能看懂绝大部分 Python
语句,剩下看不懂的怎么办?预测 -> 执行 -> 验证 -> 学习 -> 掌握
预测至上
编程是一门互动性非常强的课程,绝对不是老师在上面讲,学生在下面听就能学好的。
以学员为中心,自己推导出来的结论,印象才更深刻,理解才更透彻。世界上有非常多种编程语言,Python仅仅是几十种主流编程语言中的一种。所以掌握Python的编程语法是远远不够的,更重要的是掌握编程这件事背后的思维方式:计算思维。
Python恰巧是我们学习这种思维方式的一种介质,所以本课程会弱化编程语言的概念,逐步强化计算思维这种新的思维方式,也是本课程设立的初衷。
不“乱”猜答案
根据下面的代码:
>>> print('Hello World')
Hello World
>>>
预测,下面的一段代码,会发生什么?
>>> name = "Pitt"
>>> print('Hello' + name)
稍微变更一下代码,又会发生什么呢?
>>> print('Hello', name)
预测不是“瞎”猜。预测是“合理”推断,合哪个理呢?不管哪个理,有个理就行,有理就不是瞎猜,不管此理正确与否。在初始阶段,合自己的理就行,如果预测对了,会进一步强化自己的理,如果预测错了,学会一步步调整自己的理,直至预测正确。
实际上,机器学习大体上也就是这么个过程,机器学习的优势在大数据,样本多,调整快,但本质上机器并不懂为什么,也就是机器是依靠大力出奇迹。我们的优势在于,能搞明白为什么,进而有目的,有方向的调整,以达到更好的结果。
那么上面的两段代码会有什么样的输出呢,你预测到了吗?
HelloPitt
>>>
Hello Pitt
>>>
再来几个例子:
age = 15
if age >= 18:
print("You're old enough to buy a ticket for this film.")
else:
print(f"You'll be old enough in {18 - age} years")
favorite_foods = ["Sushi", "Apple", "Mango", "Pizza", "Chicken"]
print(favorite_foods[2])
print(favorite_foods[10])
IPO: 输入、处理、输出
本课程教:推理能力,创造轮子(module)的能力。
三个小程序 -> 观察
两种编程方式
- 交互式:对每个输入语句即时运行结果,适合语法练习
- 文件式:批量执行一组语句并运行结果,编程的主要方式
#CalCircle.py
r = 25
area = 3.1415 * r * r
print(area)
print("{:.2f}".format(area))
import turtle
turtle.pensize(2)
turtle.circle(10)
turtle.circle(40)
turtle.circle(80)
turtle.circle(160)
蟒蛇绘制 -> 模仿
问题分析
算法设计
实例编写
举一反三
绘图体系 -> 模块
turtle库
画布
画笔
太阳系背景 -> 数据类型
整数
浮点数
random库
时间弧度转换 -> 语法元素
import math
def tan(a):
assert len(a) == 3, 'invalid params'
h = a[2]
m = a[1]
s = a[0]
#first convert a to hours in decimals
hours = h + m * 1/60 + s * 1/3600
print('the hours: ', hours)
#Then, multiplying by 30, obtain the degree
degree = 30 * hours
print('the degree: ', degree)
#Multiplying the degree by 𝜋/180 gives a in radians
radians = degree * (2*math.pi) / 360
print('the radians:', radians)
tana = math.tan(radians)
print('the tan𝜶: ', tana)
return tana
#ta = tan([9, 15, 55.8])
ta = tan([25, 33, 6])
print(ta)
缩进
变量
注释
猜数字 -> 算法设计
'''
写一个程序,随机设定一个数字,让用户猜测,并给出猜测结果提示(偏大/偏小/相等)。有6次猜测机会,如果6次之内猜中或者6次以上未猜中,则游戏结束。
'''
import random
'''步骤一
x = random.randint(1, 100)
guess = int(input('please guess a number: '))
if guess > x:
print('too big')
elif guess < x:
print('too small')
else:
print('you got it!')
'''
'''步骤二
for i in range(100):
got = True/False
if got:
print('good game')
break
if i >= 6:
print('game over')
print('the dice num was: ', dice)
break
'''
dice = random.randint(1, 100)
#有6次机会,如果6次之内或者6次以上,则游戏结束。
for i in range(100):
guess = int(input('please guess a number: '))
got = guessTheDice(guess, dice)
if got:
print('good game')
break
if i >= 6:
print('game over')
print('the dice num was: ', dice)
break
pass
def guessTheDice(guess, x):
got = False
if guess > x:
print('too big')
got = False
elif guess < x:
print('too small')
got = False
else:
print('you got it!')
got = True
return got
分支语句
输入
输出
八大行星 -> 程序控制
'''
写一个程序,利用循环语句,由近及远,输出太阳系中八大行星的名称。
'''
# for N in '水金地火木土天海':
# print(N)
# print()
'''
写一个程序,利用循环控制语句,由近及远,1)输出太阳系中,除地球之外的行星名称。2)输出地球之前的行星名称。3)输出地球之后的行星名称。
'''
''' 3)
for N in '水金地火木土天海':
if N == '水':
continue
elif N == '金':
continue
elif N == '地':
continue
else:
print(N)
print()
for N in '水金地火木土天海':
if N == '水' or N == '金' or N == '地':
continue
print(N)
print()
for N in '水金地火木土天海':
if N in '水金地':
continue
print(N)
print()
planets = '水金地火木土天海'
for i in range(len(planets)):
if i < 3:
continue
print(planets[i])
print()
'''
''' 2)
for N in '水金地火木土天海':
if N == '地':
continue
print(N)
print()
'''
''' 1)
for N in '水金地火木土天海':
if N == '地':
break
print(N)
print()
'''