HNU计算与人工智能Python期中复习指南
目录
基本操作
格式化输入输出:
输入
行内输出和换行输出
%的用法
f-string用法
format的用法
例题
对小数逆序
格式化输出
Ascll码
chr()函数
ord()函数
Math库
字符串
常见函数
分割字符串
例题
查找字符串string.find()
字符串切片
分支结构
例题:币种转换
例题:求最大值
例题:输入年月输出该月的天数
例题:计算水费
例题:判断三角形的类型
例题:根据身份证判断是否达到结婚年龄
循环结构
例题:continue的用法
例题:计算正弦值
例题:求秋水仙花数
例题:求前n项和
例题:凯撒密码加密
例题:输出给定范围内所有素数
例题:求表达式n项之和
例题:n个钱买n只鸡的问题
例题:剩余材料最短
例题:打印图形
例题:判断身份证号码是否有效
列表
列表函数
列表比较
列表切片
例题1
一些函数的用法
列表推导式
嵌套列表
一些例题
例题1
期中模拟题
选择题
编程题
例题一:数学公式
例题二:数列求和
例题三:实际问题(工资)的分支结构
斐波那契数列:
例题四:ISBN校验码
例题五:对列表的切片以列表函数的应用
例题六:Python计算银行利率
一些有意思的题目
题1:最大整数
题2:简单计算
题3:函数处理
题4:字符图网格
题5:逗号代码
一类题:字符图形
基本操作
格式化输入输出:
输入
#输入18
#输入6
a=eval(input())
b=eval(input())
#逗号间隔输出两个整数
c,d=eval(input())
#空格间隔输入两个整数
e,f=input().split()#split()对字符串用以空格进行分隔
e=int(e)
f=int(f)
行内输出和换行输出
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
a=12
b=34
print(a,b) #默认以空格分隔
>>12 34
print("www","hnu","edu","com",sep=".") # 通过参数sep设置间隔符
>>www.hnu.edu.com
x,y,z=10,20,30
#先输出x,y,用','间隔,以'*'作为结尾符;再输出z。
#代码开始
print(x, y, sep=',', end='*')
print(z)
>>10,20*30
a,b=123,456
print(a) #默认自动换行
print(b)
运行结果:
123
456
#通过参数end设置结尾符,控制一行显示多个数据
print(a,end=' ')
print(b)
运行结果:
123 456
%的用法
name = "Alice"
age = 30
print("Name: %s, Age: %d" % (name, age))
f-string用法
name = "Alice"
age = 30
print(f"Name: {name}, Age: {age}")
format的用法
print("{序号:整数位.小数位}".format(x,y,z))
例题
对小数逆序
预期输入:123.4
预期输出:4.321
这里其实用到了字符串切片的内容
num=input()
reversed_num=eval(num[::-1])
print(reversed_num)
格式化输出
预期输入:3.14156,-3.14156
预期输出:x=3.142 ;y=*-3.14e+00**
x,y=eval(input())
print("x={0:<8.3f};y={1:*^12.2e}".format(x,y))
Ascll码
chr()函数
python内置函数chr根据传入的int类型参数返回对应的Unicode 码位的字符,比如chr(65) 返回的是字符串A,在ascii码表里,字符A的十进制值是65,chr的参数值大小可以超过ascii码表的范围,chr是ord的逆函数。
print(chr(65))
print(chr(66))
print(chr(97))
print(chr(98))
#输出
#A
#B
#a
#b
ord()函数
ord函数可以将字符转化为你所需要的ASCII码。
print(ord("a"))
print(ord("b"))
print(ord("A"))
print(ord("B"))
#输出97 98 65 66
Math库
from math import *
e |
自然常数e |
pi |
圆周率 |
sqrt(x) |
开方 |
inf |
返回正无穷大浮点数 |
ceil(x) |
对x向上取整,比如x=1.2则返回2 |
floor(x) |
对x向下取整,比如x=1.2则返回1 |
pow(x,y) |
指数运算,得到x的y次方 |
log(x[,base]) |
对数运算,默认基底为e,可自己设置基底base |
sin(x) |
正弦函数 (余弦为cos(x),正切为tan(x)) |
asin(x) |
反正弦函数(反余弦为acos,反正切为atan) |
asinh(x) |
返回x的反双曲正弦值(反双曲余弦acosh,反双曲正切atanh) |
sinh(x) |
返回x的双曲正弦值(双曲余弦cosh,双曲正弦tanh) |
degrees(x) |
弧度转角度 |
radians(x) |
角度转弧度 |
fabs(x) |
返回x的绝对值,返回浮点数 |
factoria(x) |
返回x的阶乘。若x不是整数或负数会报错 |
comb(n,k) |
返回不重复且无顺序从n项中选择k项的方式总数 |
exp(x) |
求e的x次方 |
fsum(iterable) |
返回可迭代对象(元组、列表等)中的元素总和,是浮点值 |
gcd() |
返回给定整数参数的最大公约数 |
isfinite(x) |
判断x是否有限。既不是无穷大也不是NaN则返回True |
isinf(x) |
判断x是否是无穷大。是正负无穷大则返回True |
isnan(x) |
判断x是否是NaN,如果是NaN(不是数字)则返回True |
字符串
常见函数
方法 |
描述 |
string.capitalize() |
把字符串的第一个字符大写 |
string.center(width) |
返回一个原字符串居中,并使用空格填充至长度 width 的新字符串 |
string.count(str, beg=0, end=len(string)) |
返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数 |
string.endswith(obj, beg=0, end=len(string)) |
检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False. |
string.expandtabs(tabsize=8) |
把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8。 |
string.find(str, beg=0, end=len(string)) |
检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1 |
string.index(str, beg=0, end=len(string)) |
跟find()方法一样,只不过如果str不在 string中会报一个异常. |
string.isalnum() |
如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False |
string.isalpha() |
如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False |
string.isdecimal() |
如果 string 只包含十进制数字则返回 True 否则返回 False. |
string.isdigit() |
如果 string 只包含数字则返回 True 否则返回 False. |
string.islower() |
如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False |
string.isnumeric() |
如果 string 中只包含数字字符,则返回 True,否则返回 False |
string.isspace() |
如果 string 中只包含空格,则返回 True,否则返回 False. |
string.istitle() |
如果 string 是标题化的(见 title())则返回 True,否则返回 False |
string.isupper() |
如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False |
string.join(seq) |
以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串 |
string.ljust(width) |
返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串 |
string.lower() |
转换 string 中所有大写字符为小写. |
string.lstrip() |
截掉 string 左边的空格 |
string.maketrans(intab, outtab) |
maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。 |
max(str) |
返回字符串 str 中最大的字母。 |
min(str) |
返回字符串 str 中最小的字母。 |
string.partition(str) |
有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 元 素 的 元 组 (string_pre_str,str,string_post_str),如果 string 中不包含str 则 string_pre_str == string. |
string.replace(str1, str2, num=string.count(str1)) |
把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次. |
string.rfind(str, beg=0,end=len(string) ) |
类似于 find() 函数,返回字符串最后一次出现的位置,如果没有匹配项则返回 -1。 |
string.rindex( str, beg=0,end=len(string)) |
类似于 index(),不过是返回最后一个匹配到的子字符串的索引号。 |
string.rjust(width) |
返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串 |
string.rpartition(str) |
类似于 partition()函数,不过是从右边开始查找 |
string.rstrip() |
删除 string 字符串末尾的空格. |
string.split(str="", num=string.count(str)) |
以 str 为分隔符切片 string,如果 num 有指定值,则仅分隔 num+1 个子字符串 |
string.splitlines([keepends]) |
按照行('\r', '\r\n', '\n')分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。 |
string.startswith(obj, beg=0,end=len(string)) |
检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查. |
string.strip([obj]) |
在 string 上执行 lstrip()和 rstrip() |
string.swapcase() |
翻转 string 中的大小写 |
string.title() |
返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle()) |
string.upper() |
转换 string 中的小写字母为大写 |
string.zfill(width) |
返回长度为 width 的字符串,原字符串 string 右对齐,前面填充0 |
分割字符串
str.split(sep, num)
返回的是列表
source_string = '1+2+3+4+5'
# 利用split()方法,按照`+`和`/`对source_string字符串进行分割
print(source_string.split('+'))
print(source_string.split('/'))
>>['1', '2', '3', '4', '5']
>>['1+2+3+4+5']
split()
单纯的split()只能分割单个字符串
如果引入re模块(这是一个python自带的模块)。re模块中的re.split('|',text),分隔的字符用|隔开
import re
#格式化显示字符串
poetry= input() #输入诗句
n=eval(input()) #请输入第几句
#代码开始
'''x=poetry.replace(',','。')
m=x.split('。')
print('{:*^20}'.format(m[n-1]))'''
m=re.split(',|。',poetry)
print('{:*^20}'.format(m[n-1]))
例题
从字符串提取数字
#字符串中提取数字
source_string= input() #输入字符串
#代码开始
numbers = [eval(x) for x in source_string.split(',')]
if len(numbers) < 3:
print("输入的字符串中至少需要包含3个逗号分隔的值。")
else:
print(numbers[0] + numbers[1] + numbers[2])
查找字符串string.find()
# 创建一个字符串
source_string = 'The past is gone and static'
# 查看"past"在source_string字符串中的位置
print(source_string.find('past'))
# 查看"love"在source_string字符串中的位置
print(source_string.find('love'))
字符串切片
str[起始:终止:间隔]
左开右闭,取不到终止位置
a = 'I like python'
print(a[2:6])
#'like'
print(a[2:-7])
#'like'
间隔,也可以是负数,表示反向间隔
a = '123456789'
a[::-2]
#'97531'
反向间隔2个索引位置进行切片,就得到了'97531', 如果想翻转字符串,则应该这样处理
a = '123456789'
a[::-1]
#'987654321'
这段代码表示从索引0到字符串默认进行切片,处理的方式是反向间隔1个索引位置进行切片处理,这样就得到了字符串的翻转结果
分支结构
if :
else:
例题:币种转换
任务描述
本关任务:输入带有货币符号($表示美元,¥表示人民币)的货币值,转换并显示为另一种货币,若输入错误显示“格式错误”。注意:用户输入带有符号的货币值,符号($或者¥)需放在数值之前。
汇率是两种货币之间兑换的比率,设当前美元对人民币的汇率为6.473,1美元USD兑换6.473人民币CNY ,即1USD=6.473CNY。
人民币符号¥的输入:中文输状态下输入$符号。
#币种转换
rate=6.473 #汇率
money=input() #输入带符号的货币值
#代码开始
if money[0]=='$':
m=float(money[1:])*rate
print('人民币是¥{:.2f}元'.format(m))
elif money[0]=='¥':
m=float(money[1:])/rate
print('美元是${:.2f}元'.format(m))
else:
print("格式错误")
例题:求最大值
本关任务:输入三个任意数值,找出最大值。
#求最大值
a=eval(input()) #输入三个数值a、b和c
b=eval(input())
c=eval(input())
#代码开始
if a<b:
m=b
else:
m=a
if m<c:
m=c
else:
m=m
print(m)
例题:输入年月输出该月的天数
本关任务:输入年份和月份,输出该月天数。
提示:有31天的月份为[1,3,5,7,8,10,12]月;
有30天的月份为[4,6,9,11]月;
二月可能是29或28天,对输入年份需要判断是否是闰年。
#输入年月输出该月的天数
year=eval(input()) #输入年份
month=eval(input()) #输入月份
day=0 #天数
#代码开始
if month in [1,3,5,7,8,10,12]:
day=31
elif month in [4,6,9,11]:
day=30
else:
if year%4==0 and year%100!=0 or year%400==0:
day=29
else:
day=28
例题:计算水费
本关任务:计算每月水费。
输入上月水表读数、本月水表读数、家庭人数和是否低保(y/n),计算并输出用水度数和水费。
某市水费价格实施阶梯式水价制度:
(1)凡四口之家及以下,按户均用水量计价。
第一阶梯:每户每月15吨以下(含15吨)为2.88元/吨;第二阶梯:每户每月15~
22吨(含22吨)为3.64元/吨;第三阶梯:每户每月22吨上为4.39元/吨。
(2)凡五口之家及以上,按人均用水量计价。
第一阶梯:每人每月4吨(含4吨)为2.88元/吨;第二阶梯:每人每月4~
5吨(含5吨)为3.64元/吨;第三阶梯:每人每月5吨以上为4.39元/吨。
此外,对于低保居民,每月每户减免6吨用水量。
若本月实际用水量不足6吨,余留量不可累积至下月使用,显示本月用水吨数为0吨。
#计算每月水费
last=eval(input("上月水表读数(吨):"))
current=eval(input("本月水表读数(吨):"))
number=eval(input("家庭人数:"))
low_income=input("是否低保(y/n):")
amount=0 #每月用水吨数
money=0 #每月水费
#代码开始
if low_income=='y':
amount=current-last-6
if amount<0:
amount=0
else:
amount=current-last
if number<=4:
if amount<=15:
money=2.88*amount
elif amount>15 and amount<=22:
money=2.88*15+3.64*(amount-15)
else:
money=+2.88*15+3.64*7+4.39*(amount-22)
else:
if amount/number<=4:
money=2.88*amount
elif amount/number>4 and amount/number<=5:
money=2.88*number*4+(amount/number-4)*3.64*number
else:
money=2.88*number*4+3.64*number+(amount/number-5)*number*4.39
#代码结束
print("本月用水吨数(减免后){:.2f}吨,水费{:.2f}元。".format(amount,money))
例题:判断三角形的类型
任务描述
本关任务:编写一个根据三角形的三条边长,判定是何种三角形的程序。
如何判定三角形的类型
依题意:
根据输入三角形的三条边,
(1)首先判定能否构成三角形:任意两边之和大于第三边。
(2)满足(1)的前提下,考虑各种三角形的类型:
"正三角形":要求三边相等;
"等腰三角形":要求三边中只有两边相等;
"直角三角形":要求两边的平方和等于第三边平方和;
"一般三角形"。
- 不满足(1)则"不构成三角形"
#判定三角形类型
a=eval(input()) #输入三角形的三条边a、b和c
b=eval(input())
c=eval(input())
#代码开始
while a+b>c and a+c>b and b+c>a:
if a==b and b==c:
print("正三角形")
elif a==b or b==c or a==c:
print("等腰三角形")
elif a**2+b**2==c**2 or a**2+c**2==b**2 or b**2+c**2==a**2:
print("直角三角形")
else:
print("一般三角形")
break
else:
print('不构成三角形')
例题:根据身份证判断是否达到结婚年龄
我国身份证是18位,第7~14位表示出生年月日,第17位是性别表示位,奇数为男性,偶数为女性。输入一个身份证号,首先判断其长度是否正确;若正确再判断输出其性别及是否到了合法结婚年龄。
我国婚姻法规定,男性22岁和女性20岁为合法结婚年龄。本题不考虑月份,以2022年为参考,2001年1月1日后出生的男性和2003年1月1日后出生的女性视为未到法定结婚年龄。
#根据身份证号判断是否到了合法结婚年龄
id= input() #输入身份证号码
#代码开始
id_list=[int(x) for x in id]
if len(id_list)==18:
if id_list[16]%2==0:
print('性别:女')
if 2022 - int(''.join(map(str, id_list[6:10])))>=20:
print('达到合法结婚年龄')
else:
print('未到合法结婚年龄')
else:
print('性别:男')
if 2022 - int(''.join(map(str, id_list[6:10])))>=22:
print('达到合法结婚年龄')
else:
print('未到合法结婚年龄')
else:
print('身份证号错误')
循环结构
for i in range(n):
语句块
continue
用来结束当次循环,即跳过循环体中continue后面还未执行的语句,直接进入下一次循环。
break
不执行后面语句结束最深层次循环
例题:continue的用法
本关任务:通过循环计算并输出满足条件的正方体的体积:正方体棱长从1到10依次计算,当体积小于100不输出。
#continue的用法
#代码开始
for length in range(1, 11):
volume = length ** 3
if volume < 100:
continue # 如果体积小于100,则跳过当前迭代,进入下一次迭代
print(volume)
例题:计算正弦值
本关任务:正弦值的近似计算公式为:sin
x
=
x
−3!/
x^3
+5!/
x^5
−7!/
x^
7+⋯
从键盘输入x的值(x为弧度值),利用以上公式计算sinx
,将所有绝对值大于等于精度eps
的项值进行累加(eps
的值设为1
e
−7
即10^−7
)。
结果保留7位小数。
#求正弦值
from math import *
x=eval(input()) #输入弧度值
#代码开始
eps = 10 ** (-7)
t = x
n = 1
s=0
while abs(t) >= eps:
s +=t
n += 2
t = ((-1) ** ((n - 1) / 2)) * (x ** n) / factorial(n)
print("%.7f"%s)
例题:求秋水仙花数
本关任务:水仙花数是一个三位数的自然数,该数各位数字的立方和等于该数本身,例如:153为水仙花数,13+53+33=153
。
由小到大分行输出所有水仙花数。
提示:需要求出数值上的每位数字。
#水仙花数由小到大分行输出
#代码开始
for i in range(1,10):
for j in range(0,10):
for k in range(0,10):
if i**3+j**3+k**3==i*100+j*10+k:
print(i*100+j*10+k)
例题:求前n项和
本关任务:求s= a + aa + aaa + … + aa…a 的值(最后一项中 a 的个数为 n ),其中 a 是一个1~9的数字,例如: 当a=2,n=5时,s= 2 + 22 + 222 + 2222 + 22222
#求s= a + aa + aaa + … + aa…a
a=eval(input()) #输入a值
n=eval(input()) #输入最后一项中 a 的个数 n
#代码开始
sn=0
an=0
for i in range(n):
an+=a*10**i
sn+=an
print(sn)
例题:凯撒密码加密
plaincode= input("") #输入明文
#代码开始
for i in plaincode:
if i>='a' and i<='z':
print(chr(ord('a')+(ord(i)-ord('a')+3)%26),end='')
elif i>='A' and i<='Z':
print(chr(ord('A')+(ord(i)-ord('A')+3)%26),end='')
else:
print(i,end='')
例题:输出给定范围内所有素数
本关任务:输出给定范围以内的所有素数。输出时,每行显示10个数。
程序从测试集中读取到数据范围m,求2~m之间所有素数。
#求给定范围内的所有素数
m=eval(input()) #输入范围
#代码开始
count=0
for i in range(2,m+1):
for j in range(2,i):
if i%j==0:
break
else:
print(i,end=' ')
count+=1
if count%10==0:
print(end='\n')
例题:求表达式n项之和
#求n项之和
n=eval(input())
#代码开始
an=0
sum=0
for i in range(1, n+1):
an+=i
sum+=1/an
print('%.6f'%sum)
#代码结束
例题:n个钱买n只鸡的问题
本关任务:每只公鸡价值5元,每只母鸡价值3元,每3只小鸡价值1元。现有n个钱想买n只鸡,问公鸡、母鸡、小鸡各买几只?
依次输出公鸡母鸡小鸡的数目,如输出结果:22 23 45
#n个钱买n只鸡问题
print("依次输出公鸡 母鸡 小鸡的数量:")
n=eval(input()) #n表示钱的总数和鸡的总数
#代码开始
for i in range(0,n+1):
for j in range(0,n-i+1):
k=n-i-j
if 5*i+3*j+k/3==n:
print('%d %d %d'%(i,j,k))
else:
continue
#代码结束
例题:剩余材料最短
本关任务:求出剩余材料最短的切割方案。
一根长度为n米的钢管,需要截成长度为19米和23米的两种短管。求两种短管各截多少根时剩余的材料最少?
注意:1、钢管的长度大于等于42。
2、每种短管必须大于等于一根。
3、如果存在多种方案时,请输出19米的数目最少的方案。
#剩余材料最短
length=eval(input()) #输入钢管长度
n=0 #19米为n段
m=0 #23米为m段
rest=length #剩余材料长度
#代码开始
nmax=length//19
mmax=length//23
for i in range(1,nmax+1):
for j in range(1,mmax+1):
temp=length-19*i-23*j
if rest>temp>=0:
n=i
m=j
rest=temp
#代码结束
print("切割方案:19米{}段,23米{}段,剩余{}米.".format(n,m,rest))
例题:打印图形
本关任务:
输入行数,打印如下字母金字塔图形:
输入:7
打印图形如下:
#打印字母图形
n = eval(input()) #输入行数
#代码开始
for i in range(0,n):
for j in range(1,n-i):
print(' ',end='')
for k in range(65+i,64,-1):
print(chr(k),end='')
for h in range(66,66+i):
print(chr(h),end='')
print(end='\n')
#代码结束
例题:判断身份证号码是否有效
本关任务:输入一个身份证号码,判断其是否有效:
身份证校验码产生的规则如下所示:
(1) 将身份证号码的前17位数字分别乘以不同的系数,
从第1位到第17位的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2 ;
(2) 将这17位数字和系数相乘的结果进行相加;
(3) 用加出来的和除以11,看余数是多少;
(4) 余数只可能是0、1、2、3、4、5、6、7、8、9、10这11个数字。其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2,其中的X(大写)是罗马数字10;
通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ;如果余数是10,身份证的最后一位号码就是2。
id = input("请输入身份证号:")
xishu = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
last = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
if len(id) != 18:
print('长度错误')
else:
for i in id[:17]:
if not i.isdigit():
print('存在无效字符')
break
else:
sum = 0
for j in range(17):
sum += int(id[j]) * xishu[j]
yushu = sum % 11
if str(last[yushu]) == id[17]:
print('正确校验码')
else:
print('错误校验码')
#代码结束
列表
列表函数
len(list) |
列表元素个数 |
max(list) |
返回列表元素最大值 |
min(list) |
返回列表元素最小值 |
list(seq) |
将元组转换为列表 |
Python包含以下方法:
list.append(obj) |
在列表末尾添加新的对象 |
list.count(obj) |
统计某个元素在列表中出现的次数 |
list.extend(seq) |
在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表) |
list.index(obj) |
从列表中找出某个值第一个匹配项的索引位置 |
list.insert(index, obj) |
将对象插入列表 |
list.pop([index=-1]) |
移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 |
list.remove(obj) |
移除列表中某个值的第一个匹配项 |
list.reverse() |
反向列表中元素 |
list.sort( key=None, reverse=False) |
对原列表进行排序 |
list.clear() |
清空列表 |
list.copy() |
复制列表 |
列表比较
这里要导入operator模块(不详细介绍)
小于 |
|
|
小于等于 |
|
|
等于 |
|
|
不等于 |
|
|
大于等于 |
|
|
大于 |
|
|
列表切片
切片操作要求左闭右开,具体可以去看上面字符串的
lst = [1, 2, 3, 4, 5]
print(lst[::-2]) # [5, 3, 1]
print(lst[::-1]) # [5, 4, 3, 2, 1]
例题1
测试输入:
pizza
chicken
carrot
apple
banana
预期输出:
['pizza','apple']
['carrot','apple','banana']
# coding=utf-8
# 创建并初始化my_menu列表
my_menu = []
while True:
try:
food = input()
my_menu.append(food)
except:
break
# 请在此添加代码,对my_menu列表进行切片操作
########## Begin ##########
print(my_menu[0::3])
print(my_menu[-3:])
一些函数的用法
使用collections模块中的Counter类来统计频次统计频次
# 示例列表
my_list = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3]
# 使用collections模块中的Counter类来统计频次
from collections import Counter
counter = Counter(my_list)
print(counter)
map函数的用法
map(function,iterable(可迭代对象))
1.简单数值的迭代
a=[3.7,9,10,34]
b=list(map(int,a))
c=list(map(str,b))
注意:在python3中map()的返回值不是list,需要自己转化为list
2.自创函数
def sum(x)
return x**2
m=(1,2,3)
n=list(map(sum,m))
print(n)
3.使用map函数将分割出来的字符序列转化为整型序列,再使用list函数将这个整型序列转化成列表
lis=list(map(int,input().split()))
还有一种写法:
lis=list(input().split())
for i in range(len(lis)):
lis[i]=int(lis[i])
列表推导式
给定一个数字列表,从列表中删除所有奇数:
numbers = [3,5,45,97,32,22,10,19,39,43]
result = []
for number in numbers:
if number % 2 == 0:
result.append(number)
print(result)
列表理解方式
result = [number for number in numbers if number % 2 == 0]
print(result)
给定数字列表,删除浮点数(带小数的数字)
original_list=[2,3.75,.04,59.354,6,7.7777,8,9]
only_ints=[number for number in original_list if type(number)==int]
print(only_ints)
找到 1-1000 中所有能被 7 整除的数字
div7 = [n for n in range(1,1000) if n % 7 == 0]
print(div7)
查找 1-1000 中所有带有 3 的数字
three = [n for n in range(0,1000) if '3' in str(n)]#将整数转化为字符串类型
print(three)
计算字符串中的空格数
some_string = 'the slow solid squid swam sumptuously through the slimy swamp'
spaces = [s for s in some_string if s == ' ']
print(len(spaces))
[i for i in some_string].count(' ')
print(some_string.count(" "))
list1 = [x for x in str1 if x.isspace()]
从列表中获取索引和值
'''
Get the index and the value as a tuple for items in the list ["hi", 4, 8.99, 'apple', ('t,b','n')]. Result would look like [(index, value), (index, value)]
'''
items = ["hi", 4, 8.99, 'apple', ('t,b','n')]
result = [(index, item) for index, item in enumerate(items)]
print(result)
找到两个列表中的公用数
list_a = [1, 2, 3, 4]
list_b = [2, 3, 4, 5]
common = [a for a in list_a if a in list_b]
print(common)
查找句子中的数字
sentence = 'In 1984 there were 13 instances of a protest with over 1000 people attending'
words = sentence.split()
result = [number for number in words if number.isnumeric()]
print(result)
查找句中少于四个字母的单词
sentence = 'On a summer day somner smith went simming in the sun and his red skin stung'
examine = sentence.split()
result = [word for word in examine if len(word)<4]
print(result)
嵌套列表
在嵌套列表的子列表中添加元素list[0].sppend(4)
删除元素:
my_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 从第一个子列表中删除最后一个元素
my_list[0].pop()
# 从第二个子列表中删除第一个元素
my_list[1].pop(0)
# 从第三个子列表中删除倒数第二个元素
my_list[2].pop(-2)
# 输出嵌套列表
print(my_list) # 输出: [[1, 2], [5, 6], [7, 9]]
创建一个包含学生信息的嵌套列表(List)
students = [
['Tom', 18, 'male', 'A'],
['Lucy', 19, 'female', 'B'],
['Jack', 20, 'male', 'C']
]
一些例题
例题1
本关任务:本关任务是对有重复元素的列表,通过遍历列表,找出非重复元素,建立新列表。
# coding=utf-8
# 创建并初始化Guests列表
guests = eval(input())
# 请在此添加代码,对guests列表去重,产生并输出非重复名单列表
########## Begin ##########
b=[ ]
for i in guests:
if i not in b:
b.append(i)
print(b)
########## End ##########
期中模拟题
选择题
1、以下语句执行后a、b、c的值是:D
a = "watermelon"
b = "strawberry"
c = "cherry"
if a > b:
c = a
a = b
b = c
3、关于Python的列表,描述错误的选项是B
4、对于列表ls的操作,以下选项中描述错误的是D
5、下面代码的输出结果是A
a = [[1,2,3], [4,5,6], [7,8,9]]
s = 0
for c in a:
for j in range(3):
s += c[j]
print(s)
6、下面代码的输出结果是D
for s in "HelloWorld":
if s=="W":
continue
print(s,end="")
7、下面代码的输出结果是C
for s in "abc":
for i in range(3):
print (s,end="")
if s=="c":
break
8、关于循环,以下错误的是B
9、关于 Python 的分支结构,以下选项中描述错误的是D
12、以下代码的输出结果是print('{:*^10.4}'.format('Flower'))D
***Flow***
**Flower**
对于字符串的格式化10.4表示有十位数,但取字符串的前四位
13、s = "the sky is blue",表达式 print(s[-4:], s[:-4]) 的结果是:D
17、下列哪项不属于人工智能的机器学习范畴D
18、第一台计算机ENIAC使用的元件是A
20.根据冯诺依曼体系结构,计算机由哪五部分组成D
知识点1:程序、数据的最终形态都是二进制编码,程序和数据都是以二进制方式存储在存储器中的,二进制编码也是计算机能够所识别和执行的编码。(可执行二进制文件:.bin文件)
程序、数据和指令序列,都是事先存在主(内)存储器中,以便于计算机在工作时能够高速地从存储器中提取指令并加以分析和执行。
确定了计算机的五个基本组成部分:运算器、控制器、存储器、输入设备、输出设备
知识点2:内存按工作方式的不同又可以分为俩部分:
RAM:随机存储器,可以被CPU随机读取,一般存放CPU将要执行的程序、数据,断电丢失数据
ROM:只读存储器,只能被CPU读,不能轻易被CPU写,用来存放永久性的程序和数据,比如:系统引导程序、监控程序等。具有掉电非易失性。
编程题
例题一:数学公式
注意:sin对应的值一定是弧度值,若果输入的是角度,一定要转化成弧度math.radians()
抛物运动垂直方向的位移公式
输入速度v 角度a 和时间t(g取9.8 )
计算y(保留两位小数)
例如输入 100 60 10 输出376.03
from math import *
v=eval(input())
a=eval(input())
t=eval(input())
a=radians(a)
#开始
y=v*t*sin(a)-(9.8*t**2)/2
#结束
print("{:.2f}".format(y))
例题二:数列求和
这里我们一般要设置两个变量,一个是项an,一个是和sum(或者是乘积),并且都要进行初始化为0或1,然后用for循环
输入n,计算下列数列和
例如,输入5,输出22.09(平方根使用sqrt函数)
from math import *
n=eval(input())
zh=0
#开始
for i in range(1,n+1):
s=0#s=0的初始化不能放在循环外面,要不然就会在上一层的循环得到的s上累加
for j in range(1,i+1):
s+=sqrt(j)
zh+=s
#结束
print("{:.2f}".format(zh))
例题三:实际问题(工资)的分支结构
if < > :
else:
if < >:
elif < >:
else:
某公司按小时计费工资。规定每周5个工作日,每天工作8小时。工作日超时工作工资为正常工资的1.5倍。休息日工资,4小时内为正常工资的2倍,超过4小时为正常工资的3倍。
输入每小时工资,员工每周的工作日工作小时数和休息日工作小时数,计算其该周工资
例如每小时工资30元。工作日50小时,休息日8小时,其工资为2250.00元
gzbz=eval(input("工资标准"))
gzr=eval(input("工作日工作时间"))
xxr=eval(input("休息日工作时间"))
#代码开始
if gzr<=40:
gz1=gzbz*gzr
else:
gz1=gzbz*40+(gzr-40)*gzbz*1.5
if xxr<=4:
gz2=gzbz*xxr*2
else:
gz2=gzbz*4*2+(xxr-4)*gzbz*3
gz=gz1+gz2
#代码结束
print("工资{:.2f}".format(gz))
斐波那契数列:
对于这类问题我们可以定义一个函数,然后再进行调用
用for循环写的
def fibonacci1(n):
a,b = 0,1
for i in range(n):
a,b =b,a+b
print a
while循环写的
def fibonacci2(n):
a =0
b = 1
i =0
while i <n:
print b
a,b = b,a+b
i = i+1
列表写的
def fibonacci3(n):
lis =[]
for i in range(n):
if i ==1 or i ==0:
lis.append(1)
else:
lis.append(lis[i-2]+lis[i-1])
print lis
例题四:ISBN校验码
国际标准书号(ISBN)用10位数字唯一标识的一本书。
最后一位数字为校验位,可以由其他9位数字计算出来,且d1+2d2+3d3+……+10d10必须是11的倍数(di的下标表示从右边起第i个数)。
校验位必须是介于0到10中的一个数字,用字母X表示10.例如,020131452的校验和是5,因为对于以下11的倍数的公式,5是唯一的介于0-10之间的数,10*0+9*2+8*0+7*1+6*3+5*1+4*4+3*5+2*2+1*5
编写一个python程序,将9位整数作为输入,计算校验和并打印isbn号
例如,输入020131452,输出0201314525
x=input()
#代码开始
sum=0
r=x[::-1]
for i in range(len(r)):#字符串就是一个函数
sum += (i + 1) * int(x[i])
last=sum%11#读清题意他的意思是取模
if last<10:
last=str(last)
elif last==10:
last='X'
print(x+last)
#代码结束
例题五:对列表的切片以列表函数的应用
十位评委对六位歌手打分,六位歌手的得分数据如fs列表所示
fs=[['zhang',9.5,9.8,9.7,9.6,9.5,9.9,9.6,9.2,9.3,9.7],
['huang',8.5,8.8,7.7,7.6,8.5,8.3,9.1,7.8,7.5,9.3],
['liu',9.5,8.8,7.2,9.6,8.5,6.5,6.3,7,6.9,9],
['chen',9.5,9.8,8.7,8.6,7.5,8.8,8.1,9.3,9.2,9.9],
['lin',9.9,7.8,7.5,7.2,6.5,9.1,9.2,9.3,8.5,8.2],
['ye',9.8,6.8,6.2,9.3,7.5,8.3,9.1,9.4,8.7,8.9]]
计算每位歌手的实际得分,即去掉一个最高分、一个最低分的平均分,按从高到低的顺序,输出前3名的名次、姓名和实际得分(保留两位小数)
例如,第1名姓名zhang分数9.59
fs=[['zhang',9.5,9.8,9.7,9.6,9.5,9.9,9.6,9.2,9.3,9.7],
['huang',8.5,8.8,7.7,7.6,8.5,8.3,9.1,7.8,7.5,9.3],
['liu',9.5,8.8,7.2,9.6,8.5,6.5,6.3,7,6.9,9],
['chen',9.5,9.8,8.7,8.6,7.5,8.8,8.1,9.3,9.2,9.9],
['lin',9.9,7.8,7.5,7.2,6.5,9.1,9.2,9.3,8.5,8.2],
['ye',9.8,6.8,6.2,9.3,7.5,8.3,9.1,9.4,8.7,8.9]]
#代码开始
l1=[]
for x in fs:
xm=x[0]
df=(sum(x[1:])-max(x[1:])-min(x[1:]))/(len(x[1:])-2)
l1.append([df,xm])
l1.sort(reverse=True)
for i in range(3):
print('第{}名姓名{}分数{:.2f}'.format(i+1,l1[i][1],l1[i][0]))
例题六:Python计算银行利率
这类题一般用while循环,对于计数问题,我们一般设定一个n,并初始化为0,在循环中累次加一
某人有资金100000元,他存入银行一年期的大额存款,年利率为5%,一年后又将所有资金转存。若银行利率一直不变,求想获得指定金额的资金,存款至少需要多少年。例如,输入120000,返回4。
y=eval(input())
#开始
n=0
x=100000
while x<y:
x=x*1.05
n+=1
#结束
print("{:d}".format(n))
一些有意思的题目
题1:最大整数
输入格式:一行多个整数,用空格隔开。
输出格式:一个最大整数
输入输出样例:输入1 2 3 4 5 6
,输出6
说明/提示最大的数为 6
,即输出 6
。
print(max(list(map(int,input().split()))))
#include<stdio.h>
int main(){
int maxnum=0;
int num=0;
while(scanf("%d",&num)!=EOF):{ //EOF识别结尾的一个标志
if(num>maxnum):
maxnum=num;}
printf("%d\n",maxnum);
return 0;
}
题2:简单计算
输入一个整数 n
,输出小于 n
并且能被 37
整除的所有自然数之和。没有则输出 0
。
输入格式:一个整数。输出格式:一个整数。
输入输出样例:输入138
输出137
,输入275
输出2111
说明/提示如输入的值为75
,小于 75
并且能被 37
整除的自然数为 3774
。
即和为 37 + 74 = 111
。
n=int(input())
sum=0
if n>=37:
for i in range(37,n,37):
sum+=i
print(sum)
else:
print(0)
#include<stdio.h>
int main(){
int sum=0;
int n=0;
scanf("%d",&n);
if(n<37)
printf(0);
else{
for(int i=37;i<n;i+=37)
sum+=i;
}
printf("%d",sum);
return 0;
}
题3:函数处理
本关任务:函数 fun
的功能是:将两个两位数的正整数 a
、
b
合并形成一个整数放在 c
中。合并的方式是:将 a
数的十位和个位数依次放在 c
数的十位和千位上,b
数的十位和个位数依次放在 c
数的百位和个位上。
注意:请勿改动主函数 main 和其它函数中的任何内容,仅在函数 fun 中填入你编写的若干语句。
输入格式:整数 a
、
b
。
输出格式:计算得到的结果c
。
输入输出样例:输入145 12
输出15142
def fun(a, b):
#********* Begin *********#
a1=a%10
a2=a//10
b1=b%10
b2=b//10
c=b1+a2*10+b2*100+a1*1000
return c
#********* End *********#
a,b=map(int,input().split())
c = fun(a, b)
print(c)
#include <stdio.h>
void fun(int a,int b,long *c)
{
*c=b%10+(a/10)*10+(b/10)*100+(a%10)*1000;
}
void main()
{ int a,b;
long c;
scanf("%d%d",&a,&b);
fun(a,b,&c);
printf("%ld\n",c);
}
题4:字符图网格
假定有一个列表的列表,内层列表的每个值都是包含一个字符的字符串,像这样:
grid = [['.', '.', '.', '.', '.', '.'],
['.', 'O', 'O', '.', '.', '.'],
['O', 'O', 'O', 'O', '.', '.'],
['O', 'O', 'O', 'O', 'O', '.'],
['.', 'O', 'O', 'O', 'O', 'O'],
['O', 'O', 'O', 'O', 'O', '.'],
['O', 'O', 'O', 'O', '.', '.'],
['.', 'O', 'O', '.', '.', '.'],
['.', '.', '.', '.', '.', '.']]
你可以认为 grid[x][y]是一幅“图”在 x、y 坐标处的字符,该图由文本字符组
成。原点(0, 0)在左上角,向右 x 坐标增加,向下 y 坐标增加。
复制前面的网格值,编写代码用它打印出如下图像。
..OO.OO..
.OOOOOOO.
.OOOOOOO.
..OOOOO..
...OOO...
....O....
..OO.OO..
grid = [['.','.','.','.','.','.'],
['.','0','0','.','.','.'],
['0','0','0','0','.','.'],
['0','0','0','0','0','.'],
['.','0','0','0','0','0'],
['0','0','0','0','0','.'],
['0','0','0','0','.','.'],
['.','0','0','.','.','.'],
['.','.','.','.','.','.']]
for i in range(len(grid[0])):
for j in range(len(grid)):
print(grid[j][i],end='')#先让它(0,0),(1,0)变化,首先变化的是子块,其次变化的是主
print('\n')
#防止打出多行代码,在子块运行的时候要用关键字参数end=‘’使它打在同一行
#在迭代到主块时要进行分行操作
题5:逗号代码
假定有下面这样的列表:
spam = ['apples', 'bananas', 'tofu', 'cats']
编写一个函数,它以一个列表值作为参数,返回一个字符串。该字符串包含所
有表项,表项之间以逗号和空格分隔,并在最后一个表项之前插入and。例如,将
前面的spam 列表传递给函数,将返回'apples, bananas, tofu, and cats'。但你的函数应
该能够处理传递给它的任何列表。
def fx(list):
x="'"
for i in range(len(list)-1):
x+=str(list[i])+","
x+='and '+str(list[-1])+"'"
return x#函数最后一定要说明返回值不等同于写print
spam=['apples','bananas','tofu','cats']
print(fx(spam))
#1、join()函数
#语法: 'sep'.join(seq)
#参数说明
#sep:分隔符。可以为空
#seq:要连接的元素序列、字符串、元组、字典
#上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串
#返回值:返回一个以分隔符sep连接各个元素后生成的字符串
def listCon(list):
return ",".join(list[:-1]+['and '+str(list[-1])])
spam = ['apples', 'bananas', 'tofu', 'cats']
print(listCon(spam))
一类题:字符图形
打印正三角
#coding=utf-8
n=int(input())
for i in range(n):
for j in range(0, n - i):
print(end=" ")
for k in range(n - i, n):
print("*", end=" ")
print("")
打印倒三角
#coding=utf-8
n=int(input())
for i in range(n):
for j in range(0, i):
print(end=" ")
for k in range(i, n):
print("*", end=" ")
print("")