#第21期-字符串构成
#1 问题描述
试用Python代码,输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数 比如输入:123 45,abc/de 12/3dsf输出:在您输入的字符串中,英文字母的个数为8,空格的个数为2,数字的个数为8,其他字符的个数为3
默认输入字符串中不包含汉字
#2 解题思路
统计数量,需要使用累加可以使用if或while函数,满足条件则数量加一
对于英文、空格以及数字的判断,可以使用大小比较
字符串中每个字符都需要判断,可以使用for循环
判断字符串中的字符,可以使用字符串自带的函数
#3 解题方法
#方法一
1
begin=input('请输入字符串:')
engnum=spanum=dignum=elnum=0
for i in begin:
if i>='a' and i<='z' or i>='A' and i<='Z':
engnum+=1
elif i==" ":
spanum+=1
elif i in '0123456789':
dignum+=1
else:
elnum+=1
print('在您输入的字符串中,英文字母的个数为{},空格的个数为{},数字的个数为{},其他字符的个数为{}'.format(engnum,spanum,dignum,elnum))
2
3
4
5
6
7
8
9
10
11
12
第1行: 用input函数请用户输入一个字符串,并赋值给变量begin
第2行: 给变量engnum、spanum、dignum、elnum都赋值为0,表示英文字母、空格、数字、其他字符初始值均为0
第3行: 用for循环遍历字符串中所有字符
第4-5行: 判断字符i是否为英文字母,如果是,engnum数量加一,如果不是,跳转到第六行
第6-7行: 判断字符i是否为空格,如果是,spanum数量加一,如果不是,跳转到第八行
第8-9行: 判断字符i是否为数字,如果是,dignum数量加一,如果不是,跳转到第十行
第10-11行: 对于既不是英文字母,又不是空格,也不是数字的字符,算作其他字符,elnum数量加一
第12行: 用print函数打印a的阶乘结果
format()函数
format() 函数是一种格式化字符串的函数,类似于f-string的方法格式化字符串
format() 函数可以接受不限个参数,位置可以不按顺序
语法:
str.format() 例如:
“{} {}”.format(“hello”, “world”)等价于”hello world”
“{1} {0} {1}”.format(“hello”, “world”)等价于”world hello world”
{}中的数字可以设置指定位置
#方法二
1
begin = input('请输入字符串:')
engnum = spanum = dignum = elnum = 0
for i in begin:
if i.isalpha():
engnum +=1
elif i.isspace():
spanum +=1
elif i.isnumeric():
dignum +=1
else:
elnum +=1
print(f'在您输入的字符串中,英文字母的个数为{engnum},空格的个数为{spanum},数字的个数为{dignum},其他字符的个数为{elnum}')
2
3
4
5
6
7
8
9
10
11
12
第1行: 用input函数请用户输入一个字符串,并赋值给变量begin
第2行: 给变量engnum、spanum、dignum、elnum都赋值为0,表示英文字母、空格、数字、其他字符初始值均为0
第3行: 用for循环遍历字符串中所有字符
第4-5行: 判断字符i是否为英文字母,如果是,engnum数量加一,如果不是,跳转到第六行(isalpha()
第6-7行: 判断字符i是否为空格,如果是,spanum数量加一,如果不是,跳转到第八行
第8-9行: 判断字符i是否为数字,如果是,dignum数量加一,如果不是,跳转到第十行
第10-11行: 对于既不是英文字母,又不是空格,也不是数字的字符,算作其他字符,elnum数量加一
第12行: 用print函数打印a的阶乘结果
isalpha()函数、isnumeric()函数和isspace()函数
isalpha() 方法检测字符串是否只由字母组成
isnumeric()方法检测字符串是否只由数字组成
isspace()方法检测字符串是否只由空格组成
语法:
str.isalpha()、str.isnumeric()、str.isspace()
如果字符串至少有一个字符并且所有字符都是字母/数字/空格则返回 True,否则返回 False。 方法一、方法二代码运行结果均为:
## #3 视频解析 高清视频讲解,请查看AI大学堂Python基础实战100例(opens new window)
关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
更新于: 12/28/2021, 7:43:14 AM
#第22期-打比赛
Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。#1 问题描述
两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比。请编程序找出三队赛手的名单。 观察题意易知,c不与x和z比,那么c与y比,a不与x比,也不与y比,则a与z比,那么最后的b与x比,编写程序时也只需将三者一一对应即可#2 解题思路
第一步: 将乙队的成员先列成字符串或列表
第二步: 用甲队的成员遍历乙队的成员
第三步: 判断条件c不与x、z比,a不与x比,且abc三者对手各不相同
第四步: 输出结果
#3 解题方法
1
乙队 = 'xyz'
for a in 乙队:
for b in 乙队:
for c in 乙队:
if a != 'x' and c != 'x' and c != 'z' and a != b != c != a:
print(f'a的对手是{a},b的对手是{b},c的对手是{c}')
2
3
4
5
6
第1行: 分别定义变量a, b, c,input函数使用户输入三条边长,再用float函数将输入的字符串转换为浮点数
第2-4行: 分别用甲队的成员遍历乙队的成员,对应两者比赛的情况
第5行: 根据题目中的条件筛选出符合题意的比赛结果
第7行: 打印比赛过程
## #4 视频解析 高清视频讲解,请查看AI大学堂Python基础实战100例(opens new window)
关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
更新于: 12/28/2021, 7:43:14 AM
第23期-完数
Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。#1 问题描述
求某一范围内的所有完数。或者输入一个数,判断其是不是完数。
如果一个数等于它的因子之和,则称该数为“完数”(或“完全数”)。例如,6的因子为1、2、3,而 6=1+2+3,因此6是“完数”。
#2 解题思路
根据完数的定义,解决本题的关键是计算出所选取的整数i(i的取值范围不固定)的因子(因子就是所有可以整除这个数的数),将各因子累加到变量s (记录所有因子之和),若s等于i,则可确认i为完数,反之则不是完数。 判断是否是完数第一步: 输入一个数,input函数
第二步: 从1开始遍历到输入的数(不包括数本身),判断是否是其因数,for循环
第三步: 累加法,判断是否相等 输出某一范围内的所有完数
第一步: 定义范围并遍历范围内的所有数,for或while循环
第二步: 从1开始遍历到数(不包括数本身),判断是否是其因数,for循环
第三步: 累加法,判断是否相等
#3 解题方法
#判断完数
1
pnum = int(input('请输入一个数:'))
cum = 0
for i in range(1, pnum):
if pnum % i == 0:
cum += i
if pnum == cum:
print(f'{pnum}是完数')
else:
print(f'{pnum}不是完数')
2
3
4
5
6
7
8
9
第1行: input函数输入一个值并用int函数将其转换为整数类型,返回值到pnum变量
第2行: 定义变量cum,初始值为0,用于累计因子的和
第3行: 使用for循环遍历小于pnum的所有整数
第4-5行: 分别判断小于pnum的值是否为其因子,若是,则加到cum上
第6-9行: 判断因子和是否与原数相等,若是,用print函数打印其是完数,若不是,用print函数打印其不是完数
### #输出完数
python
pnum = []
for i in range(1, 1001):
cum = 0
for j in range(1, i):
if i % j == 0:
cum += j
if i == cum:
pnum.append(str(i))
print('1000以内的完数有这些:', ','.join(pnum))
12
3
4
5
6
7
8
9
第1行: 定义所有完数的集合列表pnum
第2行: 用for循环遍历1-1000的所有值,以输出这范围内的所有完数
第3行: 定义变量cum,初始值为0,用于累计因子的和
第4行: 使用for循环遍历小于i的所有整数
第5-6行: 分别判断小于i的值是否为其因子,若是,则加到cum上
第7-8行: 判断因子和是否与i相等,若是,则将i的值加到列表pnum的末尾
第9行: 输出1000以内的所有完数并用英文的逗号隔开
这里用到了join函数,简单讲解下这个函数:
string.join()函数
Python中有join()和os.path.join()两个函数,具体作用如下:
join(): 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
os.path.join(): 将多个路径组合后返回
语法:
‘sep’.join(seq)
参数说明:
sep:分隔符。可以为空
seq:要连接的元素序列、字符串、元组、字典 例如:代码:
seq4 = (‘hello’,’good’,’yes’,’doiido’)
print ‘:’.join(seq4)
输出:hello:good:yes:doiido
#小思考
不知道各位小伙伴们有没有发现,上下两种方法cum = 0的位置不一样,上面cum = 0的位置在for循环之外,而下面cum = 0的位置在两个循环之间,这又是什么原因呢? 这是因为上面的判断完数中,cum的值一次代码运行只需要确定一次,而下面的输出所有完数中,对于所有小于1000的数,都需要使用到cum,所以每次循环,都需要将cum的值重新赋值为0。#4 视频解析
高清视频讲解,请查看AI大学堂Python基础实战100例(opens new window)关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
第23期-完数
Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。#1 问题描述
求某一范围内的所有完数。或者输入一个数,判断其是不是完数。
如果一个数等于它的因子之和,则称该数为“完数”(或“完全数”)。例如,6的因子为1、2、3,而 6=1+2+3,因此6是“完数”。
#2 解题思路
根据完数的定义,解决本题的关键是计算出所选取的整数i(i的取值范围不固定)的因子(因子就是所有可以整除这个数的数),将各因子累加到变量s (记录所有因子之和),若s等于i,则可确认i为完数,反之则不是完数。 判断是否是完数第一步: 输入一个数,input函数
第二步: 从1开始遍历到输入的数(不包括数本身),判断是否是其因数,for循环
第三步: 累加法,判断是否相等 输出某一范围内的所有完数
第一步: 定义范围并遍历范围内的所有数,for或while循环
第二步: 从1开始遍历到数(不包括数本身),判断是否是其因数,for循环
第三步: 累加法,判断是否相等
#3 解题方法
#判断完数
1
pnum = int(input('请输入一个数:'))
cum = 0
for i in range(1, pnum):
if pnum % i == 0:
cum += i
if pnum == cum:
print(f'{pnum}是完数')
else:
print(f'{pnum}不是完数')
2
3
4
5
6
7
8
9
第1行: input函数输入一个值并用int函数将其转换为整数类型,返回值到pnum变量
第2行: 定义变量cum,初始值为0,用于累计因子的和
第3行: 使用for循环遍历小于pnum的所有整数
第4-5行: 分别判断小于pnum的值是否为其因子,若是,则加到cum上
第6-9行: 判断因子和是否与原数相等,若是,用print函数打印其是完数,若不是,用print函数打印其不是完数
### #输出完数
python
pnum = []
for i in range(1, 1001):
cum = 0
for j in range(1, i):
if i % j == 0:
cum += j
if i == cum:
pnum.append(str(i))
print('1000以内的完数有这些:', ','.join(pnum))
12
3
4
5
6
7
8
9
第1行: 定义所有完数的集合列表pnum
第2行: 用for循环遍历1-1000的所有值,以输出这范围内的所有完数
第3行: 定义变量cum,初始值为0,用于累计因子的和
第4行: 使用for循环遍历小于i的所有整数
第5-6行: 分别判断小于i的值是否为其因子,若是,则加到cum上
第7-8行: 判断因子和是否与i相等,若是,则将i的值加到列表pnum的末尾
第9行: 输出1000以内的所有完数并用英文的逗号隔开
这里用到了join函数,简单讲解下这个函数:
string.join()函数
Python中有join()和os.path.join()两个函数,具体作用如下:
join(): 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
os.path.join(): 将多个路径组合后返回
语法:
‘sep’.join(seq)
参数说明:
sep:分隔符。可以为空
seq:要连接的元素序列、字符串、元组、字典 例如:代码:
seq4 = (‘hello’,’good’,’yes’,’doiido’)
print ‘:’.join(seq4)
输出:hello:good:yes:doiido
#小思考
不知道各位小伙伴们有没有发现,上下两种方法cum = 0的位置不一样,上面cum = 0的位置在for循环之外,而下面cum = 0的位置在两个循环之间,这又是什么原因呢? 这是因为上面的判断完数中,cum的值一次代码运行只需要确定一次,而下面的输出所有完数中,对于所有小于1000的数,都需要使用到cum,所以每次循环,都需要将cum的值重新赋值为0。#4 视频解析
高清视频讲解,请查看AI大学堂Python基础实战100例(opens new window)关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
#第25期-画国旗
Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。#1 问题描述
按照要求使用turtle库画出图形中华人民共和国国旗是五星红旗,为左上角镶有五颗黄色五角星的红色旗帜,旗帜图案中的四颗小五角星围绕在一颗大五角星右侧呈半环形。红色的旗面象征革命,五颗五角星及其相互联系象征着中国共产党领导下中国人民的团结。该旗的设计者是曾联松,是一名来自浙江瑞安的普通工人。
## #2 解题思路 为便于确定五星之位置,先将旗面对分为四个相等的长方形,将左上方之长方形上下划为十等分,左右划为十五等分。
大五角星的中心点,在该长方形上五下五、左五右十之处。其画法为:以此点为圆心,以三等分为半径作一圆。在此圆周上,定出五个等距离的点,其一点须位于圆之正上方。然后将此五点中各相隔的两点相联,使各成一直线。此五直线所构成之外轮廓线,即为所需之大五角星。五角星之一个角尖正向
四颗小五角星的中心点,第一点在该长方形上二下八、左十右五之处,第二点在上四下六、左十二右三之处,第三点在上七下三、左十二右三之处,第四点在上九下一、左十右五之处。其画法为:以以上四点为圆心,各以一等分为半径,分别作四个圆。
如下图所示
## #3 解题方法 ### #画国旗
python
import turtle as t
t.penup()
t.goto(-330,220)
t.pendown()
a=1
t.fillcolor('red')
t.color('red')
t.begin_fill()
while a<=4:
if a%2==1:
t.fd(660)
else:
t.fd(440)
t.rt(90)
a+=1
t.end_fill()
#画五角星
t.penup()
t.goto(-286,132)
b=1
t.fillcolor('yellow')
t.color('yellow')
t.begin_fill()
while b<=5:
t.fd(132)
t.right(144)
b+=1
t.end_fill()
t.penup()
t.goto(-88,176)
b=1
t.fillcolor('yellow')
t.begin_fill()
t.right(156)
while b<=5:
t.fd(44)
t.right(144)
b+=1
t.end_fill()
t.penup()
t.goto(-88,132)
b=1
t.fillcolor('yellow')
t.begin_fill()
t.right(180)
while b<=5:
t.fd(44)
t.right(144)
b+=1
t.end_fill()
t.penup()
t.goto(-66,88)
b=1
t.fillcolor('yellow')
t.begin_fill()
t.right(90)
while b<=5:
t.fd(44)
t.right(144)
b+=1
t.end_fill()
t.penup()
t.goto(-88,22)
b=1
t.fillcolor('yellow')
t.begin_fill()
t.right(90)
while b<=5:
t.fd(44)
t.right(144)
b+=1
t.end_fill()
t.penup()
t.goto(500,0)
t.done()
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
第1行: 引入turtle画图库并简化为t来表示
第3-17行: 画出660×440的长方形作为并填充红色作为国旗总体样式
第19-29行: 找准第一个五角星坐标并画图且填充黄色
第31-41行: 找准第二个五角星坐标并画图且填充黄色
第43-53行: 找准第三个五角星坐标并画图且填充黄色
第55-65行: 找准第四个五角星坐标并画图且填充黄色
第67-77行: 找准第五个五角星坐标并画图且填充黄色
第79-81行: 将画笔移出国旗外并开始作图
这里用到了turtle.circle函数,简单讲解下这个函数:
turtle.circle()函数
语法:
turtle.circle(radius, extent=None, steps=None)
参数说明:
radius(半径):半径为正(负),表示圆心在画笔的左边(右边)画圆;
extent(弧度) (optional);
steps (optional) (做半径为radius的圆的内切正多边形,多边形边数为steps)。 第24期-画图形(opens new window)中我们同样讲解了用turtle库方法来画五角星以及长方形,忘记了的小伙伴可以查看哦~
#4 视频解析
高清视频讲解,请查看AI大学堂Python基础实战100例(opens new window)关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
#第26期-数字金字塔
Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。#1 问题描述
数字金字塔按照格式将数字输出成金字塔形状
输出结果要求如下
## #2 解题思路 总的是两层for循环嵌套,最外层循环是根据输入的数字,来对每行添加空格,内层两个平行的for循环分别用于输入两侧的数字
也可以使用列表分别输出数字
#3 解题方法
1
max=int(input('请输入行数:'))
x=[' ']*(2*max-1)
for i in range(max):
x[max-1-i]=str(i+1)
x[max-1+i]=str(i+1)
print(''.join(x))
2
3
4
5
6
第1行: 使用input函数输入行数,转换为int整数类型并返回给max
第2行: 我们观察到问题描述中的图片可以得知每一行的数字个数分别是其行数的两倍减一,于是创建一个对应长度的列表x,x中的元素全是空格
第3-5行: 使用for循环遍历max次,每一次遍历都改变两个数变成对应的数字
第6行: 打印列表中的空格和数字(注意join函数只能打印字符串,所以数字需要转换成字符串类型)
## #4 视频解析 高清视频讲解,请查看AI大学堂Python基础实战100例(opens new window)
关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
#第27期-拉力赛求最短时间
Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。#1 问题描述
在荒漠中举办拉力赛,为避免前车事故停车影响后车成绩,赛车分批出发。每隔5分钟出发10辆车,每辆赛车在通过起点和终点时都会独立计时。默认所有赛车完赛的正常耗时都在8小时以内。比赛从早上8点开始,下午4点全部结束,这时还没到终点的车辆不记到达成绩。现在得到了所有赛车的单独计时起止时间,请输出耗时最少的车辆编号(从1开始,顺序编号)和所用耗时。输入说明:第一行是一个整数N,表示参加赛事的赛车数量。之后是N行,每行表示一辆赛车的单独计时时间,时间给出方式为小时+分钟的形式,如0830 1210表示8点30分通过起点,12点10分通过终点。
输出说明:耗时最少车辆的序号及所有耗时(用分钟表示),中间用空格分开,(如果所有赛车都没有完赛,输出-1)
输入样例: 6
0800 1210
0805 1320
0810 1215
0815 1300
0820 1310
0905 1430
输出样例: 3 405
#2 解题思路
- 输入车的数量,使用input函数
- 输出最小时间及车辆,需要使用判断大小的方法
- 需要判断输入的时间是否符合时间格式,不符合则重新输入
- 可以考虑使用def创建函数
#3 解题方法
1
def CarRace(m):
min = 10000
time = min1 = 0
c = 1
while c <= m:
begin, end = map(int, input(f'请输入第{c}辆车出发及结束时间(中间用空格隔开):').split())
if 0 <= begin // 100 <= 23 and 0 <= end // 100 <= 23 and 0 <= begin % 100 <= 59 and 0 <= end % 100 <= 59:
if end % 100 - begin % 100 >= 0:
time = end - begin
else:
time = end - begin - 40
if time <= min and end // 100 < 16:
min = time
min1 = c
c += 1
else:
print(f'您输入的第{c}辆车时间不正确,请重新输入')
if min1 != 0:
print(f'第{min1}辆车用时最短', end=',')
print(f'其用时为{min},即{(min - min % 100) / 100}时{min % 100}分')
else:print(-1)
m = int(input('请输入车的数量:'))
CarRace(m)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
第1行: def创建车辆竞赛函数
第2行: 给最小值一个较大的值,保证下一个数一定可以比这个数小,如此便可以将其替换为第一个算出来的数
第3-4行: 定义time时间差以及min1为0,定义循环次数及车辆为i
第5行: 使用while循环判断是第几辆车正在计算
第6行: 定义begin和end变量,并输入两个整数类型的值返回到begin和end,输入值中间用空格隔开
第7行: 判断输入的值是否符合时间的格式
第8-11行: 若符合格式,对结束时间分钟小于开始时间分钟的情况需要进行时间转换(因为时间分钟是60分钟一个小时,不能直接减)
第12-14行: 若时间差time小于最小时间值min,则将time的值赋值给min,且定义min1,赋值其最小时间的车辆
第15行: 若时间输入格式正确,则输入下一辆车的时间
第16-17行: 对输入格式不正确的车辆,保证i值没有变化并打印提示用户重新输入
第18-20行: 当min1发生变化时,表示有车辆的时间是正确的并且输出最小时间
第21行: 当min1没发生变化时,表示没有车辆在指定时间之前到达,输出-1
第24-25行: 提醒用户输入车的数量,并引用函数
这里用到了map(int,input().split())函数,简单讲解下这个函数:
map()函数
map() 会根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
语法:
map(function, iterable, …)
参数说明:
function — 函数
iterable — 一个或多个序列 例如:map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]) 输出:[3, 7, 11, 15, 19] 所以这里面的map(int,str())是将str里面的内容转换为int类型
str.split()函数
split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
语法:
str.split(str=””, num=string.count(str)).
参数说明:
str — 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num — 分割次数。默认为 -1, 即分隔所有。 所以这里面的input().split()就是输入多个值,并用空格隔开,不过输入的值是字符串,所以需要用map函数转换为int类型
#4 视频解析
高清视频讲解,请查看AI大学堂Python基础实战100例(opens new window)关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
#第28期-丑数
Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。#1 问题描述
把只包含质因子2,3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但7、14不是,因为它们包含质因子7。 习惯上我们把1当做是第一个丑数。 要求:输入一个数,判断是否是丑数 或者输出某一范围内的所有丑数#2 解题思路
- 由于因子只能是2,3,5这三个特殊数字,所以可以把这三个数字做成列表进行判断
- 遍历小于该数的除了1以外的最小因子,判断其是否在2,3,5之间
- 若不在内部可以直接输出其不是丑数
- 若是2,3,5之一,则可以使用剩下的数,再次判断其最小因子,直至数变成2,3,5后,可确定其是丑数,循环
#3 解题方法
1
a = [2, 3, 5]
def UglyNumber(m):
n = m
while True:
if n == 1:
return f'{m}是丑数'
break
elif n in a:
return f'{m}是丑数'
break
else:
b = 0
for i in a:
if n % i != 0:
b += 1
else:
n /= i
continue
if b == 3:
return f'{m}不是丑数'
break
m = int(input('请输入整数:'))
print(UglyNumber(m))
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
第1行: 将三个特殊数字2,3,5建立成一个列表
第3行: 创建丑数函数UglyNumber,并输入m作为它的变量
第4行: 使用n来替代m的值,n用于变化,m用于表示原数
第6-11行: 判断n是否为1,2,3,5之间的一个,若是,打印m是完数且结束循环
第12-13行: 若n不是1,2,3,5之间的一个,定义b=0,用处稍后介绍
第14-16行: 使用for循环遍历2,3,5这三个数,判断2,3,5是否是其因数,若不是,b的值加一
第17-19行: 只要2,3,5之间有一个数为n的因数,则替换n为n除以因数之后的值,并使用continue结束本次循环,进行下次循环判断n是否是丑数
第20-22行: 如果b=3,则表示2,3,5之间任何一个数都不是n的因子,则n不是丑数,那么m也不是丑数
第25-26行: 输入一个整数并将其值返回给m,打印其是否是丑数
### #小思考 那么如果要求输出一万以内的所有丑数,应该如何修改呢?
#4 视频解析
高清视频讲解,请查看AI大学堂Python基础实战100例(opens new window)关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
#第29期-微生物增殖
Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。#1 问题描述
假设有两种微生物 X 和 Y ,X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。一个新出生的X,半分钟之后吃掉1个Y,并且从此开始,每隔1分钟吃1个Y。
现在已知有新出生的 X=10, Y=90,求60分钟后Y的数目。
X先吃Y,X、Y再增殖
#2 解题思路
- 1-60分钟,使用for循环遍历每一分钟
- 由于X先吃Y,X、Y再增殖,所以先减后乘
- 判断时间是否是2或者3的倍数,使用求余
#3 解题方法
1
X, Y = 10, 90
for i in range(1, 61):
Y -= X
if i % 2 == 0:
Y *= 2
if i % 3 == 0:
X *= 2
print(Y)
2
3
4
5
6
7
8
第1行: 定义变量X与Y,并为之赋值10、90
第2行: 使用for循环遍历每一分钟
第3行: 由于X先吃Y,X、Y再增殖,所以先给Y赋值被吃后的值
第4-7行: 判断时间是否为2分钟或三分钟,是两分钟则Y翻倍,是三分钟则X翻倍
第8行: 打印Y的值
### #小思考 如果将Y的初始值换成89,结果会如何呢?代码如下
1
X, Y = 10, 89
for i in range(1, 61):
Y -= X
if i % 2 == 0:
Y *= 2
if i % 3 == 0:
X *= 2
print(Y)
2
3
4
5
6
7
8 代码运行结果为:
可以看到,仅仅是修改了一点点的值,最终的结果居然是Y灭绝了!正所谓差之毫厘,谬之千里,各位小伙伴写代码时一定要细心呀
#4 视频解析
高清视频讲解,请查看AI大学堂Python基础实战100例(opens new window)关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
#第30期-寻求两个数对之间的最大乘积
Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。#1 问题描述
两个数对 (a, b) 和 (c, d) 之间的 乘积差 定义为 (a b) - (c d) 。例如,(5, 6) 和 (2, 7) 之间的乘积差是 (5 6) - (2 7) = 16 。
给你一个整数数组 nums ,选出四个 不同的 下标 w、x、y 和 z ,使数对 (nums[w], nums[x]) 和 (nums[y], nums[z]) 之间的 乘积差 取到 最大值 。
返回以这种方式取得的乘积差中的 最大值 。
输入:nums = [5,6,2,7,4]
输出:34
解释:可以选出下标为 1 和 3 的元素构成第一个数对 (6, 7) 以及下标 2 和 4 构成第二个数对 (2, 4)
乘积差是 (6 7) - (2 4) = 34
#2 解题思路
- 输入一组数据,可以考虑使用map函数,但需要定义的变量过多,可以考虑使用split函数形成列表
- 取最大值与次大值,可以考虑使用remove函数去除列表元素
- 可以考虑使用sort函数排列列表
#3 解题方法
#方法一
1
def PoorProduct(nums):
max_1 = max(nums)
nums.remove(max_1)
max_2 = max(nums)
min_1 = min(nums)
nums.remove(min_1)
min_2 = min(nums)
poorproduct = int(max_1) * int(max_2) - int(min_1) * int(min_2)
return poorproduct
a = input('请输入一组数字,中间用逗号隔开:')
nums1 = a.split(',')
nums=[]
for i in nums1:
nums.append(int(i))
print(PoorProduct(nums))
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
第1行: 定义函数PoorProduct,用于返回最大乘积差
第2-7行: 使用max与min函数找出数组中的最大值、次大值、最小值以及次小值,并分别赋值给对应变量
第8-9行: 计算最大乘积差并返回给函数
第11行: 使用input函数输入数组并提示用户中间用逗号隔开
第12行: 使用split函数,将逗号前后的字符串分别列出并作为元素放进列表中
第13-15行: 将列表num1中的元素全部转化为整数类型再存到新的列表num中
第16行: 计算数组最大乘积差
#方法二
1
a = input('请输入一组数字,中间用逗号隔开:')
nums1 = a.split(',')
nums=[]
for i in nums1:
nums.append(int(i))
nums.sort()
print(nums[-1]*nums[-2]-nums[0]*nums[1])
2
3
4
5
6
7
第1行: 使用input函数输入数组并提示用户中间用逗号隔开
第2行: 使用split函数,将逗号前后的字符串分别列出并作为元素放进列表中
第3-5行: 将列表num1中的元素全部转化为整数类型再存到新的列表num中
第6行: 使用sort函数将列表中的整数从小到大重新排列
第7行: 打印数组最大乘积差
这里用到了remove函数和split函数,简单讲解下这两个函数:
remove()函数
remove() 函数用于移除列表中某个值的第一个匹配项。
语法:
list.remove(obj)
参数说明:
obj — 列表中要移除的对象。 例如:aList = [123, ‘xyz’, ‘zara’, ‘abc’, ‘xyz’];
aList.remove(‘xyz’);
print(aList):[123, ‘zara’, ‘abc’, ‘xyz’]
默认删除列表中与参数对应的第一个元素
split()函数
split()函数可以将一个字符串分裂成多个字符串组成的列表。
语法:
str.split(sep, maxsplit).
参数说明:
sep 是分割符,不写分割符时表示所有的空字符,包括空格、换行(\n)、制表符(\t)等,有分隔符时,以该分隔符进行分割。
maxsplit是分割次数。 例如:L = ‘100 200 300\n400\t500’
print(L.split())
执行结果:[‘100’, ‘200’, ‘300’, ‘400’, ‘500’]
print(L.split(‘ ‘, 1))
执行结果:[‘100’, ‘200 300\n400\t500’]
#小思考
为什么方法一与方法二都需要下面这段代码?1
nums=[]
for i in nums1:
nums.append(int(i))
2
3 如果删除这段代码,输出结果会有区别吗?为什么?
#4 视频解析
高清视频讲解,请查看AI大学堂Python基础实战100例(opens new window)关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码