2025届高中信息技术二轮复习 第二部分 算法与程序设计 专题8 Python程序语言基础(课件 学案)

资源下载
  1. 二一教育资源

2025届高中信息技术二轮复习 第二部分 算法与程序设计 专题8 Python程序语言基础(课件 学案)

资源简介

专题8 Python程序语言基础
学习目标 1.掌握Python表达式运算符的优先级和常见内置函数的应用;
2.掌握自定义函数的编写和调用;
3.掌握常见模块的应用;
4.掌握算法的三种控制结构.
数据是程序运行的原料,Python的基本数据类型有整型、实型、字符串型和布尔型等,但相同类型的数据往往存储在列表或字典中,列表是有序线性结构,可以通过索引去访问每个元素的值,而字典是无序的,只能通过键去访问其值。对数据的操作有多种运算符,内置的函数能快速地解决一些求和、平均值排序等常见的问题。算法有三种基本结构,选择结构和循环结构可以看成是一个小小的模块,由这些模块组成了一个顺序结构,这个结构就是一个大的算法。实现某个功能的语句可以写在一个模块内,这个模块就是函数,只要传给函数相应的参数,函数可以返回相应的计算结果。把多个相关的函数封装在一个文件中,这个文件就是一个库,就是一个模块。
(2024年1月浙江省选考)数组元素a[0]至a[n-1]依次存放着n个数据,现需要将元素a[n-1]插入在下标为x(0≤xtemp=a[n-1]
for i in range(n-2,x-1,-1):
a[x]=temp
A.a[i+1]=a[i] B.a[i-1]=a[i]
C.a[i]=a[i+1] D.a[i]=a[i-1]
重难点1 算法控制结构
算法=逻辑+控制,这是Pascal设计者Niklaus Wirth的一本著作的书名,它刻画了过程式尤其是结构化编程的思想。控制指的是程序设计中顺序、选择和循环三种基本控制结构。分支结构分为单分支结构、双分支结构和多分支结构,而分支结构的组合可以分为多个分支语句和分支的嵌套。多分支结构和多个分支语句的区别在于多分支结构只执行其中一条判断条件,而多个分支语句依次执行每个分支结构语句。遍历是算法最核心的思想,往往用循环结构来实现。可以按位置遍历,如 for i in range(20);也可以按元素进行遍历,如for i in [3,2,1,7]。用while语句往往实现满足某个条件时的遍历。
例1 象限是平面直角坐标系(笛卡尔坐标系)中横轴和纵轴所划分的四个区域,每一个区域叫做一个象限。象限以原点为中心,x,y 轴为分界线,原点和坐标轴上的点不属于任何象限。某同学根据输入的坐标点(x,y)来判断该坐标点的位置所在,以下实现该分类的 Python 程序段中正确的是(  )
A.if x==0 and y==0:
result=″原点″
if x==0 or y==0:
result=″数轴″
if x!=0 and y!=0:
   result=″象限″
B.if x==0 or y==0:
result=″数轴″
if x==0 and y==0:
result=″原点″
else:
result=″象限″
C.if x!=0 and y!=0:
result=″象限″
if x==0 or y==0:
result=″数轴″
else:
result=″原点″
D.if x!=0 and y!=0:
   result=″象限″
if x==0 and y==0:
   result=″原点″
if x==0 or y==0:
result=″数轴″
变式1 有如下 Python 程序段:
a=[1,5,9,2,6,8,3,4,7]
n=0 ;flag=False
if a[0]  flag=True
for i in range(len(a)-1):
  if a[i]  n+=1;flag=False
  elif a[i]>a[i+1] and flag==False:
  flag=True
print(n)
执行上述程序段后,输出的值为(  )
A.1 B.2 C.3 D.4
例2 若字符串s的值为″abcde″,执行如下程序段后,变量res的值不可能是(  )
from random import randint
res=″″
i,j=0,len(s)-1
while i=i:
if randint(0,1) == 0: #randint(0,1)随机生成 0 或 1
  res+=s[i]
  i+=1
else:
  res+=s[j]
  j-=1
A.″abced″ B.″aecbd″
C.″aedbc″ D.″edcba″
变式2 有如下Python程序段:
s=input(″输入字符串:″)
n=len(s)
i,j=0,n-1
result=″″
while i=n∥2:
if s[i]>s[j]:
   result+=s[i]; j-=1
elif s[i]  result+=s[j]; i+=1
else:
  i+=1;j-=1
print(result)
执行该程序段,分别输入下列选项中的字符串,输出结果不为“555”的是(  )
A.″51234″ B.″12535″
C.″54321″ D.″55123″
重难点2 函数和模块
在算法的程序实现过程中,也经常根据具体问题的特点将其分解成若干个子问题或者借助所用程序设计语言的特性来完成问题的解决。Python主要运用函数、模块等方式实现模块化程序设计,为算法的程序实现带来极大的便利。自定义函数相当于一个小的程序块,函数的参数相当输入的信息,函数的形参和实参必须一一对应,函数的返回值相当输出信息。一个函数体内可以有多条return语句,当执行某条返回语句后,结束自定义函数运行,返回主程序。在Python中,把一组函数放到一个.py文件里,这个文件就称为一个模块。
例1 多选题评分,评分标准:全部选对得2分,选对但不全的得1分,不选或有选错的得0分。编制的自定义函数如下,其中x表示要判断的答案,y表示标准答案。选对但不全的答案判定方法为:遍历判断的答案每一个选项,若该选项在标准答案中存在则进行计数count,否则直接退出遍历。根据count的值与判断答案的长度是否相等来决定是选对但不全。
def df(x,y): #函数df(x,y)的功能是根据标准答案y,检测答题的答案x应得的分数ans。
if x==y:
  ①__________
else:
  count=0
  for i in x:
    if i in y:
     count+=1
    else:
     ②__________
  if ③________:
    ans=0
else:
    ans=1
return ans
da=input(″请你输入你的答案:″)
bzda=″ACD″
n=df(da,bzda)
print(″该题得分为:″+str(n))
变式1 有如下 Python 程序段:
def half_s(s):
  n=len(s);result=″″
  i,j=0,n-1
  while i=n∥2:
   if s[i]>s[j]:
    result+=s[i];i+=1
   elif s[i]    result+=s[j];j-=1
   else:
    i+=1;j-=1
  return result
执行语句v=half_s(″welcome″),变量v的值是(  )
A.″come″ B.″wmol″
C.″www″ D.″emo″
例2 有如下 Python 程序段:
import random
a=[0]*6
for i in range(6):
  x=int(random.random()*10)+1
  if i%2==1:
  a[i]=2*x+1
  elif x%2==0:
  a[i]=x∥2
  else:
  a[i]=x-1
print(a)
执行该程序段后,列表 a 中的值可能是(  )
A.3,11,4,19,2,13 B.3,11,7,9,2,3
C.9,3,1,23,4,17 D.3,3,9,0,19,8
变式2 有Python程序如下:
import random
n=7
a=[0]*n
a[0]=random.randint(60,100)
for i in range(1,n):
  a[i]=a[i-1]-random.randint(0,i)
for i in range(1,n,2):
  a[i]=a[i]-a[i-1]%2
print(a)
执行上述程序后,输出的数据可能为(  )
A.[67,65,64,64,61,61,54]
B.[72,71,72,69,67,62,57]
C.[83,81,81,77,75,73,69]
D.[94,94,94,89,89,88,82]
重难点1 算法控制结构
1.为实现按表中分数段进行等级划分,以下代码正确的是(  )
分数 x x≥90 80≤x<90 x<80
等级 level A B C
2.有如下 Python 程序段:
s = input(″请输入一串字符串:″)
f = True
for i in range(len(s)∥2):
  if s[i] != s[len(s)-i-1]:
  f = False
  break
print(f)
若执行该程序后, 输出的结果是“True”,则输入的字符串可能是(  )
A.″onion″ B.″hello″
C.″278″ D.″111″
3.有如下Pyhon程序段:
a=[0]*101
for i in range(1,101):
  for j in range(i,101):
  if j % i==0:
    a[j]+=1
print(a[50])
执行该程序段后,输出列表元素a[50]的值为(  )
A.5 B.6 C.9 D.50
4.将有序数组 nums 中的重复项删除,编写的Python程序段如下:
nums=1
n=len(nums);i=1
while i  if nums[i] !=nums[i-1]:
 
  k+=1
  i+=1
nums=nums[:k]
上述程序段中方框处可选代码为:①k=0 ②k=1
③nums[k]=nums[i] ④nums[i-1]=nums[i],则(1)、(2)处代码依次为(  )
A.①③ B.①④ C.②③ D.②④
5.数组元素a[0]到a[2*n-1]为互不相等的正整数(n≥1),要在其中找到最大值和最小值,并分别存储到变量max1和max2中。实现该功能的Python程序段如下:
max1=0;max2=0
for i in range(0,n*2,2):
  if a[i]>a[i+1]:
  t1=a[i];t2=a[i+1]
  else:
  t1=a[i+1];t2=a[i]
  if :
  max1=t1;max2=t2
  elif:
 max2=max1;max1=t1
 elif:
  max2=t1
上述程序段中方框处可选代码为:①t1>max1 ②t1>max2 ③t2>max1则(1)(2)(3)处语句依次为(  )
A.①②③ B.②③① C.③①② D.③②①
6.有如下Python程序段:
s1=input(″请输入字符串:″)
a=[0]*128
for item in s1:
  ch=ord(item)
  a[ch]=a[ch]+1
s2=″″
for i in range(len(a)):
  for j in range(a[i]):
  s2=s2+chr(i)
print(s2)
列表a各元素的初始值都为0,s1中输入的内容为″abs54int″。执行该程序后,程序输出的结果中第5个字符为(  )
A.n B.s C.4 D.i
7.有如下Python程序段:
c,m=0,0
for i in range(2,len(a)):
  if a[i-2]+a[i-1]==a[i]:
  c+=1
  if c>m:
    m=c
  else:
  c=0
若列表a=[2,1,3,4,5,9,14,23],执行该程序段后,变量m的值是(  )
A.0 B.1 C.2 D.3
8.有如下Python程序段,功能为删除非降序序列中的重复数:
a=[2,2,2,5,5,5,8 ]
k=i=0
while __(1)________:
if a[i]!=a[i+1]:
k+=1
   (2)________
i+=1
print(a[:k+1])
该程序执行结果为[2,5,8],划线处可选代码为
①iA.①③ B.①④ C.②③ D.②④
9.有如下Python程序:
s1 =″0312″ ; s2 =″ABCDEFGH″
m = 0 ; c =″″
for i in range(len(s2)) :
  k = int(s1[i%4])
  m=4*(i∥4)
  c += s2[k+m]
执行该程序段后,变量c的值是(  )
A.″ADBCADBC″ B.″ABCDEFGH″
C.″AHBGCFDE″ D.″ADBCEHFG″
重难点2 函数和模块
1.有如下Python程序段:
def f(m):
  a=m%10
  b=m∥10%10
  c=m∥100
  if c**3+b**3+a**3==m:
  return ″YES″
  else:
  return ″NO″
m=int(input(″输入一个三位数:″))
print(f(m))
执行该程序段后,若输出结果为“YES”,则输入变量m值可能为(  )
A.121 B.134 C.153 D.142
2.有如下程序代码
def sort(a):
  n=len(a)
  b=[0]*n
  num=k=0
  while k   if a[k]%2==1 :
  b[num]=a[k]
    num+=1
   else:
    a[k-num]=a[k]
   k+=1
  for j in range(n-num,n):
  a[j]=b[j-n+num]
  return a
ys=[5,10,21,7,24,14,9,11,36,37]
ans=sort(ys)
程序运行后,变量ans的值为(  )
A.[10,24,5,21,7] B.[5,7,10,21,24]
C.[5,21,7,10,24] D .[10,24,5,7,21]
3.有如下Python程序:
def count(a,i):
  for j in range(i+1,len(a)):
 if a[j]     return j-i
  return 0
a=[4,2,2,4,1,6]
b=[1]*len(a)
for i in range(len(a)-1):
  b[i]=count(a,i)
print(b)
运行该程序,则 b[1]的值为(  )
A.0 B.1 C.2 D.3
4.所谓亲密数是指如果整数x的全部因子(包括1,不包括x自身)之和等于y,且整数y的全部因子之和等于x,则x和y称为一对亲密数(x与y不相等)。小王想通过Python程序统计1~1000间的亲密数对的个数。
def yzh(m):
  yz_sum=1
  for i in range(2,m∥2+1):
  if ①________:
     yz_sum+=i
  return yz_sum
n=0
for x in range(1,1001):
  y=yzh(x)
  if ②________:
  n=n+1
print(″共有亲密数对:″,n)
则代码中①②处的语句可为(  )
A.①m%i!=0 ②x==yzh(y) and x!=y
B.①m%i==0 ②x==yzh(y) and x!=y
C.①m%i!=0 ②x==yzh(y) or x!=y
D.①m%i==0 ②x==yzh(y) or x!=y
5.生成一组由数字 1~8 组成的 8 位不重复的随机密码,Python 程序段如下:
from random import *
a=[0]*8
for i in range(8):
  a[i]=i+1
k=8;s=''
for i in range(8):
  m=randint(0,k-1)
 
print(s)
方框中的代码由以下三部分组成:
①k-=1 ②a[m]=a[k-1] ③s+=str(a[m])代码顺序正确的选项是(  )
A.①②③ B.②③① C.②①③ D.③②①
6.有如下程序段:
from random import randint
s =″python″
k = randint(1, 4)
for i in range(k):
  j = i + 1
  while j < len(s) and s[j] > s[i]:
    j += 1
  if j < len(s):
  s = s[:j] + s[j + 1:]
  else:
  s = s[:len(s) - 1]
print(s)
执行该程序段后,s的值不可能是(  )
A.″py″ B.″pyo″ C.″pytn″ D.″pyton″
7.小明用Python语言中对大小为100*100像素的图像“上.jpg”(如图所示)进行简单处理,部分代码如下:
img=Image.open(″上.jpg″)
im=np.array(img.convert(″L″)) #转换成数字矩阵
rows,cols=im.shape
for i in range(rows):
  for j in range(cols):
  if j%10==0:
    im[i,j]=0
程序执行后的图像效果是(  )
重难点1 算法控制结构
1.如下Python程序段中,实现功能与其它三个不一样的是(  )
2. 用Python语句描述城市主干道中机动车平均行驶速度v不低于30为畅通,小于20为堵塞,其余为拥挤,设v为机动车平均行驶速度(单位: km/h) ,则下列选项正确是(  )
3.有如下Python程序段:
a=[5,3,8,9,7,3,11]
n=len(a)-1
cnt=0
for i in range(1,n):
  if a[i]==a[i+1]-a[i-1]:
  cnt+=1
  elif a[i]>a[i+1]-a[i-1]:
  cnt+=2  
  else:
  cnt+=3
print(cnt)
执行该程序段后,变量cnt的值为(  )
A.9 B.10 C.11 D.12
4.下列程序执行后的结果为(  )
L = [1,-2,3,7,-8,9,10]
i,j= 0,len(L)-1
while i  while L[i]>=0:
i=i+1
  while L[j]<0:
j=j-1
  if iL[i],L[j] = L[j],L[i]
print(L[6])
A.3 B.9 C.-2 D.-8
5.有如下Python程序段:
import random
s=″″
p=[0,1,2,3]
random.shuffle(p) #将序列p中所有元素随机排序
for i in p:
  s+=chr(65+i)
运行该程序段后,变量s的值可能的是(  )
A.″acbd″ B.″aabc″ C.″ABCB″ D.″ADBC″
6.某Python程序如下:
s=input(″请输入字符串:″)
ans=″″
a=[1,2,3]
for i in range(len(s)):
  x=s[i]
  key=a[i%3]
  if ″A″<=s[i]<=″Z″:
  ans=ans+chr((ord(x)-65+key)%26+65)
  else:
  ans=ans+x
print(ans)
执行该程序后,输入″A1b2D3″输出的结果为(  )
A.2b1BF B.B1b2F3
C.B3e3F6 D.6F3e3B
7.有如下Python程序段:
a = [1] * 6
b = [96,88,84,91,99,80]
for i in range(5):
  for j in range(i+1,6):
  if b[j] > b[i]:
     a[i] += 1
  else:
     a[j] += 1
print(a)
该程序段运行后,列表a 的值为(  )
A.[5,3,2,4,6,1] B.[2,4,5,3,1,6]
C.[10,6,4,8,12,2] D.[4,8,10,6,2,12]
8.某些数据中存在“数字山峰”,例如数据“21432748”中存在“1432”、“274”两座“数字山峰”(必须包含上坡与下坡),下面程序用于求数据中“数字山峰”的数量:
num=input(″请输入数字串:″);c=0
(1)________
for i in range(1,len(num)):
  if (2)________ and f==False:
f=True
  elif (3)__________ and f==True:
c=c+1
f=False
print(″有″,c,″座数字山峰″)方框(1)(2)(3)的代码由以下部分组成:
①f=True ②f=False ③num[i-1]>num[i] ④num[i-1]下列选项中代码顺序正确的是(  )
A.①③④ B.①④③ C.②③④ D.②④③
9.有如下Python程序段:
import random
a=[]
for i in range(10):
  a.append(random.randint(1,100))
i=1
while i <10:
  if i==0:
  i=1
  elif a[i-1]<=a[i]:
  ①________
  else:
  a[i],a[i-1]=a[i-1],a[i]
  ②________
print(a)
执行该程序段实现了随机生成一个数组,并将其元素递增输出的功能。划线处的代码应该是(  )
A.①i+=1 ②i-=1 B.①i-=1 ②i=1
C.①i+=1 ②i+=1 D.①i-=1 ②i-=1
10.有一组正整数,要求对其中的奇偶数进行交换。交换后偶数在前,奇数在后,并保持相对顺序不变。
a=[5,10,21,7,24,14,9,11,36,37]
n=len(a);b=[0]*n
num=0;k=0
while k   if :
    b[num]=a[k]
    num+=1
  else:
   
  k+=1
for j in range(n-num,n):
   
print(a)
将加框处的代码补充完整,正确的是(  )
A.①a[k]%2==1 ②a[k-num]=a[k] ③a[j]=b[j-n+num]
B.①a[k]%2==0 ②b[k-num]=a[k] ③a[j]=b[j+num]
C.①a[k]%2==0 ②a[k-num]=a[k] ③a[j]=b[j+num]
D.①a[k]%2==1 ②b[k-num]=a[k] ③a[j]=b[j-n+num]
11.子序列是指数组中连续的若干个元素(至少 1 个元素)。数组 a 中有 n 个整型元素(有正有负),现要查找和最大的子序列,并输出和。实现该功能的程序段如下,方框中应填入的正确代码为(  )
def maxsub(a) :
  tot= -1; tmp = 0
  for num in a:
  tmp += num
  return tot
a=[-2,1,-3,4,-1,2,1,-5,4]
print (maxsub(a))
12.有如下Python程序段:
a = [123,32,66,12,54,95,211]
p = q = a[0]
for x in a[1:]:
  if x < p:
  p, q = x, p
  elif x < q:
  q = x
print(q)
执行该程序段后,输出的结果是(  )
A.123 B.32 C.211 D.12
13.有如下 Python 程序段:
a = [3, 3, 7, 8, 8, 10, 12, 99]
j = k = res = 0
for i in range(len(a)-1):
  while a[j] - a[i] < 5:
j = j + 1;
  while a[k] - a[i] <= 5:
k = k + 1
  if a[j] - a[i] == 5 and a[k-1] - a[i] == 5:
res += k - j
执行程序后,变量res的值是(  )
A.2 B.3 C.4 D.5
14.有如下Python程序:
#输入包含5个不重复元素的数组a,代码略
i,c=0,0
key=int(input(″key=″))
for j in range(len(a)):
  if a[j]%key==0:
  c+=1
  else:
  a[j-c]=a[j]
print(a)
运行该程序,若输入key为2,则输出的a不可能为(  )
A.[3,7,5,4,5] B.[3,7,1,5,5]
C.[3,5,0,3,5] D.[9,7,4,7,3]
15.有如下Python程序段:
p={};s=input()
for i in range(len(s)):
  p[s[i]]=i
i=0
while i  n=p[s[i]]
  j=i+1
  while j<=n:
   if p[s[j]]>n:
    n=p[s[j]]
   j=j+1
  print(s[i:j])
  i=j
若输入“arrayiybi”,则输出结果的最后一行内容是(  )
A.arra B.yiy C.iybi D.yiybi
16.已排好序的列表a有n个元素,下标为0~n-1,现要实现去重,并输出去重后的结果。如:1,2,2,3,输出1,2,3。实现该功能的程序段如下,方框中应填入的代码为(  )
#输入列表a的元素,并排好序
cnt=0
n=len(a)
A.for i in range(1,n):
   if a[i]!=a[i-1]:
cnt+=1
a[cnt]=a[i]
B.for i in range(n-1):
   if a[i]!=a[i+1]:
a[cnt]=a[i]
cnt+=1
C.i=0
while iif a[i]!=a[i+1]:
     cnt+=1
     a[cnt]=a[i]
i+=1
D.i=1
while i   if a[i]!=a[i-1]
cnt+=1
a[i]=a[cnt]
   i+=1
重难点2 函数和模块
1.有如下程序段:
def ds(s,i):
  if ″a″<=s[i]<=″z″:
   s=s[:i]+s[i+1:]
  elif ″0″<=s[i]<=″9″:
   s=s[:i]+str((int(s[i])+6)%10)+s[i+1:]
  return s
s=″Yy23mm4″
i=0
while i  s=ds(s,i)
  i+=1
print(s)
执行上述程序段后,s的值为(  )
A.″Y89m0″ B.″Y29m0″
C.″y23m4″ D.″89mm0″
2.使用Python程序编程探究平面上圆与圆的位置(圆心距离等于两个圆半径之和)相切的关系,程序代码如下:
def judge(a,b):
dis=(cir[a][0]-cir[b][0])**2+(cir[a][1]-cir[b][1])**2
if dis==(cir[a][2]+cir[b][2])**2:
    return 1
return 0
cir={'A':[1,1,1],'B':[4,5,4],'C':[0,2,1]}
#cir 用于存储编号为'A'、'B'、'C'的三个圆圆心的 x,y 坐标及半径信息
cnt=judge('A','B')+judge('A','C')+judge('B','C')
运行程序后,变量 cnt 的值是(  )
A.0 B.1 C.2 D.3
3.有如下Python加密程序段,以下说法正确的是(  )
def encrypt(code,key):
  code_new=''
  for s in code:
   code_new+=chr(s1)
  return code_new
code=input(″code=″)
print(encrypt(code,2))
A.该加密程序段所用的加密算法是换位密码法
B.若输入字符串 code 为“App”,则输出的结果为 crr
C.若要对数字字符逐个右移进行加密,则只需将加框处语句修改为“(int(s)+key)%10”
D.将加框处语句修改为“ord('a')+((ord(s)-ord('a'))-key)%26”可将加密的密文还原为明文
4.有如下Python程序段:
def delstr(s,m):
  return s[0:m]+s[m+1:]
s=″Welcome″
i=0
while i<=len(s):
  s=delstr(s,i)
  i+=2
print(s)
执行该程序段后,输出的结果为(  )
A.ecm B.elome C.elco D.elom
5.有如下 Python 程序段:
from random import randint
s=″Infomation″
for i in range(2):  
  k=randint(0,2)*2+1 #randint(0,2)随机产生[0,2]之间的整数
  s=s[:k]+s[k+1:]
执行该程序段后,变量 s 的值不可能是(  )
A.″Iomation″ B.″Inmation″
C.″Infation″ D.″Ifoation″
6.英语单词″illustriousness″意思是优秀,有如下Python程序段:
import random
s=″illustriousness″
for i in range(4):
  k=random.randint(0,4)*random.randint(0,3)
  print(s[k],end=″″)
执行该程序后,输出的结果不可能是(  )
A.uiso B.iiii C.tree D.siur
7.某Python代码如下:
import random
lst =[0]*8 #定义列表lst,lst[0]~lst[7]初始值均为0
i = 0
while i < 8:
  if i % 2 == 0:
    lst[i] = int(random.random()*10)
  else:
    lst[i] = int(random.randint(1,5))*2+1
  i += 1
print(lst)
执行后程序后,列表lst[0]~lst[7]各元素值可能的是(  )
A.[0,10,2,9,8,3,4,5] B.[8,5,4,7,10,3,6,9]
C.[4,11,3,5,9,6,1,7] D.[6,3,1,11,7,3,5,9]
8.有如下Python程序段:
import random
a = [0]*6
i = 0
x = int(input())
while i <= 5:
  c = random.randint(1, 10)
  if x % 2 == c % 2:
  a[i] = c
 i += 1
 x = x∥2
执行该程序段后,若要在列表a中产生4个偶数、2个奇数,输入的x的值不可能的是(  )
A.3 B.4 C.5 D.6
9.有下列Python程序段:
import random
s=input(″请输入字符串:″)
x=random.randint(3,6)
n=len(s)
if len(s[0:x])  r=s[x:n]+s[0:x]
else:
  r=s[0:x]+s[x:n]
print(r)
执行该程序段,若输入“helloworld”(不包含双引号),则输出的结果不可能的是(  )
A.loworldhel B.oworldhell
C.helloworld D.worldhello
10.编写一个自定义函数实现用户的登录,用户最多有3次可以尝试输入用户名和密码的机会。请在划线处填入合适的代码。
def login(a,b,u): #在字典u中判断用户名a是否存在,密码b是否正确
  if ①________:
  if ②________:
    print(″密码不正确″)
    return False
  else:
    print(″登录成功″)
    ③________
else:
  print(″帐号不正确″)
  return False
u={″cgm″:″sd@1″,″cgl″:″&dd5″,″cjm″:″##22sd″,″lbh″:″12sa″,″ljs″:″sd22!″} #系统中存在的用户名
trytime=3
while trytime>0: #有3次机会可以输入用户名和密码
  user=input(″请输入你的用户名:″)
  psd=input(″请输入你的密码:″)
  if ④________:
  break
 else:
  print(″你还剩下″,trytime-1,″次机会可以输入密码!″)
 ⑤________
11.将图形转化为文本。应用Python中的Image模块后,将字母图片文件″OK.jpg″处理成由0,1表达的文本文件“OK.txt”。字母图片如图a所示,运行后文本文件结果如图b所示。
实现该功能的Python程序如下,请完成划线处的程序代码。
from PIL import Image
def judge(R,G,B):
  gray=0.299*R+0.587*G+0.114*B #转成灰度值
  color= gray/132
  return color
img = Image.open(″OK.jpg″)
pix = img.load()
file=open(①________,″w″) #读写方式打开文本文件
width = img.size[0]
②________
for i in range(height):
  line=″″
  for j in range(width):
  R,G,B=pix[j,i] #根据像素坐标获得该点的RGB值
  ③________
  if color==0:
     line+=″1″
  else:
     line+=″0″
  file.write(line) #写入OK.txt文件
 file.write(″\\n″)
  file.close()
专题8 Python程序语言基础
学习目标 1.掌握Python表达式运算符的优先级和常见内置函数的应用;
2.掌握自定义函数的编写和调用;
3.掌握常见模块的应用;
4.掌握算法的三种控制结构.
数据是程序运行的原料,Python的基本数据类型有整型、实型、字符串型和布尔型等,但相同类型的数据往往存储在列表或字典中,列表是有序线性结构,可以通过索引去访问每个元素的值,而字典是无序的,只能通过键去访问其值。对数据的操作有多种运算符,内置的函数能快速地解决一些求和、平均值排序等常见的问题。算法有三种基本结构,选择结构和循环结构可以看成是一个小小的模块,由这些模块组成了一个顺序结构,这个结构就是一个大的算法。实现某个功能的语句可以写在一个模块内,这个模块就是函数,只要传给函数相应的参数,函数可以返回相应的计算结果。把多个相关的函数封装在一个文件中,这个文件就是一个库,就是一个模块。
(2024年1月浙江省选考)数组元素a[0]至a[n-1]依次存放着n个数据,现需要将元素a[n-1]插入在下标为x(0≤xtemp=a[n-1]
for i in range(n-2,x-1,-1):
a[x]=temp
A.a[i+1]=a[i] B.a[i-1]=a[i]
C.a[i]=a[i+1] D.a[i]=a[i-1]
答案 A
解析 先将7保存在a[n-1],变量i从n-2遍历到x,将当前位置i后面的值移动到当前位置。
重难点1 算法控制结构
算法=逻辑+控制,这是Pascal设计者Niklaus Wirth的一本著作的书名,它刻画了过程式尤其是结构化编程的思想。控制指的是程序设计中顺序、选择和循环三种基本控制结构。分支结构分为单分支结构、双分支结构和多分支结构,而分支结构的组合可以分为多个分支语句和分支的嵌套。多分支结构和多个分支语句的区别在于多分支结构只执行其中一条判断条件,而多个分支语句依次执行每个分支结构语句。遍历是算法最核心的思想,往往用循环结构来实现。可以按位置遍历,如 for i in range(20);也可以按元素进行遍历,如for i in [3,2,1,7]。用while语句往往实现满足某个条件时的遍历。
例1 象限是平面直角坐标系(笛卡尔坐标系)中横轴和纵轴所划分的四个区域,每一个区域叫做一个象限。象限以原点为中心,x,y 轴为分界线,原点和坐标轴上的点不属于任何象限。某同学根据输入的坐标点(x,y)来判断该坐标点的位置所在,以下实现该分类的 Python 程序段中正确的是(  )
A.if x==0 and y==0:
result=″原点″
if x==0 or y==0:
result=″数轴″
if x!=0 and y!=0:
   result=″象限″
B.if x==0 or y==0:
result=″数轴″
if x==0 and y==0:
result=″原点″
else:
result=″象限″
C.if x!=0 and y!=0:
result=″象限″
if x==0 or y==0:
result=″数轴″
else:
result=″原点″
D.if x!=0 and y!=0:
   result=″象限″
if x==0 and y==0:
   result=″原点″
if x==0 or y==0:
result=″数轴″
 思维点拨
明考向 本题考查Python基本控制结构。 (0,0)是原点,即 if x==0 and y==0 表示原点;(0,y)或者(x,0)分别表示 y 轴与 x 轴
精点拨 A x==y==0时,第1个和第2个if均成立
B if x==0 or y==0且x与y不同时为0表示数轴,在第2个分支语句中,再次判断为″象限″
C 条件x!=0 and y!=0成立,判断为″象限″,在第2个分支语句中,再次判断为″原点″,因此原点的判断需在数轴之前
D 分三种情况,用3条分支语句来表达这种情况
答案 D
变式1 有如下 Python 程序段:
a=[1,5,9,2,6,8,3,4,7]
n=0 ;flag=False
if a[0]  flag=True
for i in range(len(a)-1):
  if a[i]  n+=1;flag=False
  elif a[i]>a[i+1] and flag==False:
  flag=True
print(n)
执行上述程序段后,输出的值为(  )
A.1 B.2 C.3 D.4
答案 C
解析 本题考查程序控制结构。遍历数组a,若当前位置元素比后面元素小,且flag的值为True,则对n进行计数,同时将flag的值设置为False。若当前位置元素比后面元素大,设置flag的值为True。程序的功能是计算上升序列的个数。
例2 若字符串s的值为″abcde″,执行如下程序段后,变量res的值不可能是(  )
from random import randint
res=″″
i,j=0,len(s)-1
while i=i:
if randint(0,1) == 0: #randint(0,1)随机生成 0 或 1
  res+=s[i]
  i+=1
else:
  res+=s[j]
  j-=1
A.″abced″ B.″aecbd″
C.″aedbc″ D.″edcba″
思维点拨
明考向 变量i和j从两端向中间遍历,当i大于j时结束循环。若产生随机数为0,将s[i]连接到res中,向后移动i,否则将s[j]连接到res中,向前移动j
精点拨 A 产生的随机数为0,0,0,1,0
B 产生″ae″,i和j分别指向b和d,因此不可能连接到c
C 产生的随机数为0,1,1,0,0或0,1,1,0,1
D 产生的随机数均为1或1,1,1,1,0
答案 B
变式2 有如下Python程序段:
s=input(″输入字符串:″)
n=len(s)
i,j=0,n-1
result=″″
while i=n∥2:
if s[i]>s[j]:
   result+=s[i]; j-=1
elif s[i]  result+=s[j]; i+=1
else:
  i+=1;j-=1
print(result)
执行该程序段,分别输入下列选项中的字符串,输出结果不为“555”的是(  )
A.″51234″ B.″12535″
C.″54321″ D.″55123″
答案 B
解析 本题考查字符串的操作。该程序段的作用是将字符串s中左半部分与右半部分按照从大到小的顺序交替排列,生成一个新的字符串result。输入s字符串为12535时,输出结果为55。
重难点2 函数和模块
在算法的程序实现过程中,也经常根据具体问题的特点将其分解成若干个子问题或者借助所用程序设计语言的特性来完成问题的解决。Python主要运用函数、模块等方式实现模块化程序设计,为算法的程序实现带来极大的便利。自定义函数相当于一个小的程序块,函数的参数相当输入的信息,函数的形参和实参必须一一对应,函数的返回值相当输出信息。一个函数体内可以有多条return语句,当执行某条返回语句后,结束自定义函数运行,返回主程序。在Python中,把一组函数放到一个.py文件里,这个文件就称为一个模块。
例1 多选题评分,评分标准:全部选对得2分,选对但不全的得1分,不选或有选错的得0分。编制的自定义函数如下,其中x表示要判断的答案,y表示标准答案。选对但不全的答案判定方法为:遍历判断的答案每一个选项,若该选项在标准答案中存在则进行计数count,否则直接退出遍历。根据count的值与判断答案的长度是否相等来决定是选对但不全。
def df(x,y): #函数df(x,y)的功能是根据标准答案y,检测答题的答案x应得的分数ans。
if x==y:
  ①__________
else:
  count=0
  for i in x:
    if i in y:
     count+=1
    else:
     ②__________
  if ③________:
    ans=0
else:
    ans=1
return ans
da=input(″请你输入你的答案:″)
bzda=″ACD″
n=df(da,bzda)
print(″该题得分为:″+str(n))
思维点拨
明考向 本题考查自定义函数的应用
精点拨 ①要判断的答案x和标准答案y相同,得2分。②遍历判断的答案每一个选项,判断该选项在标准答案中是否存在。若不存在,说明有错选的选项。③若全部选项在标准答案中均能找到,则count的值就是len(x),若有找不到的,就是存在错选的,得0分,若没填涂,也得0分。
答案 ①ans=2 ②break
③count变式1 有如下 Python 程序段:
def half_s(s):
  n=len(s);result=″″
  i,j=0,n-1
  while i=n∥2:
   if s[i]>s[j]:
    result+=s[i];i+=1
   elif s[i]    result+=s[j];j-=1
   else:
    i+=1;j-=1
  return result
执行语句v=half_s(″welcome″),变量v的值是(  )
A.″come″ B.″wmol″
C.″www″ D.″emo″
答案 B
解析 本题考查自定义函数的应用。变量i从前往后遍历,变量j从后往前遍历,将s[i]和s[j]中较大者拼接到result中,若两者相等,直接略过。w和e比较,w大;e和e相等;l小于m;o大于l;l大于c;此时i的值为3,不满足条件i例2 有如下 Python 程序段:
import random
a=[0]*6
for i in range(6):
  x=int(random.random()*10)+1
  if i%2==1:
  a[i]=2*x+1
  elif x%2==0:
  a[i]=x∥2
  else:
  a[i]=x-1
print(a)
执行该程序段后,列表 a 中的值可能是(  )
A.3,11,4,19,2,13 B.3,11,7,9,2,3
C.9,3,1,23,4,17 D.3,3,9,0,19,8
思维点拨
明考向 本题考查随机数的应用。产生一个[1,10]之间的随机数,条件i%2==1成立,表示偶数位上是2*x+1奇数,在奇数位上,如果该数是偶数,将对该数进行整除操作,是奇数则对原数进行减1操作
精点拨 B 7若是整除得来,则原数是14,否则是减1得来,则原数是8,需减1
C 23超出范围
D 偶数位上不可能出现0
答案 A
变式2 有Python程序如下:
import random
n=7
a=[0]*n
a[0]=random.randint(60,100)
for i in range(1,n):
  a[i]=a[i-1]-random.randint(0,i)
for i in range(1,n,2):
  a[i]=a[i]-a[i-1]%2
print(a)
执行上述程序后,输出的数据可能为(  )
A.[67,65,64,64,61,61,54]
B.[72,71,72,69,67,62,57]
C.[83,81,81,77,75,73,69]
D.[94,94,94,89,89,88,82]
答案 C
解析 本题考查随机数。第一个循环的功能是产生一个非增数列,且从a[1]开始,与前面数的差距不得超过1,2,3,4,5,6。第二个循环的功能是对偶数位的数减去a[i-1]%2,即减去0或1。A选项最后一个数54与前一个数的差距为7,超出范围。B选项71前是偶数,可能是71-0,但后面不可能是72。D选项88前一个数是89,由此该数为89-1=88,而89-82=7,超出范围。
重难点1 算法控制结构
1.为实现按表中分数段进行等级划分,以下代码正确的是(  )
分数 x x≥90 80≤x<90 x<80
等级 level A B C
答案 D
解析 A选项多个分支结构,条件x>=80包括了第一个分支结构的情况。B选项elif后面未添加条件,语法错误。C选项不可能出现level='A'的情况。
2.有如下 Python 程序段:
s = input(″请输入一串字符串:″)
f = True
for i in range(len(s)∥2):
  if s[i] != s[len(s)-i-1]:
  f = False
  break
print(f)
若执行该程序后, 输出的结果是“True”,则输入的字符串可能是(  )
A.″onion″ B.″hello″
C.″278″ D.″111″
答案  D
解析 程序功能是检测字符串s是否为回文字符。
3.有如下Pyhon程序段:
a=[0]*101
for i in range(1,101):
  for j in range(i,101):
  if j % i==0:
    a[j]+=1
print(a[50])
执行该程序段后,输出列表元素a[50]的值为(  )
A.5 B.6 C.9 D.50
答案 B
解析 本题考查Python双循环及列表相关概念。外循环i枚举[1,100]的自然数,内循环j枚举[i,100]的所有数,当j是i的倍数时,对应的a[j]加1,故程序是在统计[1,100]中,每个数的因子个数,50的因子分别为1、50、2、25、5、10,共6个。
4.将有序数组 nums 中的重复项删除,编写的Python程序段如下:
nums=1
n=len(nums);i=1
while i  if nums[i] !=nums[i-1]:
 
  k+=1
  i+=1
nums=nums[:k]
上述程序段中方框处可选代码为:①k=0 ②k=1
③nums[k]=nums[i] ④nums[i-1]=nums[i],则(1)、(2)处代码依次为(  )
A.①③ B.①④ C.②③ D.②④
答案 C
解析 本题考查删除重复项的代码段理解。本题的思路是:从第二个字符开始遍历有序字符串s的各个字符,若前后相邻两个字符不相等,把当前字符重新赋值到字符串s中,此时的索引用k来表示,若前后两个字符相等, 则跳过当前字符,不组合。以[″a″,″a″,″b″,″b″,″b″,″c″]为例,最终会得到[″a″,″b″,″c″]。
5.数组元素a[0]到a[2*n-1]为互不相等的正整数(n≥1),要在其中找到最大值和最小值,并分别存储到变量max1和max2中。实现该功能的Python程序段如下:
max1=0;max2=0
for i in range(0,n*2,2):
  if a[i]>a[i+1]:
  t1=a[i];t2=a[i+1]
  else:
  t1=a[i+1];t2=a[i]
  if :
  max1=t1;max2=t2
  elif:
 max2=max1;max1=t1
 elif:
  max2=t1
上述程序段中方框处可选代码为:①t1>max1 ②t1>max2 ③t2>max1则(1)(2)(3)处语句依次为(  )
A.①②③ B.②③① C.③①② D.③②①
答案 C
解析 每次遍历2个元素,将这2个元素中较大值存入t1,较小值存入t2。若t2大于原最大值max1,需更新最大值和次大值。若t1大于最大值但t2小于次大值,则原最大值max1为次大值,同时更新最大值。若t1大于次大值,仅仅更新次大值为t1。若t1小于次大值,则无需更新max2和max1。
6.有如下Python程序段:
s1=input(″请输入字符串:″)
a=[0]*128
for item in s1:
  ch=ord(item)
  a[ch]=a[ch]+1
s2=″″
for i in range(len(a)):
  for j in range(a[i]):
  s2=s2+chr(i)
print(s2)
列表a各元素的初始值都为0,s1中输入的内容为″abs54int″。执行该程序后,程序输出的结果中第5个字符为(  )
A.n B.s C.4 D.i
答案 D
解析 利用桶统计字符串s1各个字符的个数,字母ch的ASCII码值作为桶的下标。遍历各个桶的下标i,若该桶a[i]不为0,将桶中各个字符chr(i)拼接到字符串s2中。
7.有如下Python程序段:
c,m=0,0
for i in range(2,len(a)):
  if a[i-2]+a[i-1]==a[i]:
  c+=1
  if c>m:
    m=c
  else:
  c=0
若列表a=[2,1,3,4,5,9,14,23],执行该程序段后,变量m的值是(  )
A.0 B.1 C.2 D.3
答案 D
解析 从第3个位置开始遍历,若该位置上值是前两个位置上数之和,统计连续符合这些条件的数据个数c,并找出c的最大值m。数据3,4符合条件,共连续2个数。数据9,14,23符合条件,共连续3个数。
8.有如下Python程序段,功能为删除非降序序列中的重复数:
a=[2,2,2,5,5,5,8 ]
k=i=0
while __(1)________:
if a[i]!=a[i+1]:
k+=1
   (2)________
i+=1
print(a[:k+1])
该程序执行结果为[2,5,8],划线处可选代码为
①iA.①③ B.①④ C.②③ D.②④
答案 C
解析 从输出语句print(a[:k+1])来看,k表示删除重复后数字个数。a[i]和a[i+1]比较,因此i的最大位置只能为len(a)-2。k的初值为0,保存了第1个数字,当条件a[i]!=a[i+1]成立时,k先加1,因此将a[i+1]保存到a[k]中。
9.有如下Python程序:
s1 =″0312″ ; s2 =″ABCDEFGH″
m = 0 ; c =″″
for i in range(len(s2)) :
  k = int(s1[i%4])
  m=4*(i∥4)
  c += s2[k+m]
执行该程序段后,变量c的值是(  )
A.″ADBCADBC″ B.″ABCDEFGH″
C.″AHBGCFDE″ D.″ADBCEHFG″
答案 D
解析 遍历字符串s2各个位置,当i为0至3时,m的值为0,其余m的值为4,即把字符串s2分成″ABCD″和″EFGH″两段,每段分别取出偏移位置为0,3,1,2的字符。
重难点2 函数和模块
1.有如下Python程序段:
def f(m):
  a=m%10
  b=m∥10%10
  c=m∥100
  if c**3+b**3+a**3==m:
  return ″YES″
  else:
  return ″NO″
m=int(input(″输入一个三位数:″))
print(f(m))
执行该程序段后,若输出结果为“YES”,则输入变量m值可能为(  )
A.121 B.134 C.153 D.142
答案  C
解析 本题考查自定义函数的应用。a、b、c分别数m的3个位上的数字,符合立方和等于他本身,因此属于水仙花数。
2.有如下程序代码
def sort(a):
  n=len(a)
  b=[0]*n
  num=k=0
  while k   if a[k]%2==1 :
  b[num]=a[k]
    num+=1
   else:
    a[k-num]=a[k]
   k+=1
  for j in range(n-num,n):
  a[j]=b[j-n+num]
  return a
ys=[5,10,21,7,24,14,9,11,36,37]
ans=sort(ys)
程序运行后,变量ans的值为(  )
A.[10,24,5,21,7] B.[5,7,10,21,24]
C.[5,21,7,10,24] D .[10,24,5,7,21]
答案 A
解析 程序实现功能为:对其中的奇偶数进行交换。交换后偶数在前,奇数在后,并保持相对顺序不变。
3.有如下Python程序:
def count(a,i):
  for j in range(i+1,len(a)):
 if a[j]     return j-i
  return 0
a=[4,2,2,4,1,6]
b=[1]*len(a)
for i in range(len(a)-1):
  b[i]=count(a,i)
print(b)
运行该程序,则 b[1]的值为(  )
A.0 B.1 C.2 D.3
答案 D
解析 自定义函数功能是在索引位置i后面找到第1个比该a[i]小的数,返回他们的之间的距离,若后面没有比较他小的数,返回0。数组b的值依次为[1, 3, 2, 1, 0, 1]。
4.所谓亲密数是指如果整数x的全部因子(包括1,不包括x自身)之和等于y,且整数y的全部因子之和等于x,则x和y称为一对亲密数(x与y不相等)。小王想通过Python程序统计1~1000间的亲密数对的个数。
def yzh(m):
  yz_sum=1
  for i in range(2,m∥2+1):
  if ①________:
     yz_sum+=i
  return yz_sum
n=0
for x in range(1,1001):
  y=yzh(x)
  if ②________:
  n=n+1
print(″共有亲密数对:″,n)
则代码中①②处的语句可为(  )
A.①m%i!=0 ②x==yzh(y) and x!=y
B.①m%i==0 ②x==yzh(y) and x!=y
C.①m%i!=0 ②x==yzh(y) or x!=y
D.①m%i==0 ②x==yzh(y) or x!=y
答案 B
解析 本题考查自定义函数及其调用。从程序可得自定义函数的功能为求自然数除本身外的因子和,①后将i累加进入,因此i为因数,满足m%i==0,②处for循环的作用为遍历1-1000所有的书,寻找总共有多少数是满足条件的,并且输出,以满足除x本身之外的所有因数之和为y,同时还需要满足x==yzh(y) and x!=y才能说是亲密数,因此答案为B。
5.生成一组由数字 1~8 组成的 8 位不重复的随机密码,Python 程序段如下:
from random import *
a=[0]*8
for i in range(8):
  a[i]=i+1
k=8;s=''
for i in range(8):
  m=randint(0,k-1)
 
print(s)
方框中的代码由以下三部分组成:
①k-=1 ②a[m]=a[k-1] ③s+=str(a[m])代码顺序正确的选项是(  )
A.①②③ B.②③① C.②①③ D.③②①
答案 D
解析 把随机产生的字符连入s中,将最后一个位置的字符移动到m的位置,同时把长度减小1。
6.有如下程序段:
from random import randint
s =″python″
k = randint(1, 4)
for i in range(k):
  j = i + 1
  while j < len(s) and s[j] > s[i]:
    j += 1
  if j < len(s):
  s = s[:j] + s[j + 1:]
  else:
  s = s[:len(s) - 1]
print(s)
执行该程序段后,s的值不可能是(  )
A.″py″ B.″pyo″ C.″pytn″ D.″pyton″
答案 C
解析 本题主要考查顺序查找。随机产生1-4范围内的整数,查找字符串s中索引大于i的字符中,第一个在字母表中位于s[i]之前的字符对应的索引位置j。如果查找到j,则s=s[:j]+s[j+1:]剔除字符串s中索引位置为j的字符。否则如果未找到或j超出字符串s的长度,剔除字符串s中最后一个字符。
7.小明用Python语言中对大小为100*100像素的图像“上.jpg”(如图所示)进行简单处理,部分代码如下:
img=Image.open(″上.jpg″)
im=np.array(img.convert(″L″)) #转换成数字矩阵
rows,cols=im.shape
for i in range(rows):
  for j in range(cols):
  if j%10==0:
    im[i,j]=0
程序执行后的图像效果是(  )
答案 D
解析 本题考查图像模块的应用。语句rows,cols=im.shape的功能是读取图像的宽度和高度。外循环是宽度,即按行遍历图像,每读取完一行中所有列,再读取下一行。当列为10的倍数时,将像素值修改为0,即改为黑色。A选项当行的值是10的倍数时,将像素置为黑色。B选项实现上下(垂直)翻转的效果。C选项实现左右(水平)翻转的效果。D选项当列的值是10的倍数时,将像素置为黑色。
重难点1 算法控制结构
1.如下Python程序段中,实现功能与其它三个不一样的是(  )
答案 D
解析 ABC选项实现若条件a>b成立,flag的值为True,否则为False。D选项无论a<= b是否成立,flag的值均为True。
2. 用Python语句描述城市主干道中机动车平均行驶速度v不低于30为畅通,小于20为堵塞,其余为拥挤,设v为机动车平均行驶速度(单位: km/h) ,则下列选项正确是(  )
答案 D
解析 本题考查分支控制结构。 A选项v<30中包含了堵塞和拥挤,不能区分。B选项在v>20中包含了畅通和拥挤,不能区分。C选项条件v>=30和v<20不可能同时满足。D选项先分为大于等于20和小于20的情况,再在大于等于20中区分拥挤和畅通。
3.有如下Python程序段:
a=[5,3,8,9,7,3,11]
n=len(a)-1
cnt=0
for i in range(1,n):
  if a[i]==a[i+1]-a[i-1]:
  cnt+=1
  elif a[i]>a[i+1]-a[i-1]:
  cnt+=2  
  else:
  cnt+=3
print(cnt)
执行该程序段后,变量cnt的值为(  )
A.9 B.10 C.11 D.12
答案 B
解析 本题考查数组运算。遍历列表a中元素,对于列表a中的第i个元素,如果其等于其相邻两个元素的差,则计数器cnt加1,否则,如果a[i]大于其相邻两个元素的差,则计数器cnt加2,否则计数器cnt加3。列表a中的第2个元素等于其相邻两个元素的差,因此cnt加1,列表a中的第3个到第5个元素都大于其相邻两个元素的差,因此计数器cnt会加2,而第6个元素a[i]小于其相邻两个元素的差,因此cnt加3。因此,最终计数器cnt的值为1+2+2+2+3=10。
4.下列程序执行后的结果为(  )
L = [1,-2,3,7,-8,9,10]
i,j= 0,len(L)-1
while i  while L[i]>=0:
i=i+1
  while L[j]<0:
j=j-1
  if iL[i],L[j] = L[j],L[i]
print(L[6])
A.3 B.9 C.-2 D.-8
答案 C
解析 在左边找到第1个小于0的数的位置i,在右边找到大于等于0的数的位置j,若i小于j,则交换两个位置上的数。程序的功能是把左边小于0的数交换到右边。第一次是-2和10交换,第2次是-8和9交换,交换后的序列为[1, 10, 3, 7, 9, -8, -2]。
5.有如下Python程序段:
import random
s=″″
p=[0,1,2,3]
random.shuffle(p) #将序列p中所有元素随机排序
for i in p:
  s+=chr(65+i)
运行该程序段后,变量s的值可能的是(  )
A.″acbd″ B.″aabc″ C.″ABCB″ D.″ADBC″
答案 D
解析 将序列p中所有元素随机排序,因此是产生的每一个数字是唯一的。
6.某Python程序如下:
s=input(″请输入字符串:″)
ans=″″
a=[1,2,3]
for i in range(len(s)):
  x=s[i]
  key=a[i%3]
  if ″A″<=s[i]<=″Z″:
  ans=ans+chr((ord(x)-65+key)%26+65)
  else:
  ans=ans+x
print(ans)
执行该程序后,输入″A1b2D3″输出的结果为(  )
A.2b1BF B.B1b2F3
C.B3e3F6 D.6F3e3B
答案  B
解析 表达式chr((ord(x)-65+key)%26+65)的功能是将大写字母x循环后移key个位置,而key只有3个值,不够时可以循环使用。如果是数字或小写字母直接相连。
7.有如下Python程序段:
a = [1] * 6
b = [96,88,84,91,99,80]
for i in range(5):
  for j in range(i+1,6):
  if b[j] > b[i]:
     a[i] += 1
  else:
     a[j] += 1
print(a)
该程序段运行后,列表a 的值为(  )
A.[5,3,2,4,6,1] B.[2,4,5,3,1,6]
C.[10,6,4,8,12,2] D.[4,8,10,6,2,12]
答案 B
解析 数组a记录b中对应数字的名次。 变量i从0开始遍历到4,变量j从i+1遍历到最后,若数组b中后面的数b[j]比当前的数b[i],则对a[i]进行计数,表示后面比他大的数的个数。以96为例,后面比他大的数只有99,因此他的位次为2。
8.某些数据中存在“数字山峰”,例如数据“21432748”中存在“1432”、“274”两座“数字山峰”(必须包含上坡与下坡),下面程序用于求数据中“数字山峰”的数量:
num=input(″请输入数字串:″);c=0
(1)________
for i in range(1,len(num)):
  if (2)________ and f==False:
f=True
  elif (3)__________ and f==True:
c=c+1
f=False
print(″有″,c,″座数字山峰″)方框(1)(2)(3)的代码由以下部分组成:
①f=True ②f=False ③num[i-1]>num[i] ④num[i-1]下列选项中代码顺序正确的是(  )
A.①③④ B.①④③ C.②③④ D.②④③
答案  D
解析 变量f表示是否是上坡的标志,初值False表示未找到上坡,变量i从1开始遍历,当找到第1个num[i]大于num[i-1],表示找到了上坡,将f设置为True。若状态为上坡,当找到第1个num[i]小于num[i-1]时,表示找到了下坡,变量c进行计数,同时将f的设置为False,在此状态下,即使出现多个num[i]小于num[i-1]时,也不会计数。
9.有如下Python程序段:
import random
a=[]
for i in range(10):
  a.append(random.randint(1,100))
i=1
while i <10:
  if i==0:
  i=1
  elif a[i-1]<=a[i]:
  ①________
  else:
  a[i],a[i-1]=a[i-1],a[i]
  ②________
print(a)
执行该程序段实现了随机生成一个数组,并将其元素递增输出的功能。划线处的代码应该是(  )
A.①i+=1 ②i-=1 B.①i-=1 ②i=1
C.①i+=1 ②i+=1 D.①i-=1 ②i-=1
答案 A
解析 ①若条件 a[i-1]<=a[i]成立,表示已经是递增序列,继续遍历后面的元素。②若不是递增序列,交换两个数的位置,再退回前一位置i-1,比较是否是递增。分支if i==0的功能是:当产生一个序列中最小的数时,交接并返回前一位置,最后一次为a[0]和a[1]进行交换,i的值为0,下次应从索引1开始重新遍历。
10.有一组正整数,要求对其中的奇偶数进行交换。交换后偶数在前,奇数在后,并保持相对顺序不变。
a=[5,10,21,7,24,14,9,11,36,37]
n=len(a);b=[0]*n
num=0;k=0
while k   if :
    b[num]=a[k]
    num+=1
  else:
   
  k+=1
for j in range(n-num,n):
   
print(a)
将加框处的代码补充完整,正确的是(  )
A.①a[k]%2==1 ②a[k-num]=a[k] ③a[j]=b[j-n+num]
B.①a[k]%2==0 ②b[k-num]=a[k] ③a[j]=b[j+num]
C.①a[k]%2==0 ②a[k-num]=a[k] ③a[j]=b[j+num]
D.①a[k]%2==1 ②b[k-num]=a[k] ③a[j]=b[j-n+num]
答案 A
解析 本题考查while循环控制结构。用循环k来遍历数组a,当前共有k个数,num表示奇数的个数,则k-num表示偶数的个数,如果遍历到奇数,则将该数保存到数组b中,如果是偶数,将该数移动到k-num位置中。最后将b中数全部转移到数组a中。
11.子序列是指数组中连续的若干个元素(至少 1 个元素)。数组 a 中有 n 个整型元素(有正有负),现要查找和最大的子序列,并输出和。实现该功能的程序段如下,方框中应填入的正确代码为(  )
def maxsub(a) :
  tot= -1; tmp = 0
  for num in a:
  tmp += num
  return tot
a=[-2,1,-3,4,-1,2,1,-5,4]
print (maxsub(a))
答案 C
解析 本题考查算法的综合应用能力。寻找和最大的子序列问题,基本算法是边求和边求最大值。tmp用来求连续子序列的和,当和小于0时,tmp初始化为0,再次求下一段的和及最大值。
12.有如下Python程序段:
a = [123,32,66,12,54,95,211]
p = q = a[0]
for x in a[1:]:
  if x < p:
  p, q = x, p
  elif x < q:
  q = x
print(q)
执行该程序段后,输出的结果是(  )
A.123 B.32 C.211 D.12
答案  B
解析 p和q是数组a中最小值,从第2个数开始遍历数组,若遍历到的数比p小,将p赋值给q,将最小值赋值给p。若比q小,将该值赋值给q,因此q是该数组中次小值,p是该数组中最小值。
13.有如下 Python 程序段:
a = [3, 3, 7, 8, 8, 10, 12, 99]
j = k = res = 0
for i in range(len(a)-1):
  while a[j] - a[i] < 5:
j = j + 1;
  while a[k] - a[i] <= 5:
k = k + 1
  if a[j] - a[i] == 5 and a[k-1] - a[i] == 5:
res += k - j
执行程序后,变量res的值是(  )
A.2 B.3 C.4 D.5
答案 D
解析 程序统计两个数相减等于5的不同位置上数对的数量。当i为0时,j和k的值为3和5,res值为2;当i为1时,j和k的值不变,res累加为 4;i为2时,j和k的值为6和7,res值为5;再往后遍历,res值不变。
14.有如下Python程序:
#输入包含5个不重复元素的数组a,代码略
i,c=0,0
key=int(input(″key=″))
for j in range(len(a)):
  if a[j]%key==0:
  c+=1
  else:
  a[j-c]=a[j]
print(a)
运行该程序,若输入key为2,则输出的a不可能为(  )
A.[3,7,5,4,5] B.[3,7,1,5,5]
C.[3,5,0,3,5] D.[9,7,4,7,3]
答案 D
解析 遍历数组a,变量c表示a[j]整除key(偶数)个数,若不是偶数,将其放在前面。A选项a初始值是[3,7,偶,4,5],偶表示该位置上是一个偶数。B选项第4个是偶数,则后面的5覆盖而来。C选项a初始值是[偶,偶,0,3,5]。D选项第2个是偶数,则7覆盖第2个数,但3一定要覆盖4。
15.有如下Python程序段:
p={};s=input()
for i in range(len(s)):
  p[s[i]]=i
i=0
while i  n=p[s[i]]
  j=i+1
  while j<=n:
   if p[s[j]]>n:
    n=p[s[j]]
   j=j+1
  print(s[i:j])
  i=j
若输入“arrayiybi”,则输出结果的最后一行内容是(  )
A.arra B.yiy C.iybi D.yiybi
答案 D
解析 将输入的字符串划分为几个子串,同一个字母只出现在同一个子串中并分段输出。字典p记录每种字母的最大索引值,字符串“arrayiybi”分成“arra”和“yiybi” 2个子串。
16.已排好序的列表a有n个元素,下标为0~n-1,现要实现去重,并输出去重后的结果。如:1,2,2,3,输出1,2,3。实现该功能的程序段如下,方框中应填入的代码为(  )
#输入列表a的元素,并排好序
cnt=0
n=len(a)
A.for i in range(1,n):
   if a[i]!=a[i-1]:
cnt+=1
a[cnt]=a[i]
B.for i in range(n-1):
   if a[i]!=a[i+1]:
a[cnt]=a[i]
cnt+=1
C.i=0
while iif a[i]!=a[i+1]:
     cnt+=1
     a[cnt]=a[i]
i+=1
D.i=1
while i   if a[i]!=a[i-1]
cnt+=1
a[i]=a[cnt]
   i+=1
答案 A
解析 本题考查数据的去重。A选项当数组前后两个值不同时,进行计数,并将该数保存a[cnt]中。C选项当a[0]和a[1]不同时,赋值语句功能为a[1]=a[0],即重复地将第一个数据存入到下个为止。D选项当a[0]和a[1]不同时,赋值语句功能为a[1]=a[1],此时若第二个不同出现在a[2]和a[3],则赋值成a[3]=a[2],不满足将不同的值列下,即输入的数据为[1,2,2,3]时,输出结果为[1,2,2] 。
重难点2 函数和模块
1.有如下程序段:
def ds(s,i):
  if ″a″<=s[i]<=″z″:
   s=s[:i]+s[i+1:]
  elif ″0″<=s[i]<=″9″:
   s=s[:i]+str((int(s[i])+6)%10)+s[i+1:]
  return s
s=″Yy23mm4″
i=0
while i  s=ds(s,i)
  i+=1
print(s)
执行上述程序段后,s的值为(  )
A.″Y89m0″ B.″Y29m0″
C.″y23m4″ D.″89mm0″
答案 B
解析 如果是小写字母,则进行删除操作。若是一个数字,循环向后移3位。i=1时,删除字符y,s=″Y23mm4″,接着i值为2,3变9,删除第1个m,接着4变0。
2.使用Python程序编程探究平面上圆与圆的位置(圆心距离等于两个圆半径之和)相切的关系,程序代码如下:
def judge(a,b):
dis=(cir[a][0]-cir[b][0])**2+(cir[a][1]-cir[b][1])**2
if dis==(cir[a][2]+cir[b][2])**2:
    return 1
return 0
cir={'A':[1,1,1],'B':[4,5,4],'C':[0,2,1]}
#cir 用于存储编号为'A'、'B'、'C'的三个圆圆心的 x,y 坐标及半径信息
cnt=judge('A','B')+judge('A','C')+judge('B','C')
运行程序后,变量 cnt 的值是(  )
A.0 B.1 C.2 D.3
答案 C
解析 本题考查自定义函数。字典cir初始存储了三个圆的圆心和半径信息。judge('A','B')是判断圆A和圆B是否相切,如果相切,返回值为1,否则为0。当前A、B两圆,B、C两圆相切,所以变量cnt的值为2 。
3.有如下Python加密程序段,以下说法正确的是(  )
def encrypt(code,key):
  code_new=''
  for s in code:
   code_new+=chr(s1)
  return code_new
code=input(″code=″)
print(encrypt(code,2))
A.该加密程序段所用的加密算法是换位密码法
B.若输入字符串 code 为“App”,则输出的结果为 crr
C.若要对数字字符逐个右移进行加密,则只需将加框处语句修改为“(int(s)+key)%10”
D.将加框处语句修改为“ord('a')+((ord(s)-ord('a'))-key)%26”可将加密的密文还原为明文
答案 D
解析 A选项是替代加密。B选项输出结果为wrr。
4.有如下Python程序段:
def delstr(s,m):
  return s[0:m]+s[m+1:]
s=″Welcome″
i=0
while i<=len(s):
  s=delstr(s,i)
  i+=2
print(s)
执行该程序段后,输出的结果为(  )
A.ecm B.elome C.elco D.elom
答案 D
解析 自定义函数的功能:在字符串s中删除索引位置为m的字符。i值依次为0,2,4,字符串s的值依次为elcome、elome、elom。
5.有如下 Python 程序段:
from random import randint
s=″Infomation″
for i in range(2):  
  k=randint(0,2)*2+1 #randint(0,2)随机产生[0,2]之间的整数
  s=s[:k]+s[k+1:]
执行该程序段后,变量 s 的值不可能是(  )
A.″Iomation″ B.″Inmation″
C.″Infation″ D.″Ifoation″
答案 B
解析 语句s=s[:k]+s[k+1:]的功能是去除该字符串索引k位置上字符。循环2次,每次产生一个0至5之间的奇数k,接着去除k位字符。A选项″Infomation″→″Ifomation″→″Iomation″,k值均为1。B选项″Infomation″→″Infmation″→″Inmation″,k值依次为3和2,2不可能产生。C选项″Infomation″→″Infmation″→″Infation″,k值均为3。
6.英语单词″illustriousness″意思是优秀,有如下Python程序段:
import random
s=″illustriousness″
for i in range(4):
  k=random.randint(0,4)*random.randint(0,3)
  print(s[k],end=″″)
执行该程序后,输出的结果不可能是(  )
A.uiso B.iiii C.tree D.siur
答案  C
解析 k的值为0至4之间的数乘以0至3之间的数,[0,4]*0值均为0,[0,4]*1值依次为0、1、2、3、4,[0,4]*2值依次为0、2、4、6、8,[0,4]*3值依次为0、3、6、9、12,因此不可能产生5,7,10,11,即字符中不可能包含t。
7.某Python代码如下:
import random
lst =[0]*8 #定义列表lst,lst[0]~lst[7]初始值均为0
i = 0
while i < 8:
  if i % 2 == 0:
    lst[i] = int(random.random()*10)
  else:
    lst[i] = int(random.randint(1,5))*2+1
  i += 1
print(lst)
执行后程序后,列表lst[0]~lst[7]各元素值可能的是(  )
A.[0,10,2,9,8,3,4,5] B.[8,5,4,7,10,3,6,9]
C.[4,11,3,5,9,6,1,7] D.[6,3,1,11,7,3,5,9]
答案 D
解析 本题主要考查Python中循环和分支语句的综合运用,该程序语句的作用是当i依次取[0,8]的值时,若i为偶数,则以i为索引的列表1st中的元素为[0,9]内的随机整数,若i为奇数,则以i为索引的列表1st中的元素为[0,5]内的随机整数的2倍加1(必定为奇数)。
8.有如下Python程序段:
import random
a = [0]*6
i = 0
x = int(input())
while i <= 5:
  c = random.randint(1, 10)
  if x % 2 == c % 2:
  a[i] = c
 i += 1
 x = x∥2
执行该程序段后,若要在列表a中产生4个偶数、2个奇数,输入的x的值不可能的是(  )
A.3 B.4 C.5 D.6
答案 B
解析 条件x % 2 == c % 2表示x和c同时为奇数或偶数。A选项x的值依次为3,1,0,0,0;B选项x的值依次为4,2,1,0,0;C选项x的值依次为5,2,1,0,0;D选项x的值依次为6,3,1,0,0。
9.有下列Python程序段:
import random
s=input(″请输入字符串:″)
x=random.randint(3,6)
n=len(s)
if len(s[0:x])  r=s[x:n]+s[0:x]
else:
  r=s[0:x]+s[x:n]
print(r)
执行该程序段,若输入“helloworld”(不包含双引号),则输出的结果不可能的是(  )
A.loworldhel B.oworldhell
C.helloworld D.worldhello
答案 D
解析 本题综合考查了Random模块函数的应用及分支结构及字符串的切片。X为采用Random模块产生的[3,6]之间的随机整数,按照题意输入helloworld后n的值为10,带入if的条件表达式可得,执行第一个分支(将索引值x前面的字符后置)的条件为x<5,推得执行第二个分支(不改变字符顺序)的条件为x>=5,通过对选项的处理可知A中hel后置,x的值为3,可行;B选项hell后置,x的值为4,符合条件,可行;C选项不改变顺序,x>=5,可行;D选项hello后置,可得x=5,而x=5时应执行第二个分支的语句。
10.编写一个自定义函数实现用户的登录,用户最多有3次可以尝试输入用户名和密码的机会。请在划线处填入合适的代码。
def login(a,b,u): #在字典u中判断用户名a是否存在,密码b是否正确
  if ①________:
  if ②________:
    print(″密码不正确″)
    return False
  else:
    print(″登录成功″)
    ③________
else:
  print(″帐号不正确″)
  return False
u={″cgm″:″sd@1″,″cgl″:″&dd5″,″cjm″:″##22sd″,″lbh″:″12sa″,″ljs″:″sd22!″} #系统中存在的用户名
trytime=3
while trytime>0: #有3次机会可以输入用户名和密码
  user=input(″请输入你的用户名:″)
  psd=input(″请输入你的密码:″)
  if ④________:
  break
 else:
  print(″你还剩下″,trytime-1,″次机会可以输入密码!″)
 ⑤________
答案 ①a in u ②b!=u[a] ③return True ④login(user,psd,u) ⑤trytime-=1
解析 本题考查自定义函数编写和调用。①在字典u中判断用户名a是否存在,密码b是否正确,首先判断a是否在字典b中,若存在用户u,则该用户的用户名是键,密码是值u[a],因此②处答案为b!=u[a]。当两者均正确时,需返回True。④处调用login函数,把用户名user、密码psd和字典u分别传至自定义函数中。⑤处将改变trytime的值,尝试的次数将减少一次。
11.将图形转化为文本。应用Python中的Image模块后,将字母图片文件″OK.jpg″处理成由0,1表达的文本文件“OK.txt”。字母图片如图a所示,运行后文本文件结果如图b所示。
实现该功能的Python程序如下,请完成划线处的程序代码。
from PIL import Image
def judge(R,G,B):
  gray=0.299*R+0.587*G+0.114*B #转成灰度值
  color= gray/132
  return color
img = Image.open(″OK.jpg″)
pix = img.load()
file=open(①________,″w″) #读写方式打开文本文件
width = img.size[0]
②________
for i in range(height):
  line=″″
  for j in range(width):
  R,G,B=pix[j,i] #根据像素坐标获得该点的RGB值
  ③________
  if color==0:
     line+=″1″
  else:
     line+=″0″
  file.write(line) #写入OK.txt文件
 file.write(″\\n″)
  file.close()
答案 ①″OK.txt″ ②height = img.size[1] ③color = judge(R,G, B)
解析 本题考查Image模块的应用。①中读取文件名″OK.txt″。 ②中语句width = img.size[0]获取图像宽度,循环中for i in range(height)要求图像的高度。③中未对color赋值,调用自定义函数,返回0或1。(共111张PPT)
第二部分 算法与程序设计
专题8 Python程序语言基础
1.掌握Python表达式运算符的优先级和常见内置函数的应用;
2.掌握自定义函数的编写和调用;
3.掌握常见模块的应用;
4.掌握算法的三种控制结构.
目 录
CONTENTS
体系构建
01
真题再现
02
考点精练
03
当堂检测
04
课后练习
05
体系构建
1
数据是程序运行的原料,Python的基本数据类型有整型、实型、字符串型和布尔型等,但相同类型的数据往往存储在列表或字典中,列表是有序线性结构,可以通过索引去访问每个元素的值,而字典是无序的,只能通过键去访问其值。对数据的操作有多种运算符,内置的函数能快速地解决一些求和、平均值排序等常见的问题。算法有三种基本结构,选择结构和循环结构可以看成是一个小小的模块,由这些模块组成了一个顺序结构,这个结构就是一个大的算法。实现某个功能的语句可以写在一个模块内,这个模块就是函数,只要传给函数相应的参数,函数可以返回相应的计算结果。把多个相关的函数封装在一个文件中,这个文件就是一个库,就是一个模块。
真题再现
2
A
解析 先将7保存在a[n-1],变量i从n-2遍历到x,将当前位置i后面的值移动到当前位置。
考点精练
3
重难点1 算法控制结构
算法=逻辑+控制,这是Pascal设计者Niklaus Wirth的一本著作的书名,它刻画了过程式尤其是结构化编程的思想。控制指的是程序设计中顺序、选择和循环三种基本控制结构。分支结构分为单分支结构、双分支结构和多分支结构,而分支结构的组合可以分为多个分支语句和分支的嵌套。多分支结构和多个分支语句的区别在于多分支结构只执行其中一条判断条件,而多个分支语句依次执行每个分支结构语句。遍历是算法最核心的思想,往往用循环结构来实现。可以按位置遍历,如 for i in range(20);也可以按元素进行遍历,如for i in [3,2,1,7]。用while语句往往实现满足某个条件时的遍历。
B.if x==0 or y==0:
result=″数轴″
if x==0 and y==0:
result=″原点″
else:
result=″象限″
C.if x!=0 and y!=0:
result=″象限″
if x==0 or y==0:
result=″数轴″
else:
result=″原点″
D.if x!=0 and y!=0:
   result=″象限″
if x==0 and y==0:
   result=″原点″
if x==0 or y==0:
result=″数轴″
答案 D
思维点拨
明考向 本题考查Python基本控制结构。 (0,0)是原点,即 if x==0 and y==0 表示原点;(0,y)或者(x,0)分别表示 y 轴与 x 轴
精点拨 A x==y==0时,第1个和第2个if均成立
B if x==0 or y==0且x与y不同时为0表示数轴,在第2个分支语句中,再次判断为″象限″
C 条件x!=0 and y!=0成立,判断为″象限″,在第2个分支语句中,再次判断为″原点″,因此原点的判断需在数轴之前
D 分三种情况,用3条分支语句来表达这种情况
变式1 有如下 Python 程序段:
a=[1,5,9,2,6,8,3,4,7]
n=0 ;flag=False
if a[0]  flag=True
for i in range(len(a)-1):
  if a[i]  n+=1;flag=False
  elif a[i]>a[i+1] and flag==False:
  flag=True
print(n)
执行上述程序段后,输出的值为(  )
A.1 B.2 C.3 D.4
C
解析 本题考查程序控制结构。遍历数组a,若当前位置元素比后面元素小,且flag的值为True,则对n进行计数,同时将flag的值设置为False。若当前位置元素比后面元素大,设置flag的值为True。程序的功能是计算上升序列的个数。
B
思维点拨
明考向 变量i和j从两端向中间遍历,当i大于j时结束循环。若产生随机数为0,将s[i]连接到res中,向后移动i,否则将s[j]连接到res中,向前移动j
精点拨 A 产生的随机数为0,0,0,1,0
B 产生″ae″,i和j分别指向b和d,因此不可能连接到c
C 产生的随机数为0,1,1,0,0或0,1,1,0,1
D 产生的随机数均为1或1,1,1,1,0
变式2 有如下Python程序段:
s=input(″输入字符串:″)
n=len(s)
i,j=0,n-1
result=″″
while i=n∥2:
if s[i]>s[j]:
   result+=s[i]; j-=1
elif s[i]  result+=s[j]; i+=1
else:
  i+=1;j-=1
print(result)
执行该程序段,分别输入下列选项中的字符串,输出结果不为“555”的是(  )
A.″51234″ B.″12535″ C.″54321″ D.″55123″
B
解析 本题考查字符串的操作。该程序段的作用是将字符串s中左半部分与右半部分按照从大到小的顺序交替排列,生成一个新的字符串result。输入s字符串为12535时,输出结果为55。
重难点2 函数和模块
在算法的程序实现过程中,也经常根据具体问题的特点将其分解成若干个子问题或者借助所用程序设计语言的特性来完成问题的解决。Python主要运用函数、模块等方式实现模块化程序设计,为算法的程序实现带来极大的便利。自定义函数相当于一个小的程序块,函数的参数相当输入的信息,函数的形参和实参必须一一对应,函数的返回值相当输出信息。一个函数体内可以有多条return语句,当执行某条返回语句后,结束自定义函数运行,返回主程序。在Python中,把一组函数放到一个.py文件里,这个文件就称为一个模块。
for i in x:
    if i in y:
     count+=1
    else:
     ②__________
  if ③________:
    ans=0
else:
    ans=1
return ans
da=input(″请你输入你的答案:″)
bzda=″ACD″
n=df(da,bzda)
print(″该题得分为:″+str(n))
思维点拨
明考向 本题考查自定义函数的应用
精点拨 ①要判断的答案x和标准答案y相同,得2分。②遍历判断的答案每一个选项,判断该选项在标准答案中是否存在。若不存在,说明有错选的选项。③若全部选项在标准答案中均能找到,则count的值就是len(x),若有找不到的,就是存在错选的,得0分,若没填涂,也得0分。
答案 ①ans=2 ②break ③count变式1 有如下 Python 程序段:
def half_s(s):
  n=len(s);result=″″
  i,j=0,n-1
  while i=n∥2:
   if s[i]>s[j]:
    result+=s[i];i+=1
   elif s[i]    result+=s[j];j-=1
   else:
    i+=1;j-=1
  return result
执行语句v=half_s(″welcome″),变量v的值是(  )
A.″come″ B.″wmol″ C.″www″ D.″emo″
B
解析 本题考查自定义函数的应用。变量i从前往后遍历,变量j从后往前遍历,将s[i]和s[j]中较大者拼接到result中,若两者相等,直接略过。w和e比较,w大;e和e相等;l小于m;o大于l;l大于c;此时i的值为3,不满足条件iA
思维点拨
明考向 本题考查随机数的应用。产生一个[1,10]之间的随机数,条件i%2==1成立,表示偶数位上是2*x+1奇数,在奇数位上,如果该数是偶数,将对该数进行整除操作,是奇数则对原数进行减1操作
精点拨 B 7若是整除得来,则原数是14,否则是减1得来,则原数是8,需减1
C 23超出范围
D 偶数位上不可能出现0
变式2 有Python程序如下:
import random
n=7
a=[0]*n
a[0]=random.randint(60,100)
for i in range(1,n):
  a[i]=a[i-1]-random.randint(0,i)
for i in range(1,n,2):
  a[i]=a[i]-a[i-1]%2
print(a)
执行上述程序后,输出的数据可能为(  )
A.[67,65,64,64,61,61,54] B.[72,71,72,69,67,62,57]
C.[83,81,81,77,75,73,69] D.[94,94,94,89,89,88,82]
C
解析 本题考查随机数。第一个循环的功能是产生一个非增数列,且从a[1]开始,与前面数的差距不得超过1,2,3,4,5,6。第二个循环的功能是对偶数位的数减去a[i-1]%2,即减去0或1。A选项最后一个数54与前一个数的差距为7,超出范围。B选项71前是偶数,可能是71-0,但后面不可能是72。D选项88前一个数是89,由此该数为89-1=88,而89-82=7,超出范围。
当堂检测
4
重难点1 算法控制结构
重难点2 函数和模块
1.为实现按表中分数段进行等级划分,以下代码正确的是(  )
D
分数 x x≥90 80≤x<90 x<80
等级 level A B C
解析 A选项多个分支结构,条件x>=80包括了第一个分支结构的情况。B选项elif后面未添加条件,语法错误。C选项不可能出现level='A'的情况。
D
解析 程序功能是检测字符串s是否为回文字符。
B
解析 本题考查Python双循环及列表相关概念。外循环i枚举[1,100]的自然数,内循环j枚举[i,100]的所有数,当j是i的倍数时,对应的a[j]加1,故程序是在统计[1,100]中,每个数的因子个数,50的因子分别为1、50、2、25、5、10,共6个。
C
解析 本题考查删除重复项的代码段理解。本题的思路是:从第二个字符开始遍历有序字符串s的各个字符,若前后相邻两个字符不相等,把当前字符重新赋值到字符串s中,此时的索引用k来表示,若前后两个字符相等, 则跳过当前字符,不组合。以[″a″,″a″,″b″,″b″,″b″,″c″]为例,最终会得到[″a″,″b″,″c″]。
max2=t1
上述程序段中方框处可选代码为:①t1>max1 ②t1>max2 ③t2>max1则(1)(2)(3)处语句依次为(  )
A.①②③ B.②③① C.③①② D.③②①
C
解析 每次遍历2个元素,将这2个元素中较大值存入t1,较小值存入t2。若t2大于原最大值max1,需更新最大值和次大值。若t1大于最大值但t2小于次大值,则原最大值max1为次大值,同时更新最大值。若t1大于次大值,仅仅更新次大值为t1。若t1小于次大值,则无需更新max2和max1。
D
6.有如下Python程序段:
s1=input(″请输入字符串:″)
a=[0]*128
for item in s1:
  ch=ord(item)
  a[ch]=a[ch]+1
s2=″″
for i in range(len(a)):
  for j in range(a[i]):
  s2=s2+chr(i)
print(s2)
列表a各元素的初始值都为0,s1中输入的内容为″abs54int″。执行该程序后,程序输出的结果中第5个字符为(  )
A.n B.s C.4 D.i
解析 利用桶统计字符串s1各个字符的个数,字母ch的ASCII码值作为桶的下标。遍历各个桶的下标i,若该桶a[i]不为0,将桶中各个字符chr(i)拼接到字符串s2中。
D
解析 从第3个位置开始遍历,若该位置上值是前两个位置上数之和,统计连续符合这些条件的数据个数c,并找出c的最大值m。数据3,4符合条件,共连续2个数。数据9,14,23符合条件,共连续3个数。
C
8.有如下Python程序段,功能为删除非降序序列中的重复数:
a=[2,2,2,5,5,5,8 ]
k=i=0
while __(1)________:
if a[i]!=a[i+1]:
k+=1
   (2)________
i+=1
print(a[:k+1])
该程序执行结果为[2,5,8],划线处可选代码为
①iA.①③ B.①④ C.②③ D.②④
解析 从输出语句print(a[:k+1])来看,k表示删除重复后数字个数。a[i]和a[i+1]比较,因此i的最大位置只能为len(a)-2。k的初值为0,保存了第1个数字,当条件a[i]!=a[i+1]成立时,k先加1,因此将a[i+1]保存到a[k]中。
D
解析 遍历字符串s2各个位置,当i为0至3时,m的值为0,其余m的值为4,即把字符串s2分成″ABCD″和″EFGH″两段,每段分别取出偏移位置为0,3,1,2的字符。
C
1.有如下Python程序段:
def f(m):
  a=m%10
  b=m∥10%10
  c=m∥100
  if c**3+b**3+a**3==m:
  return ″YES″
  else:
  return ″NO″
m=int(input(″输入一个三位数:″))
print(f(m))
执行该程序段后,若输出结果为“YES”,则输入变量m值可能为(  )
A.121 B.134 C.153 D.142
解析 本题考查自定义函数的应用。a、b、c分别数m的3个位上的数字,符合立方和等于他本身,因此属于水仙花数。
   k+=1
  for j in range(n-num,n):
  a[j]=b[j-n+num]
  return a
ys=[5,10,21,7,24,14,9,11,36,37]
ans=sort(ys)
程序运行后,变量ans的值为(  )
A.[10,24,5,21,7] B.[5,7,10,21,24]
C.[5,21,7,10,24] D .[10,24,5,7,21]
A
解析 程序实现功能为:对其中的奇偶数进行交换。交换后偶数在前,奇数在后,并保持相对顺序不变。
D
解析 自定义函数功能是在索引位置i后面找到第1个比该a[i]小的数,返回他们的之间的距离,若后面没有比较他小的数,返回0。数组b的值依次为[1, 3, 2, 1, 0, 1]。
B
解析 本题考查自定义函数及其调用。从程序可得自定义函数的功能为求自然数除本身外的因子和,①后将i累加进入,因此i为因数,满足m%i==0,②处for循环的作用为遍历1-1000所有的书,寻找总共有多少数是满足条件的,并且输出,以满足除x本身之外的所有因数之和为y,同时还需要满足x==yzh(y) and x!=y才能说是亲密数,因此答案为B。
D
解析 把随机产生的字符连入s中,将最后一个位置的字符移动到m的位置,同时把长度减小1。
C
解析 本题主要考查顺序查找。随机产生1-4范围内的整数,查找字符串s中索引大于i的字符中,第一个在字母表中位于s[i]之前的字符对应的索引位置j。如果查找到j,则s=s[:j]+s[j+1:]剔除字符串s中索引位置为j的字符。否则如果未找到或j超出字符串s的长度,剔除字符串s中最后一个字符。
D
7.小明用Python语言中对大小为100*100像素的图像“上.jpg”(如图所示)进行简单处理,部分代码如下:
img=Image.open(″上.jpg″)
im=np.array(img.convert(″L″)) #转换成数字矩阵
rows,cols=im.shape
for i in range(rows):
  for j in range(cols):
  if j%10==0:
    im[i,j]=0
程序执行后的图像效果是(  )
解析 本题考查图像模块的应用。语句rows,cols=im.shape的功能是读取图像的宽度和高度。外循环是宽度,即按行遍历图像,每读取完一行中所有列,再读取下一行。当列为10的倍数时,将像素值修改为0,即改为黑色。A选项当行的值是10的倍数时,将像素置为黑色。B选项实现上下(垂直)翻转的效果。C选项实现左右(水平)翻转的效果。D选项当列的值是10的倍数时,将像素置为黑色。
课后练习
5
重难点1 算法控制结构
重难点2 函数和模块
1.如下Python程序段中,实现功能与其它三个不一样的是(  )
D
解析 ABC选项实现若条件a>b成立,flag的值为True,否则为False。D选项无论a<= b是否成立,flag的值均为True。
2. 用Python语句描述城市主干道中机动车平均行驶速度v不低于30为畅通,小于20为堵塞,其余为拥挤,设v为机动车平均行驶速度(单位: km/h) ,则下列选项正确是(  )
答案 D
解析 本题考查分支控制结构。 A选项v<30中包含了堵塞和拥挤,不能区分。B选项在v>20中包含了畅通和拥挤,不能区分。C选项条件v>=30和v<20不可能同时满足。D选项先分为大于等于20和小于20的情况,再在大于等于20中区分拥挤和畅通。
3.有如下Python程序段:
a=[5,3,8,9,7,3,11]
n=len(a)-1
cnt=0
for i in range(1,n):
  if a[i]==a[i+1]-a[i-1]:
  cnt+=1
  elif a[i]>a[i+1]-a[i-1]:
  cnt+=2  
  else:
  cnt+=3
print(cnt)
执行该程序段后,变量cnt的值为(  )
A.9 B.10 C.11 D.12
B
解析 本题考查数组运算。遍历列表a中元素,对于列表a中的第i个元素,如果其等于其相邻两个元素的差,则计数器cnt加1,否则,如果a[i]大于其相邻两个元素的差,则计数器cnt加2,否则计数器cnt加3。列表a中的第2个元素等于其相邻两个元素的差,因此cnt加1,列表a中的第3个到第5个元素都大于其相邻两个元素的差,因此计数器cnt会加2,而第6个元素a[i]小于其相邻两个元素的差,因此cnt加3。因此,最终计数器cnt的值为1+2+2+2+3=10。
C
解析 在左边找到第1个小于0的数的位置i,在右边找到大于等于0的数的位置j,若i小于j,则交换两个位置上的数。程序的功能是把左边小于0的数交换到右边。第一次是-2和10交换,第2次是-8和9交换,交换后的序列为[1, 10, 3, 7, 9, -8, -2]。
D
解析 将序列p中所有元素随机排序,因此是产生的每一个数字是唯一的。
5.有如下Python程序段:
import random
s=″″
p=[0,1,2,3]
random.shuffle(p) #将序列p中所有元素随机排序
for i in p:
  s+=chr(65+i)
运行该程序段后,变量s的值可能的是(  )
A.″acbd″ B.″aabc″ C.″ABCB″ D.″ADBC″
6.某Python程序如下:
s=input(″请输入字符串:″)
ans=″″
a=[1,2,3]
for i in range(len(s)):
x=s[i]
  key=a[i%3]
  if ″A″<=s[i]<=″Z″:
  ans=ans+chr((ord(x)-65+key)%26+65)
  else:
  ans=ans+x
print(ans)
执行该程序后,输入″A1b2D3″输出的结果为(  )
A.2b1BF B.B1b2F3 C.B3e3F6 D.6F3e3B
B
解析 表达式chr((ord(x)-65+key)%26+65)的功能是将大写字母x循环后移key个位置,而key只有3个值,不够时可以循环使用。如果是数字或小写字母直接相连。
7.有如下Python程序段:
a = [1] * 6
b = [96,88,84,91,99,80]
for i in range(5):
  for j in range(i+1,6):
  if b[j] > b[i]:
      a[i] += 1
  else:
      a[j] += 1
print(a)
该程序段运行后,列表a 的值为(  )
A.[5,3,2,4,6,1] B.[2,4,5,3,1,6]
C.[10,6,4,8,12,2] D.[4,8,10,6,2,12]
B
解析 数组a记录b中对应数字的名次。 变量i从0开始遍历到4,变量j从i+1遍历到最后,若数组b中后面的数b[j]比当前的数b[i],则对a[i]进行计数,表示后面比他大的数的个数。以96为例,后面比他大的数只有99,因此他的位次为2。
D
解析 变量f表示是否是上坡的标志,初值False表示未找到上坡,变量i从1开始遍历,当找到第1个num[i]大于num[i-1],表示找到了上坡,将f设置为True。若状态为上坡,当找到第1个num[i]小于num[i-1]时,表示找到了下坡,变量c进行计数,同时将f的设置为False,在此状态下,即使出现多个num[i]小于num[i-1]时,也不会计数。
A
解析 ①若条件 a[i-1]<=a[i]成立,表示已经是递增序列,继续遍历后面的元素。②若不是递增序列,交换两个数的位置,再退回前一位置i-1,比较是否是递增。分支if i==0的功能是:当产生一个序列中最小的数时,交接并返回前一位置,最后一次为a[0]和a[1]进行交换,i的值为0,下次应从索引1开始重新遍历。
A
解析 本题考查while循环控制结构。用循环k来遍历数组a,当前共有k个数,num表示奇数的个数,则k-num表示偶数的个数,如果遍历到奇数,则将该数保存到数组b中,如果是偶数,将该数移动到k-num位置中。最后将b中数全部转移到数组a中。
答案 C
解析 本题考查算法的综合应用能力。寻找和最大的子序列问题,基本算法是边求和边求最大值。tmp用来求连续子序列的和,当和小于0时,tmp初始化为0,再次求下一段的和及最大值。
12.有如下Python程序段:
a = [123,32,66,12,54,95,211]
p = q = a[0]
for x in a[1:]:
  if x < p:
  p, q = x, p
  elif x < q:
  q = x
print(q)
执行该程序段后,输出的结果是(  )
A.123 B.32 C.211 D.12
B
解析 p和q是数组a中最小值,从第2个数开始遍历数组,若遍历到的数比p小,将p赋值给q,将最小值赋值给p。若比q小,将该值赋值给q,因此q是该数组中次小值,p是该数组中最小值。
D
解析 程序统计两个数相减等于5的不同位置上数对的数量。当i为0时,j和k的值为3和5,res值为2;当i为1时,j和k的值不变,res累加为 4;i为2时,j和k的值为6和7,res值为5;再往后遍历,res值不变。
D
解析 遍历数组a,变量c表示a[j]整除key(偶数)个数,若不是偶数,将其放在前面。A选项a初始值是[3,7,偶,4,5],偶表示该位置上是一个偶数。B选项第4个是偶数,则后面的5覆盖而来。C选项a初始值是[偶,偶,0,3,5]。D选项第2个是偶数,则7覆盖第2个数,但3一定要覆盖4。
D
解析 将输入的字符串划分为几个子串,同一个字母只出现在同一个子串中并分段输出。字典p记录每种字母的最大索引值,字符串“arrayiybi”分成“arra”和“yiybi” 2个子串。
答案 A
解析 本题考查数据的去重。A选项当数组前后两个值不同时,进行计数,并将该数保存a[cnt]中。C选项当a[0]和a[1]不同时,赋值语句功能为a[1]=a[0],即重复地将第一个数据存入到下个为止。D选项当a[0]和a[1]不同时,赋值语句功能为a[1]=a[1],此时若第二个不同出现在a[2]和a[3],则赋值成a[3]=a[2],不满足将不同的值列下,即输入的数据为[1,2,2,3]时,输出结果为[1,2,2] 。
B
解析 如果是小写字母,则进行删除操作。若是一个数字,循环向后移3位。i=1时,删除字符y,s=″Y23mm4″,接着i值为2,3变9,删除第1个m,接着4变0。
C
解析 本题考查自定义函数。字典cir初始存储了三个圆的圆心和半径信息。judge('A','B')是判断圆A和圆B是否相切,如果相切,返回值为1,否则为0。当前A、B两圆,B、C两圆相切,所以变量cnt的值为2 。
A.该加密程序段所用的加密算法是换位密码法
B.若输入字符串 code 为“App”,则输出的结果为 crr
C.若要对数字字符逐个右移进行加密,则只需将加框处语句修改为“(int(s)+key)%10”
D.将加框处语句修改为“ord('a')+((ord(s)-ord('a'))-key)%26”可将加密的密文还原为明文
答案 D
解析 A选项是替代加密。B选项输出结果为wrr。
D
解析 自定义函数的功能:在字符串s中删除索引位置为m的字符。i值依次为0,2,4,字符串s的值依次为elcome、elome、elom。
B
5.有如下 Python 程序段:
from random import randint
s=″Infomation″
for i in range(2):  
 k=randint(0,2)*2+1 #randint(0,2)随机产生[0,2]之间的整数
 s=s[:k]+s[k+1:]
执行该程序段后,变量 s 的值
A.″Iomation″ B.″Inmation″
C.″Infation″ D.″Ifoation″
解析 语句s=s[:k]+s[k+1:]的功能是去除该字符串索引k位置上字符。循环2次,每次产生一个0至5之间的奇数k,接着去除k位字符。A选项″Infomation″→″Ifomation″→″Iomation″,k值均为1。B选项″Infomation″→″Infmation″→″Inmation″,k值依次为3和2,2不可能产生。C选项″Infomation″→″Infmation″→″Infation″,k值均为3。
C
解析 k的值为0至4之间的数乘以0至3之间的数,[0,4]*0值均为0,[0,4]*1值依次为0、1、2、3、4,[0,4]*2值依次为0、2、4、6、8,[0,4]*3值依次为0、3、6、9、12,因此不可能产生5,7,10,11,即字符中不可能包含t。
6.英语单词″illustriousness″意思是优秀,有如下Python程序段:
import random
s=″illustriousness″
for i in range(4):
  k=random.randint(0,4)*random.randint(0,3)
  print(s[k],end=″″)
执行该程序后,输出的结果
A.uiso B.iiii C.tree D.siur
D
解析 本题主要考查Python中循环和分支语句的综合运用,该程序语句的作用是当i依次取[0,8]的值时,若i为偶数,则以i为索引的列表1st中的元素为[0,9]内的随机整数,若i为奇数,则以i为索引的列表1st中的元素为[0,5]内的随机整数的2倍加1(必定为奇数)。
执行该程序段后,若要在列表a中产生4个偶数、2个奇数,输入的x的值
A.3 B.4 C.5 D.6
B
解析 条件x % 2 == c % 2表示x和c同时为奇数或偶数。A选项x的值依次为3,1,0,0,0;B选项x的值依次为4,2,1,0,0;C选项x的值依次为5,2,1,0,0;D选项x的值依次为6,3,1,0,0。
9.有下列Python程序段:
import random
s=input(″请输入字符串:″)
x=random.randint(3,6)
n=len(s)
if len(s[0:x])  r=s[x:n]+s[0:x]
else:
  r=s[0:x]+s[x:n]
print(r)
执行该程序段,若输入“helloworld”(不包含双引号),则输出的结果
(  )
A.loworldhel B.oworldhell
C.helloworld D.worldhello
D
解析 本题综合考查了Random模块函数的应用及分支结构及字符串的切片。X为采用Random模块产生的[3,6]之间的随机整数,按照题意输入helloworld后n的值为10,带入if的条件表达式可得,执行第一个分支(将索引值x前面的字符后置)的条件为x<5,推得执行第二个分支(不改变字符顺序)的条件为x>=5,通过对选项的处理可知A中hel后置,x的值为3,可行;B选项hell后置,x的值为4,符合条件,可行;C选项不改变顺序,x>=5,可行;D选项hello后置,可得x=5,而x=5时应执行第二个分支的语句。
解析 本题考查自定义函数编写和调用。①在字典u中判断用户名a是否存在,密码b是否正确,首先判断a是否在字典b中,若存在用户u,则该用户的用户名是键,密码是值u[a],因此②处答案为b!=u[a]。当两者均正确时,需返回True。④处调用login函数,把用户名user、密码psd和字典u分别传至自定义函数中。⑤处将改变trytime的值,尝试的次数将减少一次。
答案 ①a in u ②b!=u[a] ③return True ④login(user,psd,u) ⑤trytime-=1
11.将图形转化为文本。应用Python中的Image模块后,将字母图片文件″OK.jpg″处理成由0,1表达的文本文件“OK.txt”。字母图片如图a所示,运行后文本文件结果如图b所示。
实现该功能的Python程序如下,请完成
划线处的程序代码。
from PIL import Image
def judge(R,G,B):
  gray=0.299*R+0.587*G+0.114*B
 #转成灰度值
  color= gray/132
  return color
img = Image.open(″OK.jpg″)
pix = img.load()
file=open(①________,″w″) #读写方式打开文本文件
width = img.size[0]
②________
for i in range(height):
  line=″″
  for j in range(width):
  R,G,B=pix[j,i] #根据像素坐标获得该点的RGB值
  ③________
  if color==0:
    line+=″1″
  else:
    line+=″0″
  file.write(line) #写入OK.txt文件
file.write(″\\n″)
  file.close()
答案 ①″OK.txt″ ②height = img.size[1] ③color = judge(R,G, B)
解析 本题考查Image模块的应用。①中读取文件名″OK.txt″。 ②中语句width = img.size[0]获取图像宽度,循环中for i in range(height)要求图像的高度。③中未对color赋值,调用自定义函数,返回0或1。

展开更多......

收起↑

资源列表