Python编程挑战-入门基础习题

文章讲述了如何编写程序来处理一系列问题,如查找符合条件的数字、计算阶乘、生成字典、处理控制台输入并进行排序,以及创建二维数组。每个问题都提供了详细的解题思路和代码示例。

问题

编写一个程序,它将找到所有这些数字,可被7整除,但不是5的倍数,2000年至3200年(包括在内)。得到的数字应按逗号分隔的顺序打印在一行上。

解题思路

  • 循环遍历2000至3200

  • 对每个数字进行检查是否可被7整除,但不能被5整除

  • 将满足条件的数字存储到一个序列里边

  • 使用str.join(sequence),完成用逗号分隔的字符串

代码及运行结果

l=[]  
for i in range(2000, 3201):  
    if (i%7==0) and (i%5!=0):  
        l.append(str(i))  
   
print(','.join(l))

运行结果

代码解析

range函数解析

函数语法:range(start, stop[, step])

参数说明:

  • start 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5)

  • stop 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5

  • step 步长,默认为1。例如:range(0, 5)等价于 range(0, 5, 1)

补充一下,range函数对于起始和结束来说,是左闭右开区间,在这里我们需要遍历2000年至3200年(包括在内),因此应该写成range(2000, 3201)或者range(2000, 3201, 1)。

检查是否可被7整除,但不能被5整除

Python当中,%是取模运算符,返回除法的余数;

我们看看实例:

  • 假设变量a=21, b=10,那么a%b 输出结果为1

  • 假设变量a=20, b=10,那么a%b 输出结果为0

因此我们需要可被7整除,但不能被5整除,可以将用(i%7==0) and (i%5!=0)来进行判断。

List append函数

函数功能::append() 用于在列表末尾添加新的对象。

函数语法:list.append(obj)

这里我们使用l.append(str(i))将满足条件的数字转换成字符串再添加到列表末尾

join函数

函数功能:join() 用于将序列中的元素以指定的字符连接生成一个新的字符串

函数语法:str.join(sequence)

该函数需要满足sequence必须是字符串序列,因此上述在append的时候,我们将数字类型转化为字符串类型str(i),然后通过’,'.join(l)将列表中的这些字符串拼接成一个字符串。

问题

编写一个可以计算给定数字的阶乘的程序。 结果应该以逗号分隔的顺序打印在一行上。 假设向程序提供以下输入: 8 则输出为:40320

解题思路

任何大于等于1 的自然数n 阶乘表示方法:

0的阶乘:0!=1。

基于此定义,我们可以用两种解法来实现,一种是非递归实现,第二种是递归的方式来实现。

运行代码

解法1(非递归实现):

n = int(input())  
count = 1  
for i in range(1, n+1):  
    count = count * i  
  
print(count)

解法2(递归实现):

def fact(x):  
    if x == 0:  
        return 1  
    return x*fact(x-1)  
  
n = int(input())  
print(fact(n))

运行结果

我们这里输入8,得到的结果是40320

代码解析

range函数解析

函数语法:range(start, stop[, step])

参数说明:

  • start 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5)

  • stop 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5

  • step 步长,默认为1。例如:range(0, 5)等价于 range(0, 5, 1)

range函数对于起始和结束来说,是左闭右开区间,在这里我们输入的是8,因此需要从1到8(包括在内),因此应该写成range(1, 8+1)或者range(1, 8+1, 1)。

递归

通俗的来讲:递归就是在函数内部调用自己的函数被称之为递归。

递归的特点:

  1. 必须有一个明确的结束条件

  2. 每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少

  3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

在这里我们输入8,然后调用的是8 * fact(7),即8乘以7的阶乘;而7的阶乘为 7 * fact(6),即7乘以6的阶乘,直到为1时,返回1。

问题

使用给定的整数n,编写一个程序生成一个包含(i, i*i)的字典,该字典包含1到n之间的整数(两者都包含)。然后程序应该打印字典。

假设向程序提供以下输入:8

则输出为: {1:1,2:4,3:9,4:16,5:25,6:36,7:49,8:64}

解题思路

  • 通过input函数接收输入

  • 通过range函数来循环

  • 设置字典的key和value

运行代码

print('请输入一个数字:')  
n=int(input())  
d=dict()  
for i in range(1,n+1):  
    d[i]=i*i  
  
print(d)

运行结果

请输入一个数字:  
8  
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64}

代码解析

range函数解析

函数语法:range(start, stop[, step])

参数说明:

  • start 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5)

  • stop 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5

  • step 步长,默认为1。例如:range(0, 5)等价于 range(0, 5, 1)

补充一下,range函数对于起始和结束来说,是左闭右开区间,在这里我们需要遍历1至8(包括在内),因此应该写成range(1, 8+1)或者range(1, 8+1, 1)。

字段增加键值对

向字典添加新内容的方法是增加新的键/值对,如下语法

d[i]=i*i

问题

问题:编写一个程序,该程序接受控制台以逗号分隔的数字序列,并生成包含每个数字的列表和元组。假设向程序提供以下输入:

34岁,67年,55岁,33岁,12日,98年

则输出为:[‘34’, ‘67’, ‘55’, ‘33’, ‘12’, ‘98’]

(‘34’, ‘67’, ‘55’, ‘33’, ‘12’, ‘98’)

解题思路

  • 通过,来分割字符串,采用split函数

  • 通过正则来匹配数字

运行代码

import re  
  
print('请输入一组数字:')  
values=input()  
l=values.split(",")  
k=re.findall(r'[0-9]+',values)  
t=tuple(k)  
print (k)  
print (t)

运行结果

请输入一组数字:  
12牛,123牛  
['12', '123']  
('12', '123')

代码解析

split函数

split() 通过指定分隔符对字符串进行切片,返回一个由字符串内单词组成的列表,使用 sep 作为分隔字符串。 如果给出了 maxsplit,则最多进行 maxsplit 次拆分(因此,列表最多会有 maxsplit+1 个元素)。 如果 maxsplit 未指定或为 -1,则不限制拆分次数(进行所有可能的拆分)。

str.split(sep=None, maxsplit=-1)

正则匹配数字

[0-9]表示匹配任何数字。类似于 [0123456789],也可以使用\d,和[0-9]等价。

+表示匹配1个或多个的表达式。

[0-9]+表示匹配1个或多个数字

问题

定义一个至少有两个方法的类:getString:从控制台输入获取字符串 printString:打印大写母的字符串。 还请包含简单的测试函数来测试类方法。

解题思路

  • 使用_init__方法构造一些参数

运行代码

class MyString(object):  
    def __init__(self):  
        self.s = ""  
  
    def getString(self):  
        print('请输入字符串:')  
        self.s = input()  
  
    def printString(self):  
        print (self.s.upper())  
  
myStr = MyString()  
myStr.getString()  
myStr.printString()

运行结果

请输入字符串:  
myStr  
MYSTR

代码解析

类的定义

Python当中使用 class 语句来创建一个新类,class之后为类的名称(通常首字母大写)并以冒号结尾

__init__方法

使用__init__方法将类当中的变量进行初始化,这里我们定义并且初始化了一个变量s

def __init__(self):  
        self.s = ""

string upper方法

upper() 方法将字符串中的小写字母转为大写字母

问题

编写一个程序,根据给定的公式计算并打印值:

以下是C和H的固定值:C是50。H是30。D是一个变量,它的值应该以逗号分隔的序列输入到程序中。 例子假设程序的输入序列是逗号分隔的:100,150,180, 程序输出为:18,22,24

提示:如果接收到的输出是小数,则应四舍五入到其最近的值(例如,如果接收到的输出是26.0,则应打印为26)。在为问题提供输入数据的情况下,应该假设它是控制台输入。

解题思路

  • 可以用split函数来进行分割字符串中的数字

  • 使用math库中的sqrt开进行开方

运行代码

import math  
  
c=50  
h=30  
value = []  
print('请输入一组数字:')  
items=[x for x in input().split(',')]  
for d in items:  
    value.append(str(int(round(math.sqrt(2*c*float(d)/h)))))  
  
print (','.join(value))

运行结果

请输入一组数字: 100,150,80 18,22,16

代码解析

列表推导式x for x in range()

列表推导式创建列表的方式更简洁。常见的用法为,对序列或可迭代对象中的每个元素应用某种操作,用生成的结果创建新的列表;或用满足特定条件的元素创建子序列。

例如,创建平方值的列表:

squares = []  
for x in range(10):  
    squares.append(x**2)  
  
print(squares)

可以采用如下方式来完成

squares = [x**2 for x in range(10)]

sqrt函数

math.sqrt(x):返回 x 的平方根。

round函数

round(number[, ndigits]):方法返回浮点数 x 的四舍五入值,准确的说保留值将保留到离上一位更近的一端。

问题

问题:编写一个程序,以2位数字,X,Y作为输入,生成一个二维数组。数组的第i行和第j列中的元素值应该是i*j。 注意:i= 0,1 . .,X - 1; j = 0, 1,­Y-1。 例子假设程序有以下输入:3,5 则程序输出为:[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8]] 提示:注意:如果要为问题提供输入数据,应该假设它是一个控制台输入,以逗号分隔。

解题思路

主要是创建二维数组,并且对二维数组进行赋值

运行代码

print('请输入两个数字:')  
input_str = input()  
dimensions=[int(x) for x in input_str.split(',')]  
rowNum=dimensions[0]  
colNum=dimensions[1]  
multilist = [[0 for col in range(colNum)] for row in range(rowNum)]  
  
for row in range(rowNum):  
    for col in range(colNum):  
        multilist[row][col]= row*col  
  
print (multilist)

运行结果

请输入两个数字:  
3,5  
[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8]]

代码解析

列表推导式x for x in range()

列表推导式创建列表的方式更简洁。常见的用法为,对序列或可迭代对象中的每个元素应用某种操作,用生成的结果创建新的列表;或用满足特定条件的元素创建子序列。

例如,创建平方值的列表:

squares = []  
for x in range(10):  
    squares.append(x**2)  
  
print(squares)

可以采用如下方式来完成

squares = [x**2 for x in range(10)]

创建和使用二维数组

这里也是使用了列表推导式来创建一个二维数组,而这里创建的二维数组所有的值都是0

multilist = [[0 for col in range(colNum)] for row in range(rowNum)]

二维数组的元素访问和修改:

multilist[row][col]= row*col

问题

问题:编写一个程序,接受逗号分隔的单词序列作为输入,按字母顺序排序后按逗号分隔的序列打印单词。

假设向程序提供以下输入: without,hello,bag,world

则输出为: bag,hello,without,world

提示:在为问题提供输入数据的情况下,应该假设它是控制台输入。

解题思路

  • 使用split函数来进行分割单词

  • 使用sort来进行排序

  • 使用join来进行字符串的拼接

运行代码

items=[x for x in input().split(',')]  
items.sort()  
print (','.join(items))

运行结果

without,hello,bag,world  
bag,hello,without,world

代码解析

列表推导式x for x in range()

列表推导式创建列表的方式更简洁。常见的用法为,对序列或可迭代对象中的每个元素应用某种操作,用生成的结果创建新的列表;或用满足特定条件的元素创建子序列。

例如,创建平方值的列表:

squares = []  
for x in range(10):  
    squares.append(x**2)  
  
print(squares)

可以采用如下方式来完成

squares = [x**2 for x in range(10)]

List sort()方法

函数功能:函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数

函数语法:list.sort( key=None, reverse=False)

join函数

函数功能:join() 用于将序列中的元素以指定的字符连接生成一个新的字符串

函数语法:str.join(sequence)

该函数需要满足sequence必须是字符串序列,因此上述在append的时候,我们将数字类型转化为字符串类型str(i),然后通过,'.join(l)将列表中的这些字符串拼接成一个字符串。

读者福利:知道你对python感兴趣,便准备了这套python学习资料

如果大家对Python感兴趣,这套python学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门Python是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习、Python量化交易等习教程。带你从零基础系统性的学好Python!

零基础Python学习资源介绍

① Python所有方向的学习路线图,清楚各个方向要学什么东西

② 600多节Python课程视频,涵盖必备基础、爬虫和数据分析

③ 100多个Python实战案例,含50个超大型项目详解,学习不再是只会理论

④ 20款主流手游迫解 爬虫手游逆行迫解教程包

⑤ 爬虫与反爬虫攻防教程包,含15个大型网站迫解

⑥ 爬虫APP逆向实战教程包,含45项绝密技术详解

⑦ 超300本Python电子好书,从入门到高阶应有尽有

⑧ 华为出品独家Python漫画教程,手机也能学习

⑨ 历年互联网企业Python面试真题,复习时非常方便

在这里插入图片描述

👉Python学习路线汇总👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取哈)
在这里插入图片描述

👉Python必备开发工具👈

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

👉实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉100道Python练习题👈

检查学习结果。

👉面试刷题👈

在这里插入图片描述

在这里插入图片描述

资料领取

这份完整版的Python全套学习资料已经上传网盘,朋友们如果需要可以点击下方微信卡片免费领取 ↓↓↓【保证100%免费】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值