麻省理工公开课《计算机科学及编程导论》中文笔记(第3讲)作者:@易枭寒
第三讲: Common code patterns_ iterative programs
回顾:
已经讲了
一、数据
数据类型:数字、字符串、布尔型
二、运算:加,减,乘,除,取模等,布尔型运算(and, or, not )
三、语句(命令):
1、赋值语句:如何将变量名与数据值绑定。例如,mystring = 'hello'
2、输入和输出语句。例如,用作输出的print,和用作输入的 raw_input。
3、条件语句(分支语句):用来控制我们所建立的一系列指令的流程
4、循环语句:例如,while
良好的编程风格:
1、写注释
2、类型规定:使用运算符时记得检验运算对象的类型,以保证程序得到想要的结果
3、变量名的命名规则:小写,下划线
4、检验代码中的所有分支:对于条件语句,始终记得检验分支所有可能情况,保证结果是我们要的
解决循环问题的步骤:
首先,选一个变量用作计数。需要确定每次执行循环时,必须存在某个变化的变量,用来对循环过程进行计数。
其次,赋初值。赋初值必须在循环外发生,必须在循环体的外面。
再次,需要设定合适的循环终止判别。让程序知道循环该何时结束,显然,该判别必须包含计数变量否则没有意义,必须包含计数变量。因为计数变量就是用来描述循环的。
最后,编写代码块。
强调,循环内必须包含变量值的改变,如果计数变量都不变的话,结果就会得到无限循环。循环完做什么。
流程图(长方形表示开始,赋值。菱形判断,箭头Yes OR No。平行四边形,打印结果)
再画一个求奇数偶数的流程图
# 求完全平方数的平方根
x = 16
ans = 0
while ans*ans <= x: #改成只有小于号
ans = ans + 1
print ans
#打印奇数,偶数
if (x/2)*2 == x:
print '偶Even'
else :
print '奇odd'
#注意观察终止判别和计数变量的变化
x = 1515361
ans = 0
if x >= 0:
while ans*ans < x:
ans = ans +1
print 'ans = ',ans
if ans*ans != x:
print x,' 不是完全平方数'
else: print ans
else: print x,' 是负数'
防御式编程:保证遍历了代码中的所有分支,保证对每个分支,
打印或返回的结果有意义。保证所有可能的输入数据都能对应一个分支。
并且不会产生错误或无限循环。
穷举:
穷举表示逐个判别计算中某元素、某参数所有可能值,
检验一切可能,直到找到正确答案。
即:尝试所有合理的值,直到找到答案
#求某整数的约数
#--coding:utf-8--
x = 10
i = 1
while i
if x%i == 0:
print '约数',i
i= i+1
for循环(for loop):
#--coding:utf-8--
x = 10
for i in range(1,x):
if x%i == 0:
print '约数',i
x = 1515361
if x>= 0:
for ans in range(1,x):
if ans*ans == x:
print ans
break
元组:
(有序元素。不可变的。小括号。索引下标从0开始。负数索引表示从右边开始。切片操作)
>>> test = (1, 2, 3, 4)
>>> test
(1, 2, 3, 4)
>>> test[0]
1
>>> test[-1]
4
>>> test[0:3]
(1, 2, 3)
>>>
x = 100
divisors = ( ) #约数。空元组
for i in range(1, x):
if x%i == 0:
divisors = divisors + (i, ) #单个元组需要加逗号,此处操作符重载了哦。
字符串:
字符的序列。可以用元组相同的操作。索引、切片等。
>>> str = "abcdefg"
>>> str2= "hijklmn"
>>> str + str2
'abcdefghijklmn'
>>> str[0]
'a'
>>> str[2:4]
'cd'
>>> str[:5]
'abcde'
>>> str[-1]
'g'
>>>
sumDigits = 0
for c in str(1952): #str()将数字转换为字符串
sumDigits += int(c)
print sumDigits
s1 = 'abcdefg'
s2 = 'hijklmn'
print s1 + s2
print s1
print s1[0]
print s1[3]
print s1[-1]
print s1[2:4]
print s1[:3]
print s1[3:]
print s1.find('cde')
print s1 == s1
print s1 == s2
print s1 < s2
print s1 > s2