Day.04
2020.02.22
今天学习的内容还是比较基础的,主要是列表和循环结构的运用。
1.列表
在之前的学习过程中,我已经初步了解了列表的使用方法,包括切片、更新、删除等等操作,我觉得其中比较重要的一个点就是列表和元组之间的区别,列表中的元素是可以更改的,而元组不行。列表的查找和截取方式也和字符串一样(类比于C++中数组的下标查找),通过方括号[]进行,但是添加元素和删除元素的方式有所不同。
修改列表元素:直接通过下标查找然后进行赋值即可;
添加元素(在末尾):通过list.append(‘x’)将元素’x’放在原列表list的最后,需要注意的是,也可以用append()动态创建列表;
插入元素:通过list.insert(4,‘x’)将元素’x’插入在下标为4的位置;
删除元素:①使用pop()删除(默认是最后一个元素),同时也可以指定元素索引,并且返回该元素的值;②使用del语句删除,此时需要知道要删除的元素在列表中的位置,元素一旦被删除之后就无法再访问;③使用remove()删除,这种方法适用于不知道元素索引,只知道元素值的时候。
查找元素:①in:存在为True,不存在为False;②not in:存在为True,不存在为False。
具体的函数和方法可以参考
菜鸟教程
或者
牛客网的教程
,这里就不写了。
以下是今天的列表练习题:
#练习题1:创建一个列表,用于存储同学姓名,依次访问该列表中的元素
#并且将老师和班主任的姓名添加至列表的开头和末尾
#要求:将每个同学的姓名打印出来,并且添加一句问候语
#具体实现方法:
list = ['叶扬', '张家铭', '姚霖', '朱子恒']
print(list)
list.append('陈佳舟')
list.insert(0,'陈菲')
print(list)
for x in range(len(list)):
if x == 0 or x == len(list)-1: #这里一开始没-1但是并没有报错
print('%s老师好!'%list[x])
else:
print('%s同学好!'%list[x])
#测试结果:
#['叶扬', '张家铭', '姚霖', '朱子恒']
#['陈菲', '叶扬', '张家铭', '姚霖', '朱子恒', '陈佳舟']
#陈菲老师好!
#叶扬同学好!
#张家铭同学好!
#姚霖同学好!
#朱子恒同学好!
#陈佳舟老师好!
小结:这里输出问候语使用了for…in…的循环结构,in后面不用range()也行,也可以直接跟列表list,但是我个人认为使用range()作为下标给x,后续的使用和理解都更加方便。还有一个在编写过程中发现的问题是,python似乎不存在对列表访问出错的情况,因为一开始在if条件语句中写了x == len(list),那么x=6的时候其实是没有的,但是程序并没有报错,输出的是“陈佳舟同学好!”,而如果在C++中试图访问超过数组长度的数据的话,会提示错误。
2.循环结构
循环结构在前几天已经开始着手应用,主要写的是while循环,今天又学习了python中的for循环。其中,while循环用法和C++几乎是一模一样的,在这里不过多阐述,for循环其实本质上也是和C++一样的,只不过写法不同。range()函数中可以规定区间和步长,这和字符串的切片用法一样,区间也是左闭右开的,此外,range()也可以直接用来创建一个列表。还有一个是pass语句,其作用主要是为了保持程序结构的完整性,本身是一个空语句,这也让我联想到了51单片机中的NOP指令,通常用来延时一个指令周期,防止按键抖动等等。
同样的,通过骆昊百天项目进行练习以加深印象:
#练习题1:输入一个正整数判断是不是素数
#提示:素数指的是只能被1和自身整除的大于1的整数
#具体实现方法:
print('素数判断')
while 1:
x = int(input('请输入一个正整数:'))
count = 0
for y in range(1, x+1):
if x % y == 0:
count += 1
if count == 2:
print('%d是素数' % x)
else:
print('%d不是素数' % x)
#测试结果:
#素数判断
#请输入一个正整数:1
#1不是素数
#请输入一个正整数:2
#2是素数
#请输入一个正整数:3
#3是素数
#请输入一个正整数:4
#4不是素数
#请输入一个正整数:5
#5是素数
#请输入一个正整数:6
#6不是素数
#请输入一个正整数:7
#7是素数
#请输入一个正整数:
#Process finished with exit code -1
小结:在运用range()函数的时候还是会经常忘记左闭右开区间的规则,今后要更加注意这一点。
#练习题2:输入两个正整数,计算它们的最大公约数和最小公倍数
#提示:用辗转相除法求最大公约数比较简单
#最大公约数×最小公倍数=两个正整数之积
#具体实现方法:
print('计算两个正整数的最大公约数和最小公倍数:')
while 1:
x = int(input('请输入一个正整数:'))
y = int(input('请输入另一个正整数:'))
chushu = y
yushu = x % chushu
while 1:
if yushu == 0:
print('%d和%d的最大公约数是%d' % (x, y, chushu))
print('%d和%d的最小公倍数是%d' % (x, y, (x*y)/chushu))
break
else:
beichushu = chushu
chushu = yushu
yushu = beichushu % chushu
#测试结果:
#计算两个正整数的最大公约数和最小公倍数:
#请输入一个正整数:2
#请输入另一个正整数:6
#2和6的最大公约数是2
#2和6的最小公倍数是6
#请输入一个正整数:36
#请输入另一个正整数:270
#36和270的最大公约数是18
#36和270的最小公倍数是540
#请输入一个正整数:18
#请输入另一个正整数:20
#18和20的最大公约数是2
#18和20的最小公倍数是180
#请输入一个正整数:
#Process finished with exit code -1
小结:在用辗转相除法求最大公约数的时候浪费了大量时间,个人认为主要是以下原因:变量命名随意,碰到个新变量就命名为temp1、temp2,这无疑增加了自己逻辑思考的时间,后来用被除数、除数、余数三个关键变量进行命名,问题便迎刃而解了。由此可见,友好的变量名字既有利于他人的阅读,又有利于自己的思考。
#练习题3:打印如下所示的三角形图案
#*
#**
#***
#****
#*****
# *
# **
# ***
# ****
#*****
# *
# ***
# *****
# *******
#*********
#具体实现方法:
str = '*'
for x in range(1,6):
print(str*x)
print('\n')
for y in range(1,6):
print((str*y).rjust(5))
print('\n')
for z in range(1,10,2):
print((str*z).center(9))
#测试结果:
#*
#**
#***
#****
#*****
# *
# **
# ***
# ****
#*****
# *
# ***
# *****
# *******
#*********
小结:这一题比较简单,直接运用字符串函数中相应的左右对齐和居中函数即可,其中,第三问打印奇数个字符*可以直接在range()函数中设置步长为2。
3.今日总结
不一样的语言,一样的配方,做最大公约数的时候我又回想起了两年前被C++支配的恐惧。总的来说,还是要多练习吧,python中没有了变量的声明,为自己的逻辑思考带来了巨大的方便(如果实在想不明白还是建议先画一个流程图,再写程序就十分简单了)。此外,在查资料的过程中,也发现了print()打印时,加号+和逗号,之间的区别:
‘+’号是进行拼接,参与’+'的参数类型必须是同类型的数据(变量之间无空格);
‘,’ 号是将变量分隔开,可以是不同类型的数据(变量之间有空格)。