必修一 数据与计算 课时6 自定义函数和模块(课件 教案)2027届高中通用技术一轮复习

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

必修一 数据与计算 课时6 自定义函数和模块(课件 教案)2027届高中通用技术一轮复习

资源简介

课时6 自定义函数和模块
【学业要求】
知识点 学业水平等级
1.掌握自定义函数的构造和调用方法。 3
2.掌握模块的导入方法和常用函数的应用。 2
  第15题往往会体现模块化的程序设计算法思想,突出表现是将某些功能封装在特定的自定义函数中,第2小题就是典型的代表。往往要考查学生对程序的阅读理解能力,如程序运行的结果,程序运行后某个变量的值,修改语句后某些功能未能实现,能测试出这些问题的数据是什么。本节课需要学生理解自定义函数的参数传递、返回的值以及调用的方法。
(2024年6月浙江选考)某数据序列data中的元素均为小于127的正整数。现在要对data进行加密,处理过程分“变换”和“重排”两步。“变换”处理方法是用指定的n组序列 R0、R1…R(n-1)依次对data进行变换。利用Ri对data进行变换的过程是:在data中查找所有与Ri相同的子序列,将找到的每个子序列中的元素值加上Ri的长度值Li,并在各子序列前插入一个标记元素(值为127+Li),这些子序列及标记元素不再参与后续的变换。
如data为[3,5,1,6,3,8,7,5,1,8,7],指定的两组序列为[5,1]、[3,8,7],“变换”处理后的data为[3,129,7,3,6,130,6,11,10,129,7,3,8,7]。
对data“重排”处理通过给定的shuff函数实现。请回答下列问题:
“重排”处理的shuff函数如下:
def shuff(data, c): #根据列表c对列表data进行重排
  #若列表data的长度不是列表c长度的整数倍,则用0补足,代码略
  m=len(c);s=[0]*m
  k=0
  while k    for i in range(m):
     s[i]=data[k+i]
    for i in range(m):
     data[k+i]=s[c[i]]
    k+=m
若data为[3,129,7,3,130,6,11,10],c为[1,3,0,2],调用shuff(data, c)后,data的最后一个元素值为    。
答案 11
解析 本题考查索引数组和二维数组的应用。shuff函数的功能是以列表c长度进行分组,第1个for循环是将某段的数据读入到s数组中,第2个for是将c列表中索引位置重新进行排列。data共分2组,第2组数据为[130,6,11,10],按c为[1,3,0,2]进行调整,重排后为[6,10,130, 11],因此最后一个数据为11。
1.在算法的程序实现过程中,也经常根据具体问题的特点将其分解成若干个       或者借助所用程序设计语言的特性来完成问题的解决。
2.Python主要运用    、    等方式实现模块化程序设计,为算法的程序实现带来极大的便利。
3.定义函数的语法如下:
def 函数名(参数集合):
  <函数体>
  [return     ]
4.函数名的命名规则和变量名一样。完成函数的构造后,在程序中就可以根据需要    该函数。
5.Python内置模块:数学运算    模块、生成随机数    模块、图像Image模块。
6.在Python中,把一组函数放到一个.py文件里,这个文件就称为      。
7.使用    语句或from-import语句导入Python内置的模块和来自第三方的模块,将能使用其中的函数。
自我校对:1.子问题 2.函数 模块 3.函数值
4.调用 5.Math Random 6.一个模块 7.import
【典例1】 编写一个自定义函数实现判断字符串s是否是回文字符串。
算法思想:采用双指针分别指向首尾字符,若两者相同,依次向中间靠拢。
def hw(s):
 i,j=0,len(s)-1
 while ①    :
   if ②    :
    return False
   i+=1
   j-=1
 return True
s1=input('请输入字符串s:')
t=hw(s1)
if ③    :
  print("字符串"+s1+"是回文字符串!")
else:
  print("字符串"+s1+"不是回文字符串!")
思维点拨
明考向 本题自定义函数的应用
精点拨 ①指针i和j分别指向字符串s的首和尾,在两端各取一个字符进行比较,若i==j意味着该字符串长度为奇数,中间位置可以不用比较,若字符串长度为偶数,最后一次比较完后,i将超出j的值。②若两端各取一个字符,取出的字符不相等,返回假。③调用自定义函数,将函数的值赋给t,那么t可能是True或False
答案 ①i【变式1】 多选题评分,评分标准:全部选对得2分,选对但不全的得1分,不选或有选错的得0分。编制的自定义函数如下,其中x表示要判断的答案,y表示标准答案。
选对但不全的答案判定方法为:遍历判断的答案每一个选项,若该选项在标准答案中存在则进行计数count,否则直接退出遍历。根据count的值与判断答案的长度是否相等来决定是选对但不全。
def df(x,y):
 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))
答案 ①ans=2 ②break ③count解析 本题考查自定义函数的应用。①要判断的答案x和标准答案y相同,得2分。②遍历判断的答案每一个选项,判断该选项在标准答案中是否存在。若不存在,说明有错选的选项。③若全部选项在标准答案中均能找到,则count的值就是len(x),若有找不到的,就是存在错选的,得0分,若没填涂,也得0分。
【典例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语言中对大小为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的倍数时,将像素置为黑色。
  自定义函数相当于一个小的程序块,函数的参数相当于输入的信息,函数的形参和实参必须一一对应,函数的返回值相当于输出信息。一个函数体内可以有多条return语句,当执行某条返回语句后,结束自定义函数运行,返回主程序。自定义函数调用的过程分为把实参赋值给形参、运算获得结果、返回运算结果三个步骤。
1.数组a[0]至a[n-1]依次存放着n个数据,现需要删除数组中第x个元素(第1个元素为a[0])。实现该功能的自定义程序如下,方框中应填入的正确代码为(  )
def delstr(a,x):
 for i in range(x-1, len(a)-1, 1):
    
 return len(a)-1 #返回删除后的数组长度
A.a[i]=a[i+1] B.a[i+1]=a[i]
C.a[i]=a[i-1] D.a[i-1]=a[i]
答案 A
解析 第x个元素的索引位置为x-1,从该位置开始,将他后面的元素向前移动一个位置。
2.有如下Python程序段:
def fun(x,y,z):
 s=1
 for i in range(y):
   s=s*(x-i)
   if not z:
    s=s∥(i+1)
 return s
执行语句r=fun(7,3,False),变量r的值是(  )
A.21 B.35
C.42 D.210
答案 B
解析 程序的功能求在x个数中选择y个,有多少种组合。当i的值为0时,s的值为7;为当i为1时,s的值为7*6,满足条件not z,因此s的值为7*6/2。当i为2时,s的值为7*6/2*5,满足条件not z,因此s的值为7*6/2*5/3,结果为35。
3.有如下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个位上的数字,符合立方和等于他本身,因此属于水仙花数。
4.列表s包含n个元素,现要对列表s进行消除操作:选择两个相邻且相同的元素进行删除。反复执行该操作,直到无法继续消除。例如:列表s为["a","b","b","a","c","a"],完成所有消除操作后,结果为["c","a"]。实现上述功能的Python程序段如下:
def f(s):
 left,right=0,0
 while right   s[left]=s[right]
   if left>0 and s[left]==s[left-1]:
      (1)     
   else:
      (2)    
   (3)    
 return s[0:left]
上述程序段中方框处可选代码为:
①left+=1 ②left-=1 ③right+=1
④right-=1 则(1)(2)(3)处代码依次为(  )
A.①②③ B.②①④
C.②①③ D.②③①
答案 C
解析 语句s[left]=s[right]将快指针对应的值赋值给慢指针对应位置,left指向已处理部分的后1位,故输出时,切片应不包含left right为快指针,left为慢指针,终止条件为快指针遍历完全部元素,因此(3)处为right=right+1。(1)满足条件s[left]==s[left-1]表示遇到相同元素,应执行删除操作,left的值将减少1。否则left的值将增加1,因此(2)空执行left+=1。
5.有如下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]。
6.有如下Python程序段:
import random
s='abcdefghijklmnopq'
for i in range(4):
  k=random.randint(0,4)+random.randint(0,1)*10
  print(s[k],end='')
执行该程序后,输出的结果不可能是(  )
A.ddaa B.eaeo
C.dfam D.nemc
答案 C
解析 本题考查随机数模块的应用。表达式random.randint(0,4)产生一个0-4(包含)之间的随机整数,random.randint(0,1)产生随机数0或者1,random.randint(0,1)*10产生随机数0或者10,因此k的值为[0,1,2,3,4,10,11,12,13,14]中的任意一个,for循环循环四次,每次用k作为位置去访问字符串s, 'abcdefghijklmnopq'划线字母为可能访问到并且输出的字符。A选项random.randint(0,4)产生的值依次为3,3,0,0,random.randint(0,1)产生的值均为0。B选项random.randint(0,4)产生的值依次为4,0,4,4,random.randint(0,1)产生的值均为0,0,0,1。C选项中的f的索引为5,不可能访问该字符。D选项random.randint(0,4)产生的值依次为3,4,2,2,random.randint(0,1)产生的值均为1,0,1,0。
7.假如正整数x在n进位下的平方可以分割为两个正整数,且这两个数相加后恰等于x,那么x就是n进位下的卡布列克数。例如92=81,而9=8+1,所以9是十进位下的卡布列克数,9也是十进位下最小的有意义的卡布列克数。编写如下自定义函数判定x是否为十进位下的卡布列克数。
def Kaprekar_number(x):
 w=10;m=x*x
 while m>w and m % w!=0: #①
   if m∥w+m%w==x: #②
     return True
   w *= 10 # ③
 else:#与while语句对齐
   return False
关于上述程序代码,以下说法正确的是(  )
A.执行语句 print(Kaprekar_number(45)),输出结果为False
B.若将语句①while后面的m>w修改为m>=w,其他部分保持不变,不影响函数功能
C.语句块②可用语句return m∥w+m%w==x代替
D.交换②所在if语句块和语句③的顺序,不影响函数功能
答案 B
解析 程序的功能是计算x的平方m,计算m∥w+m%w之和是否与x相等,若相等则返回True。A选项45的平方为2025,当w为100时,20+25=45,因此返回为True。B选项当m=w时,条件m%w!=0肯定不成立,因此修改后程序功能不变。C选项若w为10,m∥w与m% w之和与x不相等,直接结束返回False,而不会去检测100或更大的w。D选项交换后,没有检测w为10的情况。
8.在一次抽奖活动中,需要在8人中随机抽取3个幸运奖,对应的Python程序如下:
import random
xm=["A","B","C","D","E","F","G","H"]
#用字母代表人名
hj=[""]*3;
bz=[False]*8
i=0
while i<=2:
  n=random.randint(0,7)
       
print(hj)
程序划线处代码合适的是(  )
A.if bz[n]==False:
   hj[i]=xm[n]
   bz[n]=True
   i+=1
B.if bz[n]==True:
   hj[i]=xm[n]
   bz[n]=False
   i+=1
C.if bz[i]==False:
   hj[n]=xm[i]
   bz[i]=True
   i+=1
D.if bz[i]==True:
   hj[n]=xm[i]
   bz[i]=True
   i+=1
答案 A
解析 本题考查随机函数的应用。列表bz中有8个元素,其初值均为False,表示该索引号对应的xm元素没有抽到奖。变量i表示第几个幸运观众,变量n表示幸运观众的索引号。
9.有如下Python程序段:
import random
a=[-1]*5
for i in range(len(a)):
 a[i]=random.randint(1,10) #产生一个[1,10]之间的整数
for i in range(2,4):
 key=a[i]
 j=i-1
 while j>=1 and key   a[j+1]=a[j]
   j-=1
 a[j+1]=key
执行该程序段后,变量a可能的值为(  )
A.[1,0,3,6,7] B.[3,2,6,7,1]
C.[1,3,2,5,7] D.[3,5,6,2,7]
答案 B
解析 本题考查随机数应用和顺序查找。在循环体中,i的值为2或3,语句key=a[i]的功能是把a[i]的值保存到key中,同时可以腾出位置i,在他前面的数a[j],如果满足key10.某Python程序如下,则执行该程序段后,下列说法中不正确的是(  )
def f(a,left,right):
 tmp=a[0]
 while left  while lefttmp:
    right-=1
  a[left]=a[right]
  while left    left+=1
  a[right]=a[left]
 a[left]=tmp #②
 return a
a=[5,3,8,1,2,9,4,7,6]
print(f(a,0,len(a)-1))
A.程序运行过程中,①处语句共执行了5次
B.程序运行后,其输出结果为[4,3,2,1,5,9,8,7,6]
C.在函数f的调用过程中,变量left最终的值为4
D.若将②处语句代码改为“a[right]=tmp”,则对本题结果无影响
答案 A
解析 函数实现的功能是将大于a[0]的数交换到右边,小于a[0]的数交换到左边,因此程序运行后的结果为[4,3,2,1,5,9,8,7,6],left和right的值均为4,将②处语句代码改为“a[right]=tmp”,则对本题结果无影响。①处语句共执行了4次。
1.有Python程序如下:
def f(s):
 n=len(s);ans=""
 i=0;j=n-1
 while i=n∥2:
  if s[i]>=s[j]:
    ans+=s[i]
     j-=1
  else:
    ans+=s[j]
    i+=1
 return ans
s=input("输入字符串:")
print(f(s))
执行该程序段,分别输入下列选项中的字符串,输出结果不为“ppp”的是(  )
A.python B.public
C.purple D.phrase
答案 D
解析 变量i从前往后遍历字符串s的一半长,变量j从后往前遍历字符串s的一半长。若条件s[i]>=s[j]成立,ans连接s[i],j向前移动,否则ans连接s[j],i向后移动。A选项p依次大于n,o,h。B选项p依次大于c,i,l。C选项p依次大于等于e,l,p。D选项p依次大于e,但p,h,r均小于s,因此运行的结果为psss。
2.某加密算法程序段如下所示:
def jiami(x):
 if "A"<=x<="Z":
   y=chr(ord(x)+32)
 elif "0"<=x<="9":
   y=str((int(x)+1)%10)
 else:
   y=x
 return y
mingwen=input("请输入明文")
miwen=""
for x in mingwen:
 miwen=miwen+jiami(x)
print("密文为:",miwen)
输入“Abc@789”并运行程序,输出结果是(  )
A.abc8910 B.abc@890
C.ABC678 D.aBC@789
答案 B
解析 函数的功能是对字符串每个字符进行加密,如果是大写,转换成对应的小写字母,如果是数字,循环后移一位。其他不变,依次连接在后面。
3.有如下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,6,字符串s的值依次为elcome、elome、elom。
4.有如下Python程序:
def count(lst):
 n=len(lst)
 rank=[1 for i in range(n)]
 for i in range(n-1):
   for j in range(i+1,n):
    if lst[i]>=lst[j]:
      rank[j]+=1
    else:
      rank[i]+=1
 return rank
lst=[89, 86, 99, 89, 97]
print(count(lst))
运行该程序后的输出结果是(  )
A.[3, 5, 1, 4, 2] B.[4, 5, 1, 3, 2]
C.[2, 4,0, 3, 1] B.[3, 4, 0, 2, 1]
答案 A
解析 程序功能是统计名次,在比较的值相同的情况,前面的名次小。
5.子序列是指数组中连续的若干个元素(至少 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,再次求下一段的和及最大值。
6.有下列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时应执行第二个分支的语句。
7.有如下程序段:
import random #导入随机数模块
n=random.randint(0,100) #产生0-100之间的随机整数,包含0和100
m=n;k=0;s=''
while n!=1:
 for i in range(2,n+1):
   if n%i==0:
     k=i
     n=n∥k
     s=s+str(k)+'*'
     break
print(m,'=',s[0:len(s)-1])
上述程序执行后,输出结果不可能的是(  )
A.67=67 B.34=2*17
C.54=2*3*3*3 D.20=2*3*4
答案 D
解析 随机产生一个正整数n,将该数进行质因子分解。D选项4是2的因子,因此不可能。
8.有如下Python程序段:
import random
n=random.randint(40,90)
a=[]
for i in range(2,n+1):
 while n%i==0:
   a.append(i)#列表a末尾追加一个元素 i
   n=n∥i
print(a)
执行程序段后,输出结果可能的是(  )
A.[2,2,2,9] B.[2,3,3,5]
C.[2,3,3,7] D.[51]
答案 B
解析 程序的功能产生一个40-90之间的随机数,并将他分解成各个质因子的乘积。A选项9可以分解成3*3。B选项产生n的值为90。C选项产生n的值为126,超出范围。D选项51可以分解为3*17。
9.判断[left,right]内每个整数是否被a中一个或多个区间所覆盖,若是返回True,否则返回False。例如:a=[[1,10],[8,20],[11,30]],left=5,right=21,则5~10内每个数可以被[1,10]区间覆盖,11~20内每个数可以被[8,20]区间覆盖,21可以被[11,30]区间覆盖,因此返回True。若将right改为31,则返回False。实现该功能的自定义函数如下:
def judge(a,left,right):
 #对列表a按a[i][0]的值升序排序,代码略
 i=0
 while i  if a[i][0]<=left<=a[i][1]:
    (1)    
  else:
    (2)    
  if left>right:
    (3)    
  (4)    
上述程序段中划线处可选代码为:
①i+=1 ②left+=1 ③return True
④return False
则(1)(2)(3)(4)处代码依次为(  )
A.②①③④ B.①②③④
C.②①④③ D.①②④③
答案 A
解析 条件a[i][0]<=left<=a[i][1]成立,表示当前索引为i的区间包含整数left,因此可以判断left的下一个整数,(1)中应填写的内容是left+=1。若left>right,说明索引0至i的区间已经包含要求的数据,(3)中应填写的内容为return True。若条件a[i][0]<=left<=a[i][1]不成立,则在下一个(第i+1个)区间中判断是否包含要求的数据。遍历完整个列表a,条件left>right不成立,则返回False。
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","1bh":"12sa","1js":"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) ⑤trytime-=1
解析 本题考查自定义函数编写和调用。①在字典u中判断用户名a是否存在,密码b是否正确,首先判断a是否在字典b中,若存在用户u,则该用户的用户名是键,密码是值u[a],因此②处答案为b!=u[a]。当两者均正确时,需返回True。④处调用login函数,把用户名user和密码psd分别传至自定义函数中。⑤处将改变trytime的值,尝试的次数将减少一次。(共66张PPT)
必修一 数据与计算
课时6 自定义函数和模块
知识点 学业水平等级
1.掌握自定义函数的构造和调用方法。 3
2.掌握模块的导入方法和常用函数的应用。 2
目 录
CONTENTS
真题剖析
01
知识梳理
02
课堂突破
03
当堂检测
04
课后作业
05
真题剖析
1
  第15题往往会体现模块化的程序设计算法思想,突出表现是将某些功能封装在特定的自定义函数中,第2小题就是典型的代表。往往要考查学生对程序的阅读理解能力,如程序运行的结果,程序运行后某个变量的值,修改语句后某些功能未能实现,能测试出这些问题的数据是什么。本节课需要学生理解自定义函数的参数传递、返回的值以及调用的方法。
(2024年6月浙江选考)某数据序列data中的元素均为小于127的正整数。现在要对data进行加密,处理过程分“变换”和“重排”两步。“变换”处理方法是用指定的n组序列 R0、R1…R(n-1)依次对data进行变换。利用Ri对data进行变换的过程是:在data中查找所有与Ri相同的子序列,将找到的每个子序列中的元素值加上Ri的长度值Li,并在各子序列前插入一个标记元素(值为127+Li),这些子序列及标记元素不再参与后续的变换。
如data为[3,5,1,6,3,8,7,5,1,8,7],指定的两组序列为[5,1]、[3,8,7],“变换”处理后的data为[3,129,7,3,6,130,6,11,10,129,7,3,8,7]。
对data“重排”处理通过给定的shuff函数实现。请回答下列问题:
“重排”处理的shuff函数如下:
def shuff(data, c): #根据列表c对列表data进行重排
  #若列表data的长度不是列表c长度的整数倍,则用0补足,代码略
  m=len(c);s=[0]*m
  k=0
  while k    for i in range(m):
     s[i]=data[k+i]
    for i in range(m):
     data[k+i]=s[c[i]]
    k+=m
若data为[3,129,7,3,130,6,11,10],c为[1,3,0,2],调用shuff(data, c)后,data的最后一个元素值为______ 。
答案 11
解析 本题考查索引数组和二维数组的应用。shuff函数的功能是以列表c长度进行分组,第1个for循环是将某段的数据读入到s数组中,第2个for是将c列表中索引位置重新进行排列。data共分2组,第2组数据为[130,6,11,10],按c为[1,3,0,2]进行调整,重排后为[6,10,130, 11],因此最后一个数据为11。
知识梳理
2
1.在算法的程序实现过程中,也经常根据具体问题的特点将其分解成若干个______________或者借助所用程序设计语言的特性来完成问题的解决。
2.Python主要运用________、________等方式实现模块化程序设计,为算法的程序实现带来极大的便利。
3.定义函数的语法如下:
def 函数名(参数集合):
  <函数体>
  [return ________]
子问题
函数
模块
函数值
4.函数名的命名规则和变量名一样。完成函数的构造后,在程序中就可以根据需要________该函数。
5.Python内置模块:数学运算________模块、生成随机数________模块、图像Image模块。
6.在Python中,把一组函数放到一个.py文件里,这个文件就称为____________。
7.使用________语句或from-import语句导入Python内置的模块和来自第三方的模块,将能使用其中的函数。
调用
Math
Random
一个模块
import
课堂突破
3
【典例1】 编写一个自定义函数实现判断字符串s是否是回文字符串。
算法思想:采用双指针分别指向首尾字符,若两者相同,依次向中间靠拢。
def hw(s):
 i,j=0,len(s)-1
 while ①________:
   if ②________:
    return False
   i+=1
   j-=1
 return True
s1=input('请输入字符串s:')
t=hw(s1)
if ③________:
  print("字符串"+s1+"是回文字符串!")
else:
  print("字符串"+s1+"不是回文字符串!")
答案 ①i思维点拨
明考向 本题自定义函数的应用
精点拨 ①指针i和j分别指向字符串s的首和尾,在两端各取一个字符进行比较,若i==j意味着该字符串长度为奇数,中间位置可以不用比较,若字符串长度为偶数,最后一次比较完后,i将超出j的值。②若两端各取一个字符,取出的字符不相等,返回假。③调用自定义函数,将函数的值赋给t,那么t可能是True或False
【变式1】 多选题评分,评分标准:全部选对得2分,选对但不全的得1分,不选或有选错的得0分。编制的自定义函数如下,其中x表示要判断的答案,y表示标准答案。
选对但不全的答案判定方法为:遍历判断的答案每一个选项,若该选项在标准答案中存在则进行计数count,否则直接退出遍历。根据count的值与判断答案的长度是否相等来决定是选对但不全。
def df(x,y):
 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))
答案 ①ans=2 ②break ③count解析 本题考查自定义函数的应用。①要判断的答案x和标准答案y相同,得2分。②遍历判断的答案每一个选项,判断该选项在标准答案中是否存在。若不存在,说明有错选的选项。③若全部选项在标准答案中均能找到,则count的值就是len(x),若有找不到的,就是存在错选的,得0分,若没填涂,也得0分。
【典例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"
答案 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语言中对大小为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的倍数时,将像素置为黑色。
  自定义函数相当于一个小的程序块,函数的参数相当于输入的信息,函数的形参和实参必须一一对应,函数的返回值相当于输出信息。一个函数体内可以有多条return语句,当执行某条返回语句后,结束自定义函数运行,返回主程序。自定义函数调用的过程分为把实参赋值给形参、运算获得结果、返回运算结果三个步骤。
当堂检测
4
1.数组a[0]至a[n-1]依次存放着n个数据,现需要删除数组中第x个元素(第1个元素为a[0])。实现该功能的自定义程序如下,方框中应填入的正确代码为(  )
def delstr(a,x):
 for i in range(x-1, len(a)-1, 1):
 
 return len(a)-1 #返回删除后的数组长度
A.a[i]=a[i+1] B.a[i+1]=a[i]
C.a[i]=a[i-1] D.a[i-1]=a[i]
A
解析 第x个元素的索引位置为x-1,从该位置开始,将他后面的元素向前移动一个位置。
2.有如下Python程序段:
def fun(x,y,z):
 s=1
 for i in range(y):
   s=s*(x-i)
   if not z:
    s=s∥(i+1)
 return s
执行语句r=fun(7,3,False),变量r的值是(  )
A.21      B.35      C.42      D.210
B
解析 程序的功能求在x个数中选择y个,有多少种组合。当i的值为0时,s的值为7;为当i为1时,s的值为7*6,满足条件not z,因此s的值为7*6/2。当i为2时,s的值为7*6/2*5,满足条件not z,因此s的值为7*6/2*5/3,结果为35。
3.有如下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个位上的数字,符合立方和等于他本身,因此属于水仙花数。
4.列表s包含n个元素,现要对列表s进行消除操作:选择两个相邻且相同的元素进行删除。反复执行该操作,直到无法继续消除。例如:列表s为["a","b","b","a","c","a"],完成所有消除操作后,结果为["c","a"]。实现上述功能的Python程序段如下:
上述程序段中方框处可选代码为:
①left+=1 ②left-=1 ③right+=1 ④right-=1
则(1)(2)(3)处代码依次为(  )
A.①②③ B.②①④
C.②①③ D.②③①
C
解析 语句s[left]=s[right]将快指针对应的值赋值给慢指针对应位置,left指向已处理部分的后1位,故输出时,切片应不包含left right为快指针,left为慢指针,终止条件为快指针遍历完全部元素,因此(3)处为right=right+1。(1)满足条件s[left]==s[left-1]表示遇到相同元素,应执行删除操作,left的值将减少1。否则left的值将增加1,因此(2)空执行left+=1。
5.有如下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
解析 自定义函数功能是在索引位置i后面找到第1个比该a[i]小的数,返回他们的之间的距离,若后面没有比较他小的数,返回0。数组b的值依次为[1,3,2,1,0,1]。
D
6.有如下Python程序段:
import random
s='abcdefghijklmnopq'
for i in range(4):
  k=random.randint(0,4)+random.randint(0,1)*10
  print(s[k],end='')
执行该程序后,输出的结果不可能是(  )
A.ddaa B.eaeo
C.dfam D.nemc
C
解析 本题考查随机数模块的应用。表达式random.randint(0,4)产生一个0-4(包含)之间的随机整数,random.randint(0,1)产生随机数0或者1,random.randint(0,1)*10产生随机数0或者10,因此k的值为[0,1,2,3,4,10,11,12,13,14]中的任意一个,for循环循环四次,每次用k作为位置去访问字符串s, 'abcdefghijklmnopq'划线字母为可能访问到并且输出的字符。A选项random.randint(0,4)产生的值依次为3,3,0,0,random.randint(0,1)产生的值均为0。B选项random.randint(0,4)产生的值依次为4,0,4,4,random.randint(0,1)产生的值均为0,0,0,1。C选项中的f的索引为5,不可能访问该字符。D选项random.randint(0,4)产生的值依次为3,4,2,2,random.randint(0,1)产生的值均为1,0,1,0。
7.假如正整数x在n进位下的平方可以分割为两个正整数,且这两个数相加后恰等于x,那么x就是n进位下的卡布列克数。例如92=81,而9=8+1,所以9是十进位下的卡布列克数,9也是十进位下最小的有意义的卡布列克数。编写如下自定义函数判定x是否为十进位下的卡布列克数。
def Kaprekar_number(x):
 w=10;m=x*x
 while m>w and m % w!=0: #①
   if m∥w+m%w==x: #②
     return True
   w *= 10 # ③
 else:#与while语句对齐
   return False
关于上述程序代码,以下说法正确的是(  )
A.执行语句 print(Kaprekar_number(45)),输出结果为False
B.若将语句①while后面的m>w修改为m>=w,其他部分保持不变,不影响函数功能
C.语句块②可用语句return m∥w+m%w==x代替
D.交换②所在if语句块和语句③的顺序,不影响函数功能
B
解析 程序的功能是计算x的平方m,计算m∥w+m%w之和是否与x相等,若相等则返回True。A选项45的平方为2025,当w为100时,20+25=45,因此返回为True。B选项当m=w时,条件m%w!=0肯定不成立,因此修改后程序功能不变。C选项若w为10,m∥w与m% w之和与x不相等,直接结束返回False,而不会去检测100或更大的w。D选项交换后,没有检测w为10的情况。
8.在一次抽奖活动中,需要在8人中随机抽取3个幸运奖,对应的Python程序如下:
import random
xm=["A","B","C","D","E","F","G","H"]
#用字母代表人名
hj=[""]*3;
bz=[False]*8
i=0
while i<=2:
  n=random.randint(0,7)
  __________
print(hj)
程序划线处代码合适的是(  )
A
解析 本题考查随机函数的应用。列表bz中有8个元素,其初值均为False,表示该索引号对应的xm元素没有抽到奖。变量i表示第几个幸运观众,变量n表示幸运观众的索引号。
A.if bz[n]==False:
   hj[i]=xm[n]
   bz[n]=True
   i+=1
B.if bz[n]==True:
   hj[i]=xm[n]
   bz[n]=False
   i+=1
C.if bz[i]==False:
   hj[n]=xm[i]
   bz[i]=True
   i+=1
D.if bz[i]==True:
   hj[n]=xm[i]
   bz[i]=True
   i+=1
9.有如下Python程序段:
import random
a=[-1]*5
for i in range(len(a)):
 a[i]=random.randint(1,10) #产生一个[1,10]之间的整数
for i in range(2,4):
 key=a[i]
 j=i-1
 while j>=1 and key   a[j+1]=a[j]
   j-=1
 a[j+1]=key
执行该程序段后,变量a可能的值为(  )
A.[1,0,3,6,7] B.[3,2,6,7,1]
C.[1,3,2,5,7] D.[3,5,6,2,7]
B
解析 本题考查随机数应用和顺序查找。在循环体中,i的值为2或3,语句key=a[i]的功能是把a[i]的值保存到key中,同时可以腾出位置i,在他前面的数a[j],如果满足keydef f(a,left,right):
 tmp=a[0]
 while left  while lefttmp:
    right-=1
  a[left]=a[right]
  while left    left+=1
  a[right]=a[left]
 a[left]=tmp #②
 return a
a=[5,3,8,1,2,9,4,7,6]
print(f(a,0,len(a)-1))
A
A.程序运行过程中,①处语句共执行了5次
B.程序运行后,其输出结果为[4,3,2,1,5,9,8,7,6]
C.在函数f的调用过程中,变量left最终的值为4
D.若将②处语句代码改为“a[right]=tmp”,则对本题结果无影响
解析 函数实现的功能是将大于a[0]的数交换到右边,小于a[0]的数交换到左边,因此程序运行后的结果为[4,3,2,1,5,9,8,7,6],left和right的值均为4,将②处语句代码改为“a[right]=tmp”,则对本题结果无影响。①处语句共执行了4次。
课时作业
5
1.有Python程序如下:
def f(s):
 n=len(s);ans=""
 i=0;j=n-1
 while i=n∥2:
  if s[i]>=s[j]:
    ans+=s[i]
     j-=1
  else:
    ans+=s[j]
    i+=1
 return ans
s=input("输入字符串:")
print(f(s))
D
解析 变量i从前往后遍历字符串s的一半长,变量j从后往前遍历字符串s的一半长。若条件s[i]>=s[j]成立,ans连接s[i],j向前移动,否则ans连接s[j],i向后移动。A选项p依次大于n,o,h。B选项p依次大于c,i,l。C选项p依次大于等于e,l,p。D选项p依次大于e,但p,h,r均小于s,因此运行的结果为psss。
2.某加密算法程序段如下所示:
def jiami(x):
 if "A"<=x<="Z":
   y=chr(ord(x)+32)
 elif "0"<=x<="9":
   y=str((int(x)+1)%10)
 else:
   y=x
 return y
mingwen=input("请输入明文")
miwen=""
for x in mingwen:
 miwen=miwen+jiami(x)
print("密文为:",miwen)
输入“Abc@789”并运行程序,输出结果是(  )
A.abc8910 B.abc@890
C.ABC678 D.aBC@789
B
解析 函数的功能是对字符串每个字符进行加密,如果是大写,转换成对应的小写字母,如果是数字,循环后移一位。其他不变,依次连接在后面。
3.有如下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,6,字符串s的值依次为elcome、elome、elom。
4.有如下Python程序:
def count(lst):
 n=len(lst)
 rank=[1 for i in range(n)]
 for i in range(n-1):
   for j in range(i+1,n):
    if lst[i]>=lst[j]:
      rank[j]+=1
    else:
      rank[i]+=1
 return rank
lst=[89, 86, 99, 89, 97]
print(count(lst))
运行该程序后的输出结果是(  )
A.[3, 5, 1, 4, 2] B.[4, 5, 1, 3, 2]
C.[2, 4,0, 3, 1] B.[3, 4, 0, 2, 1]
A
解析 程序功能是统计名次,在比较的值相同的情况,前面的名次小。
5.子序列是指数组中连续的若干个元素(至少 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,再次求下一段的和及最大值。
6.有下列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时应执行第二个分支的语句。
7.有如下程序段:
import random #导入随机数模块
n=random.randint(0,100) #产生0-100之间的随机整数,包含0和100
m=n;k=0;s=''
while n!=1:
 for i in range(2,n+1):
   if n%i==0:
     k=i
     n=n∥k
     s=s+str(k)+'*'
     break
print(m,'=',s[0:len(s)-1])
上述程序执行后,输出结果不可能的是(  )
A.67=67 B.34=2*17
C.54=2*3*3*3 D.20=2*3*4
D
解析 随机产生一个正整数n,将该数进行质因子分解。D选项4是2的因子,因此不可能。
8.有如下Python程序段:
import random
n=random.randint(40,90)
a=[]
for i in range(2,n+1):
 while n%i==0:
   a.append(i)#列表a末尾追加一个元素 i
   n=n∥i
print(a)
执行程序段后,输出结果可能的是(  )
A.[2,2,2,9] B.[2,3,3,5]
C.[2,3,3,7] D.[51]
B
解析 程序的功能产生一个40-90之间的随机数,并将他分解成各个质因子的乘积。A选项9可以分解成3*3。B选项产生n的值为90。C选项产生n的值为126,超出范围。D选项51可以分解为3*17。
9.判断[left,right]内每个整数是否被a中一个或多个区间所覆盖,若是返回True,否则返回False。例如:a=[[1,10],[8,20],[11,30]],left=5,right=21,则5~10内每个数可以被[1,10]区间覆盖,11~20内每个数可以被[8,20]区间覆盖,21可以被[11,30]区间覆盖,因此返回True。若将right改为31,则返回False。实现该功能的自定义函数如下:
def judge(a,left,right):
 #对列表a按a[i][0]的值升序排序,代码略
 i=0
 while i  if a[i][0]<=left<=a[i][1]:
    (1)________
  else:
    (2)________
  if left>right:
    (3)________
  (4)________
上述程序段中划线处可选代码为:
①i+=1 ②left+=1 ③return True ④return False
则(1)(2)(3)(4)处代码依次为(  )
A.②①③④ B.①②③④
C.②①④③ D.①②④③
A
解析 条件a[i][0]<=left<=a[i][1]成立,表示当前索引为i的区间包含整数left,因此可以判断left的下一个整数,(1)中应填写的内容是left+=1。若left>right,说明索引0至i的区间已经包含要求的数据,(3)中应填写的内容为return True。若条件a[i][0]<=left<=a[i][1]不成立,则在下一个(第i+1个)区间中判断是否包含要求的数据。遍历完整个列表a,条件left>right不成立,则返回False。
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","1bh":"12sa","1js":"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) ⑤trytime-=1
解析 本题考查自定义函数编写和调用。①在字典u中判断用户名a是否存在,密码b是否正确,首先判断a是否在字典b中,若存在用户u,则该用户的用户名是键,密码是值u[a],因此②处答案为b!=u[a]。当两者均正确时,需返回True。④处调用login函数,把用户名user和密码psd分别传至自定义函数中。⑤处将改变trytime的值,尝试的次数将减少一次。

展开更多......

收起↑

资源列表