资源简介 课时6 自定义函数和模块【学业要求】知识点 学业水平等级1.掌握自定义函数的构造和调用方法。 32.掌握模块的导入方法和常用函数的应用。 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 Trues1=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 ansda=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 randintres=""i,j=0,len(s)-1while i=i: if randint(0,1)==0: #randint(0,1)随机生成0或1 res+=s[i] i+=1 else: res+=s[j] j-=1A."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,0B 产生"ae",i和j分别指向b和d,因此不可能连接到cC 产生的随机数为0,1,1,0,0或0,1,1,0,1D 产生的随机数均为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.shapefor 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.35C.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.134C.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 0a=[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.1C.2 D.3答案 D解析 自定义函数功能是在索引位置i后面找到第1个比该a[i]小的数,返回他们的之间的距离,若后面没有比较他小的数,返回0。数组b的值依次为[1,3,2,1,0,1]。6.有如下Python程序段:import randoms='abcdefghijklmnopq'for i in range(4): k=random.randint(0,4)+random.randint(0,1)*10 print(s[k],end='')执行该程序后,输出的结果不可能是( )A.ddaa B.eaeoC.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)),输出结果为FalseB.若将语句①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 randomxm=["A","B","C","D","E","F","G","H"]#用字母代表人名hj=[""]*3;bz=[False]*8i=0while i<=2: n=random.randint(0,7) print(hj)程序划线处代码合适的是( )A.if bz[n]==False: hj[i]=xm[n] bz[n]=True i+=1B.if bz[n]==True: hj[i]=xm[n] bz[n]=False i+=1C.if bz[i]==False: hj[n]=xm[i] bz[i]=True i+=1D.if bz[i]==True: hj[n]=xm[i] bz[i]=True i+=1答案 A解析 本题考查随机函数的应用。列表bz中有8个元素,其初值均为False,表示该索引号对应的xm元素没有抽到奖。变量i表示第几个幸运观众,变量n表示幸运观众的索引号。9.有如下Python程序段:import randoma=[-1]*5for 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 aa=[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最终的值为4D.若将②处语句代码改为“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 anss=input("输入字符串:")print(f(s))执行该程序段,分别输入下列选项中的字符串,输出结果不为“ppp”的是( )A.python B.publicC.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 ymingwen=input("请输入明文")miwen=""for x in mingwen: miwen=miwen+jiami(x)print("密文为:",miwen)输入“Abc@789”并运行程序,输出结果是( )A.abc8910 B.abc@890C.ABC678 D.aBC@789答案 B解析 函数的功能是对字符串每个字符进行加密,如果是大写,转换成对应的小写字母,如果是数字,循环后移一位。其他不变,依次连接在后面。3.有如下Python程序段:def delstr(s,m): return s[0:m]+s[m+1:]s="Welcome"i=0while i<=len(s): s=delstr(s,i) i+=2print(s)执行该程序段后,输出的结果为( )A.ecm B.elomeC.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 ranklst=[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 tota=[-2,1,-3,4,-1,2,1,-5,4]print (maxsub(a))答案 C解析 本题考查算法的综合应用能力。寻找和最大的子序列问题,基本算法是边求和边求最大值。tmp用来求连续子序列的和,当和小于0时,tmp初始化为0,再次求下一段的和及最大值。6.有下列Python程序段:import randoms=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.oworldhellC.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和100m=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)+'*' breakprint(m,'=',s[0:len(s)-1])上述程序执行后,输出结果不可能的是( )A.67=67 B.34=2*17C.54=2*3*3*3 D.20=2*3*4答案 D解析 随机产生一个正整数n,将该数进行质因子分解。D选项4是2的因子,因此不可能。8.有如下Python程序段:import randomn=random.randint(40,90)a=[]for i in range(2,n+1): while n%i==0: a.append(i)#列表a末尾追加一个元素 i n=n∥iprint(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 Falseu={"cgm":"sd@1","cgl":"&dd5","cjm":"##22sd","1bh":"12sa","1js":"sd22!"} #系统中存在的用户名trytime=3while 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.掌握自定义函数的构造和调用方法。 32.掌握模块的导入方法和常用函数的应用。 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。知识梳理21.在算法的程序实现过程中,也经常根据具体问题的特点将其分解成若干个______________或者借助所用程序设计语言的特性来完成问题的解决。 2.Python主要运用________、________等方式实现模块化程序设计,为算法的程序实现带来极大的便利。 3.定义函数的语法如下:def 函数名(参数集合): <函数体> [return ________] 子问题函数模块函数值4.函数名的命名规则和变量名一样。完成函数的构造后,在程序中就可以根据需要________该函数。 5.Python内置模块:数学运算________模块、生成随机数________模块、图像Image模块。 6.在Python中,把一组函数放到一个.py文件里,这个文件就称为____________。 7.使用________语句或from-import语句导入Python内置的模块和来自第三方的模块,将能使用其中的函数。 调用MathRandom一个模块import课堂突破3【典例1】 编写一个自定义函数实现判断字符串s是否是回文字符串。算法思想:采用双指针分别指向首尾字符,若两者相同,依次向中间靠拢。def hw(s): i,j=0,len(s)-1 while ①________: if ②________: return False i+=1 j-=1 return Trues1=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 ansda=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 randintres=""i,j=0,len(s)-1while i=i: if randint(0,1)==0: #randint(0,1)随机生成0或1 res+=s[i] i+=1 else: res+=s[j] j-=1A."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,0B 产生"ae",i和j分别指向b和d,因此不可能连接到cC 产生的随机数为0,1,1,0,0或0,1,1,0,1D 产生的随机数均为1或1,1,1,1,0【变式2】 小明用Python语言中对大小为100*100像素的图像“上.jpg”(如图所示)进行简单处理,部分代码如下:img=Image.open("上.jpg")im=np.array(img.convert("L")) #转换成数字矩阵rows,cols=im.shapefor 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语句,当执行某条返回语句后,结束自定义函数运行,返回主程序。自定义函数调用的过程分为把实参赋值给形参、运算获得结果、返回运算结果三个步骤。当堂检测41.数组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.210B解析 程序的功能求在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.142C解析 本题考查自定义函数的应用。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 0a=[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.1C.2 D.3解析 自定义函数功能是在索引位置i后面找到第1个比该a[i]小的数,返回他们的之间的距离,若后面没有比较他小的数,返回0。数组b的值依次为[1,3,2,1,0,1]。D6.有如下Python程序段:import randoms='abcdefghijklmnopq'for i in range(4): k=random.randint(0,4)+random.randint(0,1)*10 print(s[k],end='')执行该程序后,输出的结果不可能是( )A.ddaa B.eaeoC.dfam D.nemcC解析 本题考查随机数模块的应用。表达式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)),输出结果为FalseB.若将语句①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 randomxm=["A","B","C","D","E","F","G","H"]#用字母代表人名hj=[""]*3;bz=[False]*8i=0while 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+=1B.if bz[n]==True: hj[i]=xm[n] bz[n]=False i+=1C.if bz[i]==False: hj[n]=xm[i] bz[i]=True i+=1D.if bz[i]==True: hj[n]=xm[i] bz[i]=True i+=19.有如下Python程序段:import randoma=[-1]*5for 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 aa=[5,3,8,1,2,9,4,7,6]print(f(a,0,len(a)-1))AA.程序运行过程中,①处语句共执行了5次B.程序运行后,其输出结果为[4,3,2,1,5,9,8,7,6]C.在函数f的调用过程中,变量left最终的值为4D.若将②处语句代码改为“a[right]=tmp”,则对本题结果无影响解析 函数实现的功能是将大于a[0]的数交换到右边,小于a[0]的数交换到左边,因此程序运行后的结果为[4,3,2,1,5,9,8,7,6],left和right的值均为4,将②处语句代码改为“a[right]=tmp”,则对本题结果无影响。①处语句共执行了4次。课时作业51.有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 anss=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 ymingwen=input("请输入明文")miwen=""for x in mingwen: miwen=miwen+jiami(x)print("密文为:",miwen)输入“Abc@789”并运行程序,输出结果是( )A.abc8910 B.abc@890C.ABC678 D.aBC@789B解析 函数的功能是对字符串每个字符进行加密,如果是大写,转换成对应的小写字母,如果是数字,循环后移一位。其他不变,依次连接在后面。3.有如下Python程序段:def delstr(s,m): return s[0:m]+s[m+1:]s="Welcome"i=0while i<=len(s): s=delstr(s,i) i+=2print(s)执行该程序段后,输出的结果为( )A.ecm B.elomeC.elco D.elomD解析 自定义函数的功能:在字符串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 ranklst=[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 tota=[-2,1,-3,4,-1,2,1,-5,4]print (maxsub(a))C解析 本题考查算法的综合应用能力。寻找和最大的子序列问题,基本算法是边求和边求最大值。tmp用来求连续子序列的和,当和小于0时,tmp初始化为0,再次求下一段的和及最大值。6.有下列Python程序段:import randoms=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.oworldhellC.helloworld D.worldhelloD解析 本题综合考查了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和100m=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)+'*' breakprint(m,'=',s[0:len(s)-1])上述程序执行后,输出结果不可能的是( )A.67=67 B.34=2*17C.54=2*3*3*3 D.20=2*3*4D解析 随机产生一个正整数n,将该数进行质因子分解。D选项4是2的因子,因此不可能。8.有如下Python程序段:import randomn=random.randint(40,90)a=[]for i in range(2,n+1): while n%i==0: a.append(i)#列表a末尾追加一个元素 i n=n∥iprint(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 Falseu={"cgm":"sd@1","cgl":"&dd5","cjm":"##22sd","1bh":"12sa","1js":"sd22!"} #系统中存在的用户名trytime=3while 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的值,尝试的次数将减少一次。 展开更多...... 收起↑ 资源列表 课时6 自定义函数和模块.docx 课时6 自定义函数和模块.pptx