记录一些基础编程练习题和一些遇见的坑

1)输出0到100的数字,如果数字是3的倍数输出Fizz,5的倍数输出Buzz。同时是3和5的倍数输出FizzBuzz,其他情况则打印原数字

for i in range(100):
if i==0:
print(i)
elif i%3==0 and i%5==0:
print("FizzBuzz")
elif i%3==0:
print("Fizz")
elif i%5==0:
print("Buzz")
else:
print(i)

ps:条件语句依次执行,满足第一个条件后不会执行下一个条件。所以同时满足3和5的需要放在上面。

2)根据输入的数字,打印相对应层数的等腰三角形星星塔

ps:先打印空格,空格数量:总层数-当前层数。再打印星星,星星数量:当前层数*2-1

num = int(input("输入一个数字:"))
for i in range(1,num+1):#外层循环定义 星星塔层数
y = num-i#计算出空格要打印的次数
print(" "*y,end="")#打印空行
for j in range(1,2*i):#每行星星的数量
print("*",end="")
print()

如range(1,7),生成的数列是1到6,所以需要通过num+1的方式来控制层数

print()里end=""可以让打印时不换行

2*i是星星的数量,利用range()自动减一。-、

使用while循环实现

num = int(input("输入一个数字:"))
row=1
while row<=num:
print(" "*(num-row)+"*"*(2*row-1))
row+=1

row为层数,默认为第一层

num-row为空格数量

2*row-1位星星数量

3)有1,2,3,4四个数字,能组成多少个互不相同且不重复的三位数字

list = []
sum = 0
for i in range(1,5):
for j in range(1,5):
for k in range(1,5):
if i!=j and j!=k and k!=i:
num=i*100+j*10+k
list.append(num)
sum+=1
print(list)
print(sum)

三个数字可填在个十百位上,组成所有排列然后去掉重复的

4)递归返回None值

def get_op():
str = input("请输入你的选择1/2/3/4:")
try:
no = int(str)
if no not in[1,2,3,4]:
print("请输入正确的运算符")
get_op() #这里前面应该加上return
else:
return no
except ValueError as f:
print("请输入正确的运算符")
get_op() #这里前面应该加上return operator = get_op()
print(operator)

在做下面一题的时候,我如果直接输1到4是没有问题的,但是如果输入不是数字,或者不是1到4的数字,会返回None值

后来查了很多才发现。这样写递归调用后产生的值并没有return出来,要在递归函数调用前加上return。把值一层层传出去。

def get_op():
str = input("请输入你的选择1/2/3/4:")
try:
no = int(str)
if no not in[1,2,3,4]:
print("请输入正确的运算符")
return get_op()
else:
return no
except ValueError as f:
print("请输入正确的运算符")
return get_op() operator = get_op()
print(operator)

5)编写一个程序,提示“选择运算符”,输入“1/2/3/4”后,继续输入要进行运算的两个数字后,打印出运算结果

def add(n1,n2):
value = n1+n2
print("%d + %d = %d"%(n1,n2,value)) def minus(n1,n2):
value = n1-n2
print("%d - %d = %d"%(n1,n2,value)) def multiply(n1,n2):
value = n1*n2
print("%d * %d = %d"%(n1,n2,value)) def divide(n1,n2):
value = n1/n2
print("%d / %d = %d"%(n1,n2,value)) dict={1:add,2:minus,3:multiply,4:divide} def get_op():
str = input("请输入你的选择1/2/3/4:")
try:
no = int(str)
if no not in dict:
print("请输入正确的运算符")
return get_op()#一定要return 递归,不然返回值是none
else:
return no
except ValueError as f:
print("请输入正确的运算符")
return get_op() def get_num1():
str = input("输入第一个数:")
try:
num = int(str)
return num
except ValueError as f:
print("请输入整数")
return get_num1() def get_num2():
str = input("输入第二个数:")
try:
num = int(str)
return num
except ValueError as f:
print("请输入整数")
return get_num1() print("选择运算:\n1 is +\n2 is -\n3 is *\n4 is /")
operator = get_op()
num1=get_num1()
num2=get_num2()
dict[operator](num1,num2)

ps:这个做了很久,一个是递归返回值的问题。还有一个通过字典存放函数指针。减少代码量

前四个是加减乘除的函数,然后存放到字段里,然后字典名[key](函数的参数)这样的形式调用。就不用写很多判断的代码。

6)冒泡排序,数组之间相邻值,两两进行比较。然后从大到小,或者从小到大排序

ls = [7,12,34,4,24,20,11]
for i in range(len(ls)-1):#外层决定比较的轮次
for j in range(len(ls)-1-i):#多少个数进行两两比较
if ls[j] < ls[j+1]:#两两比较大小 <是从大到小排序 >是从小到大排序
ls[j],ls[j+1] = ls[j+1],ls[j]#互换位置 print(ls)

数组的下标是从0开始的

从大到小排是找出最小的放到最后面,从小到大排是找出最大的放到最后面
ps:以上图从大到小排序为例。第一轮是7个数进行比较,然后比较出最小的值放在最后。然后第二轮比较前6个值。以此类推。剩下2个数的时候,一次比完。所以需要比的轮次是 数组的长度减去1 。每轮需要比较数量,第一轮是数组长度,之后每轮减1.

7)二分查询,对一个有序的数组进行查询,从数组中间取出一个值,和需要查询的值进行对比。如果大于需要查询的值,则取左边一半继续进行二分查询。如果小于需要查询的值,则取右边一半继续进行二分查询。如果相同,则给出下标。没有提示没找到

使用循环实现

ls = [10,20,30]
def binary_search(alist,item):
left =0 #下标最小值
right = len(alist)-1 #下标最大值
while left<=right: #一定要有=,不然数组第一或最后一个无法查询到
numb = int((left+right)/2) #中间值的下标
if item == alist[numb]: #相等直接返回下标
return numb
elif item > alist[numb]: #查询的值大于数组中间值
left = numb+1 #更新区间下标
else:
right = numb-1 #更新区间下标
return None
s = binary_search(ls,20)
print(s)

left和right确定数组下标区间,找到中间值,比较大小后,根据升序还是降序的排序方式。来确定更换左边还是右边的下标。

一定要<= 因为数组最小或最大时,left=right

left一定要+1,不然会导致查询数组最大时,取中间值下标这步出现死循环

使用递归实现

ls = [10,20,30]
def binary_search(alist,item,left,right):
if left > right:
return None
numb = int((left+right)/2)
if alist[numb] == item:
return numb
elif item > alist[numb]:
return binary_search(alist,item,numb+1,right)
else:
return binary_search(alist,item,left,numb-1)
s = binary_search(ls,10,0,3)
print(s)

python3编程练习题的更多相关文章

  1. 6、50道JAVA基础编程练习题跟答案

    50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析 ...

  2. 50道JAVA基础编程练习题

    50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析 ...

  3. 50道JAVA基础编程练习题 - 题目

    50道JAVA基础编程练习题[1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [2]题目:判断 ...

  4. python012 Python3 编程第一步

    Python3 编程第一步在前面的教程中我们已经学习了一些 Python3 的基本语法知识,下面我们尝试来写一个斐波纳契数列.实例如下: #!/usr/bin/python3 # Fibonacci ...

  5. Python3 编程之字符串处理

    Python3 编程之字符串处理 在编程中最常见的任务就是字符串的处理,So,学好字符串的使用非常重要 一.变量的定义规范 Python中声明变量时,要符合以下规则为准: 只能使用数字.字母.下划线组 ...

  6. python3编程基础之一:关键字

    在学习编程的过程中每种语言都会有一些特殊的字母组合在本语言中表示特定的含义,这种字母组合就是关键字.原则上,关键字是无法被重复定义的,否则,语言在应用中,就无法正确确定标号的意义了. 1.关键字的获取 ...

  7. 豆瓣工程师为你解答关于 Python3 编程方面的问题

    Python是如此活跃的一种语言,几乎伴随互联网的发生而创立,又伴随互联网的极速发展而繁荣.使用Python会遇到这样的问题:什么时候该用多进程?怎样提高代码执行效率?Flask为什么流行?学习Pyt ...

  8. MySQL基础CRUD编程练习题的自我提升(1)

    基础知识: 1.数据库的连接 mysql -u -p -h -u 用户名 -p 密码 -h host主机 2:库级知识 2.1 显示数据库: show databases; 2.2 选择数据库: us ...

  9. Java-每日编程练习题②(数组练习)

    1.有一个已经排好序的数组.现输入一个数,要求按原来的规律将它插入数组中. 分析思路: 先通过Random类随机创建一个数组,再调用Arrays类中的排序方法sort排好序,然后再开始实现功能. 按原 ...

随机推荐

  1. AI AutoML

    AutoML 参考链接: https://arxiv.org/pdf/1810.13306.pdf http://nooverfit.com/wp/7%E4%B8%AA%E4%BD%A0%E5%8F% ...

  2. .net core EF的简单使用

    1.在mysql中新建一个表 2.在控制台中装个EF包  Install-Package Pomelo.EntityFrameworkCore.MySql 3.新建一个Person类 4.创建DbCo ...

  3. [Oracle维护工程师手记]一次升级后运行变慢的分析

    客户报告,当他从 Oracle 11.1.0.7 ,迁移到云环境,并且升级到12.1.0.2.运行客户的应用程序测试,发现比以前更慢了. 从AWR report 的"Top 10 Foreg ...

  4. 基于密度峰值的聚类(DPCA)

    1.背景介绍 密度峰值算法(Clustering by fast search and find of density peaks)由Alex Rodriguez和Alessandro Laio于20 ...

  5. Each path can be reduced to a simple path

    Recently, I made a small conclusion, but I found it is found and well-founded in some textbook. So I ...

  6. python处理Windows平台上路径有空格

    最近在采集windows上中间件的时候,遇到了文件路径有空格的问题. 例如:Aapche的安装路径为D:\Program Files\Apache Software Foundation\Apache ...

  7. NIO原理及案例使用

    什么是NIO Java提供了一个叫作NIO(New I/O)的第二个I/O系统,NIO提供了与标准I/O API不同的I/O处理方式.它是Java用来替代传统I/O API(自Java 1.4以来). ...

  8. vue数组变异方法

    Vue数组变异方法,会改变被这些方法调用的原始数组,将会触发视图更新 push() 接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度 pop() 从数组末尾移除最后一项,减少数组的 ...

  9. VueRouter和Vue生命周期(钩子函数)

    一.vue-router路由 1.介绍 vue-router是Vue的路由系统,用于定位资源的,在页面不刷新的情况下切换页面内容.类似于a标签,实际上在页面上展示出来的也是a标签,是锚点.router ...

  10. [WC2018]通道——边分治+虚树+树形DP

    题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...