Skip to content

Latest commit

 

History

History
345 lines (305 loc) · 15.5 KB

File metadata and controls

345 lines (305 loc) · 15.5 KB

2.主任务:由用户从键盘给定任意正整数n,打印1+2+3+...n的和
2.1 任务分析
这个问题是多个整型数的加法运算(暂不考虑用等差数列的求和公式来计算),首先需要解决如下两个问题:

  • 如何让用户从键盘给定任意整数?
  • 如何实现两个及多个整数的加法运算?

随后,我们注意到,实际上程序在运行前并不知道用户将要输入整数n的具体数值,并且因此也不知道实际会有几个整数相加,只有用户输入以后才能得到具体数值。这种情况下,任务应该如何完成?

2.2 数学运算

  • 键入如下代码片段,按下Alt+enter执行,并观察执行结果。
print(1+2)
print(5+6+7+8+9+10)

可以看到,对2个整数或多个整数的加法运算,可以直接被运算出来,并可由print()函数打印到显示器上。

  • 键入如下代码并观察执行结果。
print(8-100+20*5)
print(3.142*8)
print((973*863+985*211)/2011)

通过各种数学运算符号及括号的组合称为算数表达式可以利用各种算数表达式,通过python把计算机作为一台计算器来使用。

  • 键入如下代码并观察执行结果。
print(1+2+3+4+n)

结果可能会出乎读者预料(但不出作者预料,笑),jupyter notebook运行结果中给出多行英文。实际上,代码运行出现了错误,这些结果就是出错提示。结果中重复了我们上面键入的代码,表示这条语句SyntaxError: invalid syntax,意思是语法错误。 句法错误是什么?好复杂,不过暂时先不用去考虑那么多,我们知道出错了,但是我们只是命令计算机把一些整数相加并打印到屏幕而已啊? 仔细审视一下这行代码,在括号内部1+2+3+4应该没有问题,但是后面的+n中,n只有两种可能,字符串或者数字,如果这里的n是字符串,则数字与字符串相加我们暂时还没有定义;如果是一个数字,则数字n还没有具体的值,无法进行计算,因此计算机给出错误的提示是非常合理的。
2.3 变量与赋值

  • 键入如下代码并观察执行结果。
n=2
n=5
m=7.2
print(1+2+3+4+n)
print(1+2+3+4-m)

代码解析:

  • nm,由于其值可以被改变,因此叫做变量
  • n=5m=7.2都叫做赋值语句,该语句命令计算机将=右侧的赋值给左侧变量,赋值后变量的值就与右侧的数值相等。
  • =为赋值运算符。
    我们先尝试计算从1加到100的值。
  • 键入如下代码并观察执行结果。
n=100
print(1+2+3+4+5+...n)

上述代码仍然会得到语法错误的提示。...并非运算符,...n也非数值,这段代码并不能让计算机推理出...要表达的含义。

  • 键入如下代码并观察执行结果。
x1=1
x2=1+x1
x3=1+x2
x4=1+x3
...
x100=1+x99
print(x100)

与前类似,结果依旧是语法错误。我们必须用计算机能够通过程序语言理解的方式,也即是说,所用代码必须严格限定在程序语言所规定的词汇与语法之中。 虽然上述两次尝试均告失败,但我们也并非一无所获,如果我们真的把所有100个数字在一行加起来,或者写100行依次相加的代码,一定能够得到从1加到100的正确计算结果(确有学生在考试时对1加到100用类似方法作答),但这种重复劳动确实过于无聊。 对这类重复劳动,python语言引入循环来解决。在正式介绍while循环之前,我们先:

  • 键入如下代码并观察执行结果。
n=0
n=n+1
print(n)
n=n+2
print(n)
n=n+3
print(n)

结果是否再次出乎预料?对上述明显错误的数学等式程序居然没有给出任何XXXError的结果。事实上,上述代码中带有=的三条语句其实是三个赋值语句二并非数学的等式,因为在python语言中,=是赋值符号。n=n+1的含义其实是将n+1的值赋给n,这行语句执行后的结果是,n比之前增加了1,这种运算也称为自加运算
2.4 while循环、缩进与代码块

  • 键入如下代码并观察执行结果。
n=7
i=0
while i<n:
    i=i+1       #注意,i前面须敲4次空格
    print(i)    #注意,print前面须敲4次空格

由结果可知,这段代码能够得到从1到7之间的所有整数。本段代码中:

  • #注释符号#之后的同行文字,是对代码加以解释说明的,python并不执行。
  • 4个空格是python语言的代码缩进,用来来划分程序层次(注意,须是1恰好4个空格)。
  • i=i+1print(i)是连续两行,且缩进相同,因此属于同一层次,属于同一层次的一或多行代码称为代码块。处在循环内部层次的代码块被称为循环体
  • 为了能够程序能够循环往复执行,python语言使用单词while命令程序开始循环,陆续还会接触到一些类似while这样的单词,这些单词比较正式的名称为:关键字2
  • <是一个比较运算符i<n是一种条件表达式,条件表达式多通过比较运算符来构造,更多条件表达式的内容后续将陆续介绍;比较运算后的结果称为比较表达式的值,只有两种可能值:True或者False,即或者。True与False被称为逻辑值,表达逻辑值的变量类型称为逻辑类型。比较运算符两端的对象类型必须一致才可以比较,键入如下代码并观察执行结果。
print(10>5)             #正确执行,打印True
print(10<1.1)           #正确执行,打印False
flag=False              #flag为逻辑类型的变量,值为False
print(flag)             #正确执行
print(10<'example')     #类型不同,语法错误
  • while循环的基本语法如下(此处以后画框图,或者手绘):
while 条件表达式:
    循环体(语句块)

while条件表达式:循环体三者构成了完整的while循环结构。程序运行到while语句时,如果条件表达式的值为False),不执行循环体,程序将从循环体下一行(即退出这个循环结构)开始继续执行。否则条件表达式的值为True,程序将执行循环体代码,且循环体代码全部执行完毕后,将重新回转到while语句,重新计算条件表达式,根据条件表达式的值,来决定下一步(再次执行循环体或者退出循环)。

  • 键入如下代码并观察执行结果。
n=100
i=0
total=0
while i<n:          #注意条件表达式中的i随循环每次在变化
    i=i+1
    total=total+i
print(total)

OK,理论上我们已经能够用python编程计算出从1加到任意整数n的和,循环结构其实是程序最强大的武器,这台计算器也随着循环的引入变得十分强大。接下来,只要将本段程序中的第一行n=100n的值改为由键盘读入就可以完满解决任务2了。

2.5 从键盘获得输入与类型转换

  • 键入如下代码并执行。
n=input()
print(n)
  • 在提示框中键入100并回车,观察程序运行结果。再次执行这段程序,在提示框中键入hello并回车,观察程序运行结果。

input()函数从键盘接受输入,以回车作为输入结束,键盘输入的所有字符均被视为字符串,该字符串作为input()函数的值,如果输入100,则input()的值就是字符串100,如果输入hello,则input()的值就是字符串hello

  • 键入如下代码并执行。
n=input()
print(n+100)
  • 在提示框中键入100并回车,观察程序运行结果。

程序运行结果提示TypeError,表示类型错误,程序认为我们在提示框中输入的100是字符串,而字符串与数字相加没有定义,我们需要在程序中,将字符串'100'转换为整型数100

  • 键入如下代码并执行。
n=input()
n=int(n)    #将n从字符串转换成整型
print(n+100)
  • 在提示框中键入100并回车,观察程序运行结果。
  • int()函数可将其括号内部的对象转换为整型。注意并非所有对象均可直接转为整型。键入如下代码并观察执行结果。
int('4078')     #可以
int(4078)       #可以
int(407.8)      #可以
int('hello')    #不可以

OK,我们已经能够从键盘获得输入n,并转换为可以进行数值运算的整型。
2.6 拓展与总结

  • 常用数学运算符。键入如下代码(注释可不键入)并观察执行结果。
print(4+6)      #运算符:'+'。功能:加法。结果:10
print(3.5-2)    #运算符:'-',功能:减法。结果:1.5
print(9*9)      #运算符:'*',功能:乘法。结果:81
print(5/2)      #运算符:'/',功能:除法。结果:2.5
print(5**3)     #运算符:'**',功能:乘幂。结果:125
print(5//2)     #运算符:'//',功能:整除(舍去小数部分)。结果:2
print(7%3)      #运算符:'%',功能:求余数(模)。结果:1

各种数学运算符有一定优先级的,比如先乘除后加减等。具体优先级的顺序,请参见附录XXX优先级表,这个表一般很少翻看,因为我们总可以利用小括号来保证运算次序与我们期望的一致。

  • 变量类型。python语言中,变量的类型在赋值时被确定,取决于赋值运算符右侧对象的类型。已经介绍的有整型、浮点型及字符串类型,更多类型将在后续章节陆续介绍。
  • 变量的命名。虽然程序中,同一个变量其不同的名字,一般不影响程序的运行结果,但是变量命名必须合法。此外,变量名有好坏之分,好的变量名可以让人更容易理解程序。变量命名的详细介绍请参考https://www.python.org/dev/peps/pep-0008/。以下列出几条重要规则(其中前三条是保证变量合法性,必须遵守):
  • 变量名只能含有数字、字母和下划线
  • 数字不能是第一个字符;
  • 不能用python的关键字给变量命名;
  • 选择能够清晰明了描述变量用途的名字;
  • 不要太长;
  • 命名习惯前后保持一致。
  • 空格使用。良好的空格使用可以使程序易读性更好。除了每行的开始以外,语句代码内部各种对象如运算符、变量、数值、字符串及关键字等的两侧插入空格均为合法,不影响程序执行。注意,由于python语言利用空格来划分程序层次,因此行首空格不能随意添加或减少。键入如下代码(注释可不键入)并观察执行结果。
n=10
  n=10      #对齐错误`IndentationError`
  • 自更新运算。除了已经介绍的自加运算外,python还有自减、自乘及自除等运算,还可以将运算符与赋值操作合并来简化代码。键入如下代码(注释可不键入)并观察执行结果。
i = 0
i = i + 1       #自加运算
print(i)
i = 0
i += 1          #自加运算与赋值合并
print(i)
i = 0
i = i - 1       #自减运算
print(i)
i = 0
i -= 1          #自减运算与赋值合并
print(i)
i = 10
i = i * 10      #自乘运算
print(i)
i = 10
i *= 10         #自乘运算与赋值合并
print(i)
i = 10
i = i / 10      #自除运算
print(i)
i = 10
i /= 10         #自除运算与赋值合并
print(i)
i = 10
i = i % 3       #自求余运算
print(i)
i = 10
i %= 3         #自求余运算与赋值合并
print(i)
i = 10
i = i // 3     #自整除运算
print(i)
i = 10
i //= 3        #自整除运算与赋值合并
print(i)
i = 10
i = i ** 3     #自乘幂运算
print(i)
i = 10
i **= 3        #自乘幂运算与赋值合并
print(i)
  • 空行与注释。为使程序更易懂易读,除了养成良好的变量命名习惯外,还需要多利用空行与注释。空行是为了使逻辑不十分紧密的代码分割,python并不执行空行。python语言的注释除了以#为开头的单行注释以外,还存在多行注释。键入如下代码并观察执行结果。
'''
这是一段注释
作为多行注释的示例
也是含有空行程序的示例
'''
i = 10
i = i ** 3    
print(i)

i = 10
i **= 3       
print(i)
  • 比较运算符。python提供了多个比较运算符。键入如下代码(注释可不键入)并观察执行结果。
print(10 == 10)       #运算符:'=='。说明:等于。表达式值:True
print(10 != 10)       #运算符:'!='。说明:不等于。表达式值:False
print(10 > 5.1)       #运算符:'>'。说明:大于。表达式值:True
print(10.2 < 5)       #运算符:'<'。说明:小于。表达式值:False
print(5 >= 10)        #运算符:'>='。说明:大于等于。表达式值:False
print(5 <= 10)        #运算符:'<='。说明:小于等于。表达式值:True

比较运算符甚至可以进行字符串之间的比较,会得到基于字母顺序的比较结果。但是python不允许用除了==!=外的比较运算符对不同类型的对象进行比较。键入如下代码(注释可不键入)并观察执行结果。

print('apple' > 'banana')
print('red' == 'red')
print('red' == 10)          #可以,不同类型,所以False
print('red' != 10)  
print('red' >= 10)          #错误,不同类型
  • 逻辑运算符。python提供了3个逻辑运算符,可以进行逻辑运算。键入如下代码并观察执行结果。
a = True
b = False

print(a and b)
print(a and True)
print(False and b)
print(a or b)
print(b or True)
print(not a)
print(not b)
print(not a and b)
逻辑运算符 描述 例子
and 逻辑与运算符,如果两侧操作均为True则值True a and b
or 逻辑或运算符,如果两侧操作有一个为True则值为True a or b
not 逻辑非运算符 not a
  • input()函数。在直接使用input()函数获得用户输入的时候,用户往往不知道需要做什么,其实可以在括号内键入任意字符串,用以提示用户。键入如下代码并观察执行结果。
n = input('请输入一个整数,按回车结束。')
print(n)
  • 常用类型转换。键入如下代码并观察执行结果。
类型转换函数 描述 例子
int 转换成整型数 int('100')
float 转换成浮点数 float('100.123')
str 转换成字符串 str(100.1234)

注意,并非所有的对象均可以自由转换,只限于能够转换的对象如:

a = 10
int('a')            #错误,无法转换
int('5*5')            #错误,无法转换

2.7 完整代码

#任务2:由用户从键盘给定任意正整数n,打印1+2+3+...n的和

n = int(input('请输入一个正整数,以回车结束。'))

i = 0
total = 0

while i < n:
    i = i + 1
    total = total + i
    
print(total)

2.8 实践与练习

  • 练习1:仿照任务2完整代码,打印n!。
  • 实践1:键入如下代码并观察执行结果。
name = input('请输入你的姓名,以回车结束。')
print('你好', name)

n = int(input('请输入一个正整数,以回车结束。'))
m = int(input('请输入一个正整数,以回车结束。'))

print('两个数的和是:', m+n)
print('再见!', name)
  • 练习2:仿照实践1,写出由用户指定整数个数,并由用户输入多个整数,并求和的代码。
  • 练习3:用户可以输入的任意多个数字,直到用户不想输入为止。
  • 练习4:用户可以输入的任意多个数字,直到: 输入所有数字的和比当前输入数字小,且输入所有数字的积大于500。

Footnotes

  1. 实际上有多种代码缩进方式,我们推荐并只介绍python创始人采用的这种方式。

  2. python关键字列表请参见附录XXXX。