Python编程入门教程(以在线评测平台为载体)

本博客原文地址:https://www.cnblogs.com/BobHuang/p/14341687.html,原文体验更佳
如果你是一名浙江2020级及以后的高中生要学习Python,抑或是一位科学工作者要学习Python,抑或是一名熟悉C/C++想扩展自己的技术栈来学习Python,抑或是一位小朋友在学习Python,以下文章对你学习Python编程将非常有帮助。
天天快乐编程在线评测平台现有6000多题,且支持Python语言,各种层级题目均具备。所以这里以天天快乐编程TZOJ为例,带您一起尝试用Python刷在线评测平台(Online Judge),提升自己的编程技巧及解决问题的能力。天天快乐编程信息技术分类,以下文章所提到的题目均已按顺序在此分类里。

一、Python语言简介

Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计,也就是龟叔,顺便一提,Van 这个姓氏代表是贵族后裔。

Python提供了高效的高级数据结构,还能简单有效地面向对象编程。别人帮你造好了大楼,你拿来装修后做什么是你的事情。Python是面向对象的语言,是一种抽象的软件开发的思想方法,在Python里一切皆对象。
Python是解释型语言,他会将将源代码逐条转换成目标代码同时逐条运行。而C/C++等编译型语言会一次性将代码转换为目标代码,所以运行速度更快。最广泛使用的Python解释器是CPython,其是用C语言实现的Python解释器。Python语法很多来自C,但是其又增添了一些语法规则,如强制缩进。
Python可以花更多的时间用于思考程序的逻辑,而不是具体的实现细节,所以受科研工作者深度热爱。Python简单易学,所以作为非计算机专业学生的入门语言也是非常友好的,不用担心学不会。Python具有非常丰富的模块,它可以帮助你处理各种工作。比如OCR识别,一行代码,如pytesseract.image_to_string("sample.jpg"),即可完成对"sample.jpg"这个图像文件的文字识别。使用几行代码能完成对表格的复杂处理。当然他的功能远不如此,图形界面开发、系统网络运维、科学与数字计算均可用Python轻松完成。
Python取各语言之长,前面我们已经提到过其语法很多来自于C,其标准库的正则表达式参考了Perl,而lambda, map, filter, reduce等函数参考了Lisp。
如果你是计算机专业,我建议你从C学起,老老实实将数据结构与算法学踏实,这对你学习Python将会非常有帮助。无论学习什么语言,算法都是编程的核心。

二、顺序结构

1.输出语句

1452: C语言实验题――Hello World要求我们打个招呼,这句话也是学习每个编程语言的开始。我们想要让程序显示内容,需要使用对应的语句,Python对应的输出语句为print("你要说的内容"),我们将你要说的内容换为你要说的话即可,中英文均可。
1452参考代码

print("Hello, World!")

print函数格式:print(*objects,sep=' ',end='\n')
功能:可以一次输出多个对象。多个参数(object复数)之间用逗号分割,输出的多个对象之间的分隔符默认为一个空格,所有信息输出之后添加的符号默认为换行符。

然后你可以划到页面底部,点击提交按钮,然后将运行语言选择为Python3,并将你的代码粘贴进去,点击提交后即可看到结果。

提交后显示红色的Accepted代表你通过了这个题目,绿色的Wrong Answer代表你写错了(有可能是大小写错误,以及少了标点),蓝色的Compile Error代表你写的代码没有运行或者没有将语言改为Python3,粉红色的Presentation Error请检查是否多了一个空格,或少了一个空格。

通过后你可以尝试下以下题目
6977 输出平台地址、6176 武汉加油!中国加油!、5980 抹布的水印、6903 tencent's 水题1 、6990 say sorry to teacher、6953 最优价钱问题

那如果要输出三遍呢,比如5221: 重要的话说三遍,要求我们将I'm gonna WIN!说三遍,聪明的你可以尝试一下。

5221参考代码1
print("I'm gonna WIN!")
print("I'm gonna WIN!")
print("I'm gonna WIN!")
我们将代码复制三遍就可以了,为什么全写在""内不可以呢,因为你需要换行,这个可以参考下面代码,\n表示换行,print默认输出之后添加的符号默认为换行符,之后我们还会介绍换行
5221参考代码2
print("I'm gonna WIN!\nI'm gonna WIN!\nI'm gonna WIN!")
字符串可以 "+",也可以"*",使用他们同样可以。
5221参考代码3
print("I'm gonna WIN!\n"+"I'm gonna WIN!\n"+"I'm gonna WIN!")
5221参考代码4
print("I'm gonna WIN!\n"*3,end="")

通过后你可以尝试下以下题目
6762 开心的yym、6942 给yym加油打气、6962 打印任务

2.输入语句

7182: 我的第一个程序输入你的姓名,然后将输出的姓名输出到屏幕上显示。输出我们可以用print,那么输入我们怎么做呢,可以使用input()语句。输出空格需要我们控制,我们可以使用sep控制空格
7182参考代码

# 用name保存输入内容
name = input()
print("Hello,",name)

注释

注释主用于解释程序代码,目的是提升代码的可读性。在Python程序中,单行注释以“#”开头。注释部分分会被编译器略去,从而不被计算机执行。

input函数

格式:input([prompt])
功能:读取从键盘输入的字符串,若给定提示字符串(参数prompt),则直接输出。

变量是指其值在程序执行过程中会发生变化的量,它一般需要先定义在使用,比如上面我定义了name变量将输入的名字保存了下来。

赋值语句

赋值语句是最基本的语句,它的作用就是将表达式的值赋给变量。
格式:变量名=表达式。其中“=”为赋值号
功能:把赋值号右边表达式的计算结果,存储到赋值号左边的指定的变量中。

在Python中,给变量命名,要遵循以下规则:
1)只能包含字母、数字和下划线。注意字母区分大小写。注:Python3支持中文变量名,但不建议使用
2)不能以数字开头,不能与关键字同名。

通过后你可以尝试下以下题目
5600 打招呼、5877 输出第二个数、5681 简单输入输出、6933 演讲打招呼、6439 字符菱形

5681提示: 简单输入输出需要读入多个元素,设置多个变量依次读入并输出。

5681参考代码
name = input()
age = input()
NO = input()
print("name:",name,sep='')
print("age:",age,sep='')
print("NO:",NO,sep='')

3.简单计算

1001: 整数求和给我们两个数字,要让我们对他们进行求和。
如果我们读入后直接将a+b,他会输出两个数字相连接,比如1和2,会输出12。
1001错误代码

a=input()
b=input()
print(a+b)

那么如何让其输出3呢。数据具有不同的类型,不同的类型也对应不同的特征,input得到的类型为字符串类型。
Python的常用数据类型--表示数字

数据类型名称 数据表示形式
整形(int) 数学中的整数,如0,1,-2等
浮点型(float) 数学中的小数,如2.0,3.14,-6.8等

本题我们要计算两个整数的和,我们可以用int()将其转换为对应的类型。

Python常用的数据类型转换函数
int([x]):将字符串或者数字转换为整数。
float([x]):将字符串或数字转换为浮点数。
例如: >>> float("25")
      25.0

1001参考代码1

a=input()
b=input()
print(int(a)+int(b))

1001参考代码2,更建议读入后就进行转换

a=int(input())
b=int(input())
print(a+b)

通过后你可以尝试下以下题目
6442 bth之潘家小镇3 、6783 三角形的周长、6779 CJC的取信问题、5974 多大了

4.复杂数字计算

除了可以进行加减运算外,四则运算的中乘除也是可以的,乘号用的是"*",位于数字8的上方,除号用的是"/",位于右shift的左侧。
Python常用算数运算符

运算符 表达式 描述 示例 优先级
+ x+y 将x与y相加 5+2结果为7 3
- x-y 将x减去y 5-2结果为3 3
* x*y 将x与y相乘 5*2结果为10 2
/ x/y 将x除以y,结果为浮点数 5/2结果为2.5 2
// x//y 将x除以y,取整数部分 5//2结果为2 2
% x%y 将x除以y,求余数 5%2结果为1 2
** x**y 求x的y次幂 5**2结果为25 1

注意:1.Python的除法规则和其他语言不一样。2.需要提高优先级请使用()
5887: 长方形的周长,长方形周长为(长+宽)*2
5887参考代码

a=int(input())
b=int(input())
print((a+b)*2)

通过后你可以尝试下以下题目
6904 tencent's 水题2、7131 圆的直径、6780 CJC的生产垃圾问题、6874 买东西、6659 bth的铁丝问题、6634 bth的数学问题

1494: C语言实验题――温度转换要求给定一个华氏温度,输出摄氏温度。
本题输入为小数,所以类型为float,但是要求我们保留两位小数,这里可以用C语言的格式控制%.2f,之后跟上变量名称

格式化函数format()
格式:format(value[,fomat_spec])。
功能:将数据按foramt_spec格式规划表现形式。例如,浮点数格式[width].[.precision]表示宽度和精度
例如: >>> x=26.6666666666666668
    >>> printf(fomat(x,'.2f'))
      26.67

1494参考代码1(更建议使用)

F=float(input())
print(format(5*(F-32)/9,'.2f'))

也可以使用C语言的语法
1494参考代码2

F=float(input())
print('%.2f'%(5*(F-32)/9))
其他格式化参数

d 以十进制形式输出带符号整数(正数不输出符号)
o 以八进制形式输出无符号整数(不输出前缀O)
x 以十六进制形式输出无符号整数(不输出前缀OX)
u 以十进制形式输出无符号整数
f 以小数形式输出浮点数
e 以指数形式输出浮点数
g 以%f%e中较短的输出宽度输出浮点数
c 输出单个字符
s 输出字符串
标志字符为-、+、#、空格四种,其意义:
- 结果左对齐,右边填空格
+ 输出符号(正号或负号)空格输出值为正时冠以空格,为负时冠以负号
\# 对c,s,d,u类无影响;对o类, 在输出时加前缀。对x类,在输出时加前缀0x;对e,g,f 类当结果有小数时才给出小数点
输出的格式控制
%nd n为指定的输出字段的宽度。如果数据的位数小于n,则左端补以空格,若大于n,则按实际位数输出。
%0nd n为指定的输出字段的宽度。如果数据的位数小于n,则左端补以0,若大于n,则按实际位数输出。
%m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。

通过后你可以尝试下以下题目
7133 圆的周长、7132 圆的面积、5972 单位转换、7020 温度转换1、6784 温度转换2、6969 温度转换3、6970 温度转换4、6971 温度转换5

如果多个变量呢,如2982: 圆的直径、周长和面积这一题,我们可以一个一个输出
2982参考代码

PI=3.1415926
r=float(input())
d=2*r
circle=2*PI*r
area=PI*r**2 
print(format(d,'.2f'),format(circle,'.2f'),format(area,'.2f'))

通过后你可以尝试下以下题目
6143 单位转换、1493 C语言实验题――圆柱体计算

5884: 带余除法"/"可以求出小数商(得到的为浮点型),Python中还有求商的整数部分,为//。被除数/除数=商···余数,求余数可以直接用取余运算符%。
Python不管同号还是异号,都会让商尽量小,所以14//-6的值为-3,余数为-4
5884参考代码

a=int(input())
b=int(input())
print(a//b,a%b)

通过后你可以尝试下以下题目
1488 C语言实验题――买糖果、6785 3位数的每一位、6013 反向输出一个三位数、4562 合并正整数

接下来我们可以尝试下6781: 算数平方根,开根号对应为0.5次幂,使用**幂运算符即可。
6781参考代码

a=float(input())
print(format(a**0.5,'.2f'))

通过后你可以尝试下以下题目
5886 计算2的幂、6859 乘方计算、5973 移动小数点、1491 C语言实验题――三角形面积

5.字符

"Hello, World!","www.tzcoder.cn","0"都是字符串,字符串表示一串字符。那什么是字符呢。
字符是电子计算机或无线电通信中字母、数字、符号的统称。计算机不能直接显示字符,字符存储在计算机中经过一定的规则编码后的二进制数字,最终会被显示为字符。
常见的编码为ASCII码,即美国信息交换标准代码(American Standard Code for Information Interchange),字符和数字值一一对应的。
ASCII表,建议收藏。
常用的有空格为32,'0'为48,'A'为65,'a'为97,'A'与'a'相差32。
5885: ASCII表 要求输入一个除空格以外的可见字符,输出其ASCII码。
读入为一个字符,想要获取其ASCII码,字符型->整型可以用ord函数。
ord()函数

ord函数以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值

5885参考代码

a=input()
print(ord(a))

C语言的强制转换在Python里得不到其ASCII码,因为Python里一切皆对象,他会尝试把字符串对象转换为整型对象,如果是字母即转换出现异常。

ASCII码中没有中文,我们中文使用的是GBK国标码。为了适配多种语言,互联网使用的是Unicode万国码。
必修1 P18使用UltraEdit软件查看了"中国China"的字符内码,在Python中也可以编程来看
查看内码参考代码

a='中国China'
a=a.encode('gbk')
for i in a:
    print("%02X" % i)

5889: 打印字符 输入一个整数,即字符的ASCII码,输出相对应的字符。
读入ASCII码,获取字符,整型->字符型可以用chr函数。
chr函数

chr() 用一个范围在256内的整数作参数,返回一个对应的字符。

5889参考代码

# 注意输入的类型为int
a=int(input())
print(chr(a))

通过后你可以尝试下以下题目
7178 小z与ASCII加密、6446 小z与ASCII解密、1492 C语言实验题――大小写转换、1489 C语言实验题――字符编码

4960: 打印图形 要求我们打印一个字符的长方形。
每行分别print即可。但是如果你字符串的界定符用了''',那你的代码将无法运行,需要使用'''进行转义
4960参考代码1

print("abcdefghij")
print("klmnopqrst")
print("uvwxyz+-*/")
print("0123456789")
print("()[]{}&&||")
print("!?:,><\^%'")

4960参考代码2

print('abcdefghij')
print('klmnopqrst')
print('uvwxyz+-*/')
print('0123456789')
print('()[]{}&&||')
print('!?:,><\^%\'')

*转义字符

转义字符 ASCII 码 转义字符的含义
\n 10 回⻋换行
\t 9 制表符
\\ 92 反斜线符""
' 39 单引号符
" 34 双引号符

我门使用这些特殊字符时往往要使用其转义字符。
通过后你可以尝试下以下题目
5074 打印字符、7042 最澄澈的空与海

6.字符串和列表

数据类型名称 数据表示形式
字符串型(str) 用引号作为定界符,如'ABC',"请输入"等
列表(list) 用方括号作为定界符,如[1,2,3],[1,'a']等
字符串是字符的序列表,由一对引号(单引号或双引号)构成。可以通过索引访问字符串中特定位置的字符。

字符串和列表的索引(下标)从0开始,想要访问a中的第1个元素可以用a[0]访问([]为索引运算符)。之后的元素依次往后数。

如“ABCDEFGHIJ”的索引标号如下所示

字符 A B C D E F G H I J
索引 0 1 2 3 4 5 6 7 8 9

7165: 列表索引问题简单版1 要求我们输出字符串的第5个元素。

第5个元素对应索引4,即[4]。
7165参考代码

a=input()
print(a[4])

通过后你可以尝试下以下题目
7166 列表索引问题简单版2

Python存在正索引,同时也存在负索引,负索引就代表倒数第几个。

字符 A B C D E F G H I J
正索引 0 1 2 3 4 5 6 7 8 9
负索引 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

7167: 列表索引问题简单版3 要求我们输出倒数第5个元素。

倒数第五个元素对应索引为-5,即[-5]。
7167参考代码1

a=input()
print(a[-5])

能不能用正索引做呢,当然可以,我们可以量出字符串的长度l,倒数第5个,即[l-5]

len()函数
函数格式:len(s)
函数功能:返回序列s的长度或项目个数

7167参考代码2

a=input()
l=len(a)
print(a[l-5])

通过后你可以尝试下以下题目
7168 列表索引问题简单版4

*7.字符串和列表的切片

此知识点量力而行,可能会有些困难。
有的时候我们可能需要列表中间隔几个的项,我们可以用切片去完成。

格式:[start: end: step]
功能:返回从索引位置start到索引位置end且以step为步数的子序列(不包含索引位置end的元素)
例如:若lst=['HUAWEI','OPPO','VIVO','XIAOMI'],则lst[-3:-1]返回值是['OPPO','VIVO']。

你可以尝试下以下题目
7169 字符串切片1、7170 字符串切片2、7171 字符串切片3、7172 字符串切片4、7173 字符串切片5、7174 字符串切片6、7175 字符串切片7

三、选择结构

和之前顺序结构不同,有时候我们需要有选择执行某些语句,比如“如果明天下雨,那么明天就不去公园了”;“如果出门前告诉妈妈,那么她不会担心我们;否则她会非常担心我们”也就是if条件语句。其语法结构如下所示
if <条件> :
  <语句块1>
[else:
  <语句块2>]
if条件语句由if关键字构成,后面跟一个条件和一个冒号。冒号的作用是告知接下来要创建一个新的语句块,处于同一缩进位置的代码块组成一个语句块。

Python 关系表达式
关系表达式指用关系运算符,连接两个类型相同的数据组成的表达式。关系表达式的值是布尔型。

| 数据类型名称 |数据表示形式 |
|布尔型(bool)|只有两种值:True和False,即真和假,也就是成立或不成立|

Python常见的关系运算符

关系运算符 表达式 描述 优先级
>,< x>y,x<y x大于y,x小于y 4
>=,<= x>=y,x<=y x大于等于y,x小于等于y 4
==,!= x==y,x!=y x等于y,x不等于y 4
in x in y x是y的成员 5

1.选择结构的简单应用

6810: 两个数较大,给定两个数让我们求较大的。
6810参考代码

a=int(input())
b=int(input())
if a>b:
    print(a)
else:
    print(b)

通过后你可以尝试下以下题目
6811 两个数较小、6774 求绝对值、6798 最外围人数、6772 吃香蕉、5354 阶梯电价、6837 区间测速、6833 停车场车位探测中的算法、6834 一元二次方程是否有实数根、5892 苹果和虫子

2.逻辑运算符的使用

6812: Alice的登录账号密码需要我们一个程序去检验其账号和密码。要同时满足账号和密码都是对的,这个可以用什么呢,可以用逻辑表达式中的与。

Python 逻辑表达式
逻辑表达式指用逻辑运算符,把逻辑变量连接起来的表达式。逻辑表达式的值仍是布尔型:真或假(True或False),真对应1,假对应为0。

Python常见的逻辑运算符

逻辑运算符 表达式 描述 优先级
and x and y x且y 7
or x or y x或y 8
not not x 非x 6

与其他编程语言不同的是, and中含False,返回False; 均为非False时,返回后一个值。or中, 至少有一个为非False时,返回第一个非False值。

所以本题直接将两个条件并列起来即可。
6812参考代码

user = input()
pwd = input()
if user == "admin" and pwd=="Python@16":
    print("Login successful")
else:
    print("Username or password is wrong")

可以尝试下1485: C语言实验题――整除,整除也就是取余后为0。

1485参考代码
x = int(input())
if x % 3 ==0 and x % 5 == 0:
    print('Yes')
else:
    print('No')

6766: 三角形判断,三角形满足两边之和大于第三边,所以我们需要把三个条件全都判断一下即可。
6766参考代码

a=int(input())
b=int(input())
c=int(input())
if a+b>c and b+c>a and a+c>b:
    print("1")
else:
    print("0")

我们来看一下6763: 收集瓶盖赢大奖,满足一个条件即可。需要运算我们逻辑运算符的or。
6763参考代码

a=int(input())
b=int(input())
if a>=10 or b>=20:
    print("1")
else:
    print("0")

通过后你可以尝试下以下题目
6765 判断是否为两位数、5893 晶晶赴约会、6767 点和正方形的关系、6435 判断是否存在重复的数、6766 三角形判断、6793 三角形判断2

3.向上取整和向下取整

6445: 小z游东湖,大船可以乘6人,小船可以乘4人, x 人准备一起划船,最少需要多少条船。首先会选择大船,因为大船坐人多。余1~4可以选1条小船,余5人可以选1条大船。这个题目不关心你选的大船还是小船,所以只需要有人剩下就选择一条大船就可以了。

6445参考代码1

a=int(input())
if a%6==0:
    print(a//6)
else:
    print(a//6+1)

当然我们也可以用roud函数进行向上取整,如果给定为小数,那么将其+0.5之后四舍五入即可。

函数格式:round(number)。
函数功能:返回浮点数number的四舍五入值。

6445参考代码2

a=int(input())
ans=a/6
if ans==int(ans):
    print(int(ans))
else:
    print(round(ans+0.5))

6792: 出租车收费3千米以内(含3千米)收费10元,超过3千米的部分每千米收费2元(不足1km按1km算)。给定行驶路程s,问我们费用y。
首先这是一个分段函数,需要将其分成s<=3和s>3的情况。

\[\begin{equation} y= \begin{cases} 10&\mbox{s<=3}\\ 10+(\lceil s \rceil -3) \times 2&\mbox{s>3} \end{cases} \end{equation} \]

我们可以根据以上式子转换为代码
6792参考代码1

s=float(input())
#向上取整
if int(s)!=s:
    s=round(s+0.5)
#计算金额
if s<=3:
    m=10
else:
    #由于s可能是浮点数,所以这里不转换,输出需要转换一下
    m=10+(s-3)*2
print(int(m))

+0.5比较鸡肋,不是整数直接+1写起来更简单
6792参考代码2

s=float(input())
#向上取整
if int(s)!=s:
    s=int(s)+1
else:
    # 缺少这步会wa,因为如果是整数你的类型不对
    s=int(s)
#计算金额
if s<=3:
    m=10
else:
    m=10+(s-3)*2
print(m)

通过后你可以尝试下以下题目
6651 bth的工程问题、6632 candy妈妈分油、6587 计算分段函数、6768 计算邮资、6845 星期几问题

4.多分支语句

除了直接的if else,我们还可以使用elif,也就是在else中继续写条件。

if <条件> :
  <语句块1>
elif <条件2>:
  <语句块2>
···
elif <条件n>:
  <语句块n>
[else:
  <语句块2>]
5908: 三个数的最大值 给定3个数,请你帮忙求出最大值。
我们设3个数依次为a,b,c,三个数要么a最大,要么b最大,要么c最大。
a最大需要满足什么条件呢?a>b且b>c
如果a不是最大,b最大需要满足什么条件呢?b>a且b>c,即然a已经不是最大了,那么直接b和c就可以了,条件可以简化为b>c
a、b都不是最大,那么c就是最大值了,我们可以将如上逻辑写为代码
5908参考代码1

a=int(input())
b=int(input())
c=int(input())
if a>b and a>c:
    print(a)
elif b>c:
    print(b)
else:
    print(c)

如果是10个数要比大小呢?这个判断也太复杂了,我们可以尝试简化下逻辑。
我们默认第一个数为最大值,然后再让第二个数与最大值比较,如果比最大值还大说明第二个数为最大值,这时候最大值为前两个数的最大值,依次类推即可。
5908参考代码2

a=int(input())
b=int(input())
c=int(input())
max_value=a
if b>max_value:
    max_value=b
if c>max_value:
    max_value=c
print(max_value)

通过后你可以尝试下以下题目
5909 三个数的最小值、4590 最大值-最小值、1463 C语言实验题――相加和最大值、6153 优惠方案选择、6821 运动会名次、6823 空气质量查询、6822 浙江省汽车牌号所在地查询

5.逻辑运算符的组合

闰年很熟悉吧,四年一闰,百年不闰,四百年又闰。所以闰年满足什么条件呢,如果是4的倍数可能是闰年,但是世纪年不是闰年,而且四百的倍数是闰年。
所以满足是4的倍数而且不是100的倍数就是闰年,但是如果是400的倍数也是,也就是条件的嵌套,我们可以使用elif语句。
6773: 闰年判断 给定年份让我们判断闰年。
6773参考代码1

year = int(input())
if year % 4 == 0 and year % 100 != 0:
    print(1)
elif year % 400 == 0:
    print(1)
else:
    print(0)

当然两个的闰年条件我们可以合并,and的优先级高于or的优先级,可以不用()
6773参考代码2

year = int(input())
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
    print(1)
else:
    print(0)

通过后你可以尝试下以下题目
6764 有一门课不及格的学生、6849 图书优惠问题、5978 公平分配、3712 自动门控制

四、循环结构

1.for循环

7179: 输出字符串的各个字符 要求我们输出字符串内各个字符。
长度也不长,用len()函数量出长度分别写吗?也太累了!计算机最擅长的事情就是循环,计算机1秒可以运行10亿次,我们我们本题需要使用循环完成。
for 循环语句是通过遍历某一序列对象来构建循环,循环结束的条件就是对象遍历完成。for 循环语句的一般格式是:
for <变量> in <序列>:
  <循环体>
[else:
  语句块]
执行过程:
<变量>每经过一次循环,就会得到序列中的一个元素,并通过循环体处理它。
<序列>通常是字符串、列表、range 对象实例等。当序列中的元素全部遍历完时,程序就会自动退出循环,继续执行 else 子句的语句块。

7179参考代码1(成员资格运算符输出)

s=input()
for i in s:
    print(i)

Python里还有range()函数来控制循环次数。

格式:range([start,]stop[,step])。
功能:创建一个整数列表。
参数:起始值(缺省值为0),终值(但不包括),步长(缺省为1)。
那能否用利用len()函数输出字符串的各个字符呢,当然也是可以的,量出长度n,range(n)即可

7179参考代码2(遍历索引输出)

s=input()
n=len(s)
for i in range(n):
    print(s[i])

4734: C语言循环水题1 我们用range来完成下4734吧,即range(1,n+1)
4734参考代码

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

通过后你可以尝试下以下题目
5954 输出1到n中的奇数、5955 输出1到n中的偶数、5956 输出a与b之间的所有奇数、6776 Alice的幸运数、6778 开心的yym 2.0、6871 jjy之5.20、6912 感慨的yym

5951: 求1到n的和 要求我们求1~n的和,我们需要设置个袋子,比如sum_value用来记录总和,4734我们将每个元素输出,现在我们需要把他们全部加起来。
5951参考代码

n=int(input())
sum_value=0
for i in range(1,n+1):
    sum_value=sum_value+i
print(sum_value)

通过后你可以尝试下以下题目
5952 求1到n中的奇数的和、5953 求1到n中的偶数的和、5894 被17整除

4735: C语言循环水题2 倒着按序输出1到n内的所有整数。
和切片有点类似哦,我们需要把range的step设为-1,即range(n,0,-1)
4735参考代码

n=int(input())
for i in range(n,0,-1):
    print(i)

通过后你可以尝试下以下题目
6856 倒着输出1到n中的奇数、5958 倒着输出1到n中的偶数、5957 倒着输出a与b之间的所有偶数

2.for循环的实际运用

6975: 小z的账单 现在有个账单需要我们去统计下最终盈余。
我们需要读入n次数据,我们在循环内读入并将其加入sum_value即可。range(n)即可完成n次循环。
6975参考代码

n=int(input())
sum_value=0
for i in range(n):
    x=int(input())
    sum_value=sum_value+x
print(sum_value)

通过后你可以尝试下以下题目
6835 超市收银系统、3296 汉堡包、6641 压岁钱

5895: 1、5、10 要求我们统计n个数中1、5、10的个数。
我们可以设置3个num(个数)用来统计个数,符合就+1。
5895参考代码

n=int(input())
num1=0
num2=0
num3=0
for i in range(n):
    x=int(input())
    if x==1:
        num1=num1+1
    if x==5:
        num2=num2+1
    if x==10:
        num3=num3+1
print(num1,num2,num3,sep="\n")

通过后你可以尝试下以下题目
5222 奇偶分家、6438 与指定数字相同的数的个数

1459: 求最大值 这个题就需要使用我们3个数最大值那个思路了。
假设第一个数为最大值,之后n-1个数一一比较,如果比最大值大,就把它换为最大值,相当于每次都和最大值比较。
可以把第一个数在循环里特殊处理
1459参考代码1

n = int(input())
for i in range(n):
    x = int(input()) 
    if i==0:
        max_value = x
    elif x>max_value:
        max_value = x
print(max_value)

也可以把第一次单独列出来,之后循环n-1次进行比大小
1459参考代码2

n = int(input())
max_value = int(input()) 
for i in range(n-1):
    x = int(input()) 
    if x>max_value:
        max_value = x
print(max_value)

通过后你可以尝试下以下题目
7180 求最小值、6836 新年大合唱比赛得分

5886: 计算2的幂 2的n次方代表n个2相乘,那我们循环n次,每次乘2就可以了。那么2的0次方呢,任何数的0次方都等于1,那么*2就正好不会出错了,遇到需要相乘的,sum_value需要初始化为1。
5886参考代码

n=int(input())
sum_value=1
for i in range(n):
    sum_value=sum_value*2
print(sum_value)

通过后你可以尝试下以下题目
6859 乘方计算、5973 移动小数点、6732 阶乘、6860 求小数的某一位

6844: 设备价格问题 已知从第2年到第6年,每年初的价值比上年初减少10万元;从第7年开始,每年初的价值为上年初的75%。
我们循环年份,将其分为两段即可。
6844参考代码

s=120
n=int(input())
for i in range(2,n+1):
    if 2<=i<=6:
        s=s-10
    if i>=7:
        s=s*75/100
print(format(s,'.2f'))

通过后你可以尝试下以下题目
6824 数麦粒、6862 反弹高度

3.while循环及其实际应用

for针对固定次数的循环,有的时候循环次数不确定,我们可以使用while循环。
while 循环,又称为条件循环。while 循环语句的一般格式如下:
while <条件> :
  <循环体>
[else:
  语句块]
当条件判断为 True 时,循环体被重复执行,当条件判断为 False 时退出循环,else 子句的语句块才会被执 行。若条件表达式的值一直为True,则 while 循环将一直执行。因此,在循环体中一定要包含改变测试条件的语句,使循环能够结束,以避免死循环。
使用for输出1~20
参考代码

for i in range(1,21):
    print(i)

使用while循环输出1~20

i=1
while i<21:
    print(i)
    i=i+1

猜数游戏
在给定某数后,让用户输入数进行猜测,计算机给出相应提示,如偏大、偏小或正确。若所猜测的数正确,则输出猜测次数,否则继续猜数。
猜数游戏参考代码

num=66
i=0
while True:
    guess=int(input("请输入猜测的数:"))
    if guess<num:
        print("偏小")
        i=i+1
    elif guess>num:
        print("偏大")
        i=i+1
    else:
        print("正确,共猜测次数:",i+1)
        break

当然我们可以随机一个数,让他变得更有趣。random模块可以随机数字

import random
# 随机生成一个[1,100]的整数
num=random.randint(1,100)

循环控制语句

循环控制语句主要有 break 和 continue

  1. break语句
    功能:跳出当前循环,不再判断执行循环的条件是否成立。
  2. continue语句
    功能:结束当前的当次循环,但不跳出当前循环,继续判断执行循环的条件是否成立。

6825: 储蓄问题 已知某同学有一些零用钱,他想通过银行储蓄增值。问:存多少年,才能达到预期的数额?
下一年钱=本金+利息=本金+本金*利率,所以我们可以将获得钱做为条件
6825参考代码

i=0
p=float(input())
q=float(input())
while p<q:
    p=p+p*0.03
    i=i+1
print(i)

通过后你可以尝试下以下题目
6843 城市人口问题、5006 害死人不偿命的(3n+1)猜想
*平台存在部分题目以EOF结束,可以使用while循环+捕捉异常的方法。

while True:
    try:
        a=input()
        
    except EOFError:
        break

4.二重循环

5400: 打印乘法表 要求我们打印n*n的乘法表
乘法表第1行1列,第2行2列,...,第9行9列,第i行i列,输出必须从上到下,从左到右,所以我们要一行一行输出。
每一行第一个数依次递增,第二个数为行数,所以循环变量i为行,j为列控制即可。
制表符为'\t',这个题需要特别控制,由于两个之间有一个制表符。我们可以将问题简化为第一个式子正常输出,第二个式子之后先输出制表符之后输出式子,即在循环里判断下即可。
5400参考代码1

n=int(input())
for i in range(1,n+1,1):
    for j in range(1,i+1,1):
        if j!=1:
            print("\t",end="")
        print(j,'*',i,'=',i*j,sep="",end="")
    print()

通过后你可以尝试下以下题目
1457 C语言实验题――求一个3*3矩阵对角线元素之和、3064 判断闰年

5.打印图形

7181: 漂亮菱形简易版
循环分两部分,分别输出上下
上下对称,上部分输出好,行倒着输出下半部分。
上部分空格依次为4,3,2,1,即n//2+1-x
上部分*依次为1,3,5,7,9,即(2*x-1)
下半部分循环逆置
7181参考代码1

n = int(input())
for x in range(1,n//2+1+1):
    print(' '*(n//2+1-x),end='')
    print('*'*(2*x-1))
for x in range(n//2,0,-1):
    print(' '*(n//2+1-x),end='')
    print('*'*(2*x-1))

输入n输出n行。
第一行有4个空格,第二行有3个空格,第三行有2个空格,第四行有1个空格,第五行有0个空格,第六行有1个空格,第七行有2个空格,第八行有3个空格,第九行有4个空格
我们设空格个数为y,行号为x,当n为9时*可以列方程求解为\(y=|5-x|\) ,5为(n+1)/2求得
同理可以求得*个数的表达式为\(y=n-|n+1-2*x|\)
7181参考代码2

n = int(input())
for x in range(1,n+1):
    print(' '*abs((n+1)//2-x),end='')
    print('*'*(n-abs(n+1-2*x)))

通过后你可以尝试下以下题目
1172 C语言实验题――打印菱形、5970 打印长方形、6145 打印平行四边形、6319 Alice与字母K、6498 2021加油、1177 C语言实验题――打印数字图形

五、枚举算法

在很多时候,由于人类大脑的运算和处理能力相对有限,无法立刻得出某个问题的可能解或最优解,如复杂密码的破解。但是,人们可以利用计算机运算速 度快和存储容量大的特点,采用最原始的破解方法——枚举法。
6842: 整数的因子 给定整数n求其因子。
因子只能是1到它本身,我们可以依次遍历,如果是(n%i==0)则输出。
6842参考代码

n=int(input())
for i in range(1,n+1):
    if n%i==0:
        print(i)

通过后你可以尝试下以下题目
6788 找数字、6628 回文之99倍数、6847 韩信点兵、6855 寻找水仙花数、

百钱买鸡
我国古代数学家张丘建在《算经》中提出了如下的数学问题:鸡翁一,值钱五;鸡母一, 值钱三;鸡雏三,值钱一;百钱买百鸡,问翁、母、雏各几何?
意思就是:公鸡五文钱一只,母鸡三文钱一只,小鸡三只一文钱,用100文钱买 100只鸡,公鸡、母鸡、小鸡各买多少只?
设公鸡有 x 只、母鸡有 y 只,小鸡有 z 只。根据题意,若全部买公鸡,则最多可以买 \(\frac{100}{5}\)只,因此 x 的取值范围为 0 ≤ x ≤ 20 ;若全部买母鸡,则最多可以买 \(\frac{100}{3}\) 只,因此 y 的取值范围为 0 ≤ y ≤ 33 ;若全部买小鸡,则最多可以买 100×3只,但鸡总共只有 100 只,因此 z 的取值范围为 0 ≤ z ≤ 100 。

\[\begin{cases} x+y+z=100 \\5x+3y+\frac{1}{3}z=100\end{cases} \]

枚举公鸡只数x,母鸡只数y,小鸡只数为(100-x-y),判断\(5x+3y+ \frac{1}{3}(100 - x - y)=100\)即可
百钱买鸡参考代码

count=0 #循环计数
for x in range(21):
    for y in range(34):
        count = count + 1
        if 5*x+3*y+(100-x-y)/3==100:
            print("公鸡:",x,"母鸡:",y,"小鸡:",100-x-y)
print("循环运行次数:",count)

枚举算法总结
基本思想是把问题所有的可能解一一列举出来,并判 断每一个列举出的可能解是否为正确的解。枚举算法的步骤:
(1)确定枚举对象、范围和判定条件。
(2)逐一枚举可能的解,并验证每个解是否为问题的解。
通过后你可以尝试下以下题目
6854 n钱买百鸡、6449 小z与直角三角形、6829 零钱兑换、6830 寻找完全数、2779 明明的幸运数

六、解析算法

6741: 动动有奖 有1个非常复杂的规则领取钱,我们可以分别考虑。
1.先考虑规则1
每天走路的前1000步奖励0.3金,之后每2000步奖励0.1金(不足2000步没有奖励),每天最高奖励不超过3金。
可以写出如下代码
6741规则1参考代码

if x>=1000:
    t=0.3+((x-1000)//2000)*0.1
    if t>3:
        t=3
else:
    t=0

2.再考虑规则2
每天必须到计步器页面点击“领奖”按钮,才能领取昨日走路奖金。
我们可以设置个f进行读入
6741规则2参考代码

if f==1:
    if x>=1000:
        t=0.3+((x-1000)//2000)*0.1
        if t>3:
            t=3
    else:
        t=0
else:

3.考虑规则3
如果连续3天领奖成功,从第4天起走路奖金翻1倍(乘以2),每天最高奖励不超过6金。翻倍期间若有1天没有领奖(即连续每天领奖行为中断),则翻倍权益取消,重新连续3天领奖成功才能继续翻倍。
我们可以设置一个c代表签到天数
6741规则3参考代码1

if f==1:
    ...
else:
    c=0

f=1,连签签到天数+1,否则归零。
+t之前进行判断
连签每天最高奖励不超过6金,和规则1每天最高奖励不超过3金重复,可以不用判断。
6741规则3参考代码2

c=c+1
if c>=4:
    s=s+2*t
else:
    s=s+t

自然语言描述
①输入总天数n
②表示天数的变量i初始化为1
③若i≤n,则转④,否则转⑦。
④输入第i天的数据(包括第i天走路步数X;,是否成功领取第i天“奖金”的标
记F;)
⑤根据当前输入的数据Ⅹ,F,统计该天领取的奖金并累加到总奖金 total中。
⑥表示天数的变量i增加1,然后转③。
⑦输出变量 total的值。
6741参考代码

n = int(input())
s,c = 0,0
for i in range(n):
    x,f=map(int,input().split())
    if f==1:
        if x>=1000:
            t=0.3+((x-1000)//2000)*0.1
            if t>3:
                t=3
        else:
            t=0
        c=c+1
        if c>=4:
            s=s+2*t
        else:
            s=s+t
    else:
        c=0
print(format(s,'.1f'))

通过后你可以尝试下以下题目
6744 条形码、6848 篮球得分预测问题、5604 Kannyi打印模板、4391 集气袋、4790 津津的储蓄计划

七、后记

在此对浙教版信息技术教材的编写者表示崇高的敬意,万分感谢帮助本文章完成的台州学院老师以及各位朋友,感谢你们对中学计算机教育付出的努力。同时也希望各位读者可以掌握Python编程这门技术,解放生产力,为我国的数字化进程添砖加瓦。若要继续学习,参见 Python编程与实际应用-已鸽,对应为高中信息技术必修1、2中应用部分;Python编程与数据结构-已鸽,对应为高中信息技术选择性必修1内容。

posted @ 2021-01-28 19:57  暴力都不会的蒟蒻  阅读(5410)  评论(2编辑  收藏  举报