第三章 课时7 函数与模块 教案 浙教版(2019)必修1(课件 学案 教案三份打包)

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

第三章 课时7 函数与模块 教案 浙教版(2019)必修1(课件 学案 教案三份打包)

资源简介

课时7 函数与模块
课时目标
1.掌握自定义函数的构造和调用方法。2.掌握模块的导入方法和常用函数的应用。
一、模块
1.Python内置模块:数学运算math模块、生成随机数random模块、图像Image模块。
2.Python其他模块:用于实现部分操作系统功能(可用于文件、目录等操作)的os模块,与时间处理有关的time模块,可实现科学计算、数据可视化的numpy和matplotlib,用于多媒体开发和游戏软件开发的pygame模块,支持图形处理的tkinter等。
3.在Python中,把一组函数放到一个.py文件里,这个文件就称为一个模块。
4.使用import语句或from-import语句导入Python内置的模块和来自第三方的模块,将能使用其中的函数,如sqrt和random函数。
二、函数的构造和应用
def函数名(参数集合):
  <函数体>
  [return函数值]
函数名的命名规则和变量名一样。完成函数的构造后,在程序中就可以根据需要,像内建函数一样调用该函数。
三、模块的导入及应用
在Python Shell中导入math模块,并调用该模块中的sqrt函数,可采用以下两种方法:
方法一 方法二
>>>import math>>>math.sqrt(9)3.0 >>>from math import sqrt>>>sqrt(9)3.0
1.math模块中的常用常数与函数
名称 含义
math.e 自然常数e
math.pi 圆周率π
math.ceil(x) 对x向上取整,比如x=1.2,返回2
math.floor(x) 对x向下取整,比如x=1.2,返回1
math.pow(x,y) 指数运算,得到x的y次方
math.log(x) 对数,默认基底为e
math.sin(x) 正弦函数
math.cos(x) 余弦函数
math.tan(x) 正切函数
math.degrees(x) 角度转换成弧度
math.radians(x) 弧度转换成角度
2.random模块中的常用函数
名称 含义
random.random() 随机生成一个[0,1)范围内的实数
random.uniform(a,b) 随机生成一个[a,b]范围内的实数
random.randint(a,b) 随机生成一个[a,b]范围内的整数
random.choice(seq) 从序列的元素中随机挑选一个元素,比如:random.choice(range(10)),从0到9中随机挑选一个整数
random.sample(seq,k) 从序列中随机挑选k个元素
random.shuffle(seq) 将序列的所有元素随机排序
                
例1 编写一个自定义函数实现判断字符串s是否是回文字符串,请在划线处填入合适的代码。
算法思想:采用双指针分别指向首尾字符,若两者相同,依次向中间靠拢
def hw(s):
  i=0
  j=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 下列Python函数实现了将大写字母循环后移t个位置功能,如A向后移3个位置后变为D,X后移3位后,变成A。已知'A'的ASCII码值为65。
def jm(s,t):
  n=ord(s)-65+t
  if n>=25:
     
  return chr(n+65)
(1)请在程序划线处填入合适的代码。
(2)若执行语句print(jm('Y',4)),则输出的内容是      。
答案 (1)n=n-25 (2)C
解析 根据题目的功能,n是加密字母在字母中位置,值的范围是[0,25],如果向后移动后超出25,则表示循环向前移动,需要减去25,最后返回ASCII码值对应的字母。将Y后移4位的值为C。
例2 生成一个随机密码,要求大写字母、小写字母和数字必须至少包含一个,且密码的长度不能少于6位。编写的Python代码如下:
import random
def pas():
  a="abcdefghijklmnopqrstuvwxyz"
  b="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  c="0123456789"
  st=a+b+c
  d=[]
  d.append(①    ) #从字符串a中随机取一个字符
  d.append(②    ) #从字符串b中随机取一个字符
  i=2
  f=True
 while i<=5③    f:
    d.append(random.choice(st))
    if d[i]>="0" and d[i]<="9":
       f=False
     i+=1
  random.shuffle(d)  #将序列d中所有元素随机排序
  print("".join(d))
pas()
(1)请在程序划线处填入合适的代码。
(2)执行上述算法,    (填:可能/不可能)产生密码“Eaf8dLdeS”。
答案 (1)①a[random.randint(0,25)]或random.choice(a) ②b[random.randint(0,25)]或random.choice(b) ③or (2)可能
解析 产生一个[0,25]之间的整数,在字符串中进行切片,或者在字符串中选择一个字母。当新增加的字母中包含数字或者密码位数大于或等于5个,密码中只可能包含一个数字,由于该密码后期是随机排序的,数字8有可能是最后一次产生的。
变式训练2 哥德巴赫猜想:任意一个大于等于4的偶数,都可以用两个素数之和表示。如:4=2+2,6=3+3,8=3+5,10=5+5,12=5+7,98=17+79。
编写一个验证哥德巴赫猜想的Python程序:程序运行时,输入一个大于等于4的偶数,如果哥德巴赫猜想验证成功,则第一行输出信息“Yes”,第二行输出用两个素数表示该偶数的等式,否则输出“No”。程序运行效果如图所示:
实现上述功能的程序如下,请在程序划线处填入合适的代码。
import math
def pp(x):
  pp=True
  j=2
  while j<=int(math.sqrt(x)) and pp==True:
    if x % j==0:
      pp=False
    else:
     ①     
  return pp
n=int(input('please input n:'))
p=1
pd=False
if n % 2==0:
  while not pd and p    p=p+1
    ②     
    if pp(p) and pp(q):
      print('Yes')
      ③     
      print(str(n),"=",str(p),'+',str(q))
  if pd==False:
    print('No')
 else:
  print('sorry,你输入的数不是偶数!')
答案 ①j=j+1 ②q=n-p ③pd=True
解析 函数pp(x)的功能是判断整数x是否为素数,若是素数,则返回True,否则返回False。判断素数的方法为:让x去除以j(2至根号x取整),若能被某个数j整除,则函数值为False,否则j+1后再试,因此①处语句修改为j=j+1;主程序的功能是寻找组成整数n的二个素数,方法是枚举p,因此q=n-p,然后再判断p和q是否均为素数,若是则完成定理证明,为了结束while循环,要更改pd的值为True,因此③处代码为pd=True,否则将继续枚举p的值。
例3 有如下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
解析 本题考查随机数模块以及for循环。其中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'划线字母为可能访问到并且输出的字符,因此C选项中的f错误,访问不到这个字符。
例4 小明用Python语言中对大小为100*100像素的图像“上.jpg”(如图所示)进行简单处理,得到下列四幅图像,请在划线处填入合适的代码。
n1 n2 n3 n4
部分代码如下:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img=np.array(Image.open('上.jpg').convert('L')) #将图像转换为灰色图像后转换为二维矩阵
width,height = img.shape[0],img.shape[1]
n1 = np.zeros(shape=(width,height)) # 用于存储结果图像,大小和img相同
n2 = np.zeros(shape=(width,height))
n3 = np.zeros(shape=(width,height))
n4 = np.zeros(shape=(width,height))
for x in range(0,width):
  for y in range(0,height):
    ①     
    ②     
    n3[x,y]=img[x,y]
    n4[x,y]=img[x,y]
    if y%10==0:
      ③     
    if x%10==0:
      ④     
#显示图像,代码略
答案 ①n2[x,height-y-1]=img[x,y]
②n1[width-x-1,y]=img[x,y]
③n3[x,y]=0
④n4[x,y]=0
解析 本题考查Image模块。n1图像显然是对原图的上下翻转,行x的对称行为height-y-1,而行保持不变。n1图像显然是对原图的左右翻转,列保持不变,列y的对称列为width-x-1,而。③n3图像是每隔一定数量的列数时,出现一个黑条,因此当条件y%10==0成立时,显示黑色。③n4图像是每隔一定数量的行数时,出现一个黑条,因此当条件x%10==0成立时,显示黑色。
变式训练3 现有一幅文件名为“车牌.jpg”的彩色图像,车牌底色为蓝色,如图a所示,通过Python程序对该图像进行二值化,即将车牌蓝色部分变为白色,其他全部变为黑色,如图b所示,以凸显出车牌的轮廓。程序代码如下,请在划线处填入合适的代码。
     图a          图b
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt #获取车牌蓝色的RGB分量的边界,红色rl,r2,绿色gl,g2,蓝色
b1,b2。代码略
img =np.array(Image.open("①    ")) #打开图片并将其像素矩阵存入img
rows, cols = img.shape[0],img.shape[1]
imgnew = np.zeros(shape=(rows,cols))
# imgnew用于存储结果图像,大小和 img相同
for i in range(rows):
  for j in range(cols):
    r,g,b=img[i,j] #获取img当前位置的r,g,b分量
    if r1<=r<=r2 and g1<=g<=g2 and b1<=b<=b2:
      imgnew[i,j]=1 #将新矩阵该位置设为白色
    else:
      ②   
plt.figure('车牌')
plt.imshow(imgnew, cmap='gray')
plt.axis('off')
plt.show()
答案 ①车牌.jpg ②imgnew[i,j]= 0
解析 本题考查Image模块。①打开车牌.jpg图片并将其像素矩阵存入img。②将该点的值设置为黑色。
                
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.有如下Pyhton程序段:
def gcd(a,b):
  c = a%b
  while c > 0:
    a,b = b,c
    c=a%b
  return b
a=int(input("请输入:"))
b=int(input("请输入:"))
gcd = gcd(a,b)
scm = a * b ∥ gcd
print( gcd,scm)
运行该程序,输入a,b的值分别为16,12,则输出gcd,scm的值分别为 (  )
A.4 48 B.48 4 C.2 12 D.12 2
答案 A
3.有如下Pyhon程序段:
def sel(a,b,c):
  if a    a+=b;b=a-b;a=a-b
  if a    t=a;a=c;c=t
  print(a,b,c)
sel(1,2,3)
执行该程序段后,输出的结果是 (  )
A.1,2,3 B.3,2,1 C.3,1,2 D.1,3,2
答案 C
4.有Python的程序代码如下:
def change_c(s):
  if "a"<=s<="z":
    s = chr(ord(s)-32)
  return s
ss = input("请输入一串英文字母:")
n = len(ss)
ans = ""
for i in range(n):
  c = change_c(ss[i])
  ans = c + ans #①
print(ans)
现执行该程序,输入"abcDEF",下列说法正确的是 (  )
A.函数change_c()被调用了3次
B.函数change_c()的功能是将小写字母变成大写字母
C.输出的内容为"ABCDEF"
D.将①所在语句改为“ans+=c”程序功能不变
答案 B
5.有如下Python程序段:
import turtle as tt
t=tt.Pen() #导入海龟,定义画笔t
import random
tt.bgcolor("white")
colors=["red","green","blue","yellow"]
for x in range(100):
  t.pencolor(colors[x%random.randint(1,4)]) #设置画笔的颜色
  t.circle(x) #画半径是x像素的圆
  t.left(91) #画笔方向逆时针旋转91度
关于该程序段,下列说法正确的是 (  )
A.程序运行后,绘制了100个同心圆
B.程序运行后,绘制的所有圆的颜色不可能都为红色
C.程序运行后,最后绘制的一个圆的颜色可能为黄色
D.程序运行后,绘制的各圆没有交点
答案 C
解析 本题考查随机数和海龟模块应用。一共画了100个圆,每画完一个圆,画笔回到原点,且方向逆时针旋转91度,因此所有的圆起点是一样的,因此有交点,但不是同心圆。若x%random.randint(1,4)的值均为0,则可能全部是红色的。
6.某Python程序段如下:
def isprime(x):
  for i in range(2,x):
    if x % i ==0:
      return False
  return True
prime =[]
for i in range(2,21):
  if isprime(i):
    prime.append(i) #将 i 添加到列表
print(len(prime))
运行该程序段,输出结果是     。
答案 8
解析 本题考查自定义函数的相关知识,功能是判断是否是质数。[2,20]之间的素数有8个。
7.技术学科一共包含2门学科——信息技术和通用技术,这就需要我们关注学科的平衡,而衡量某位学生学科平衡的重要指标就是学科吻合度,采用信息技术与通用技术的得分差来判断[分差每3分为一级:分差0到3分(不含3分),表示“0级偏差”;分差3到6分(不含6分),表示“1级偏差”,分差6到9分(不含9分),表示“2级偏差”……分差最高为50分,最后一级分差48到50(含50分),表示“16级偏差”],计算每位学生的吻合度偏差值。根据题意,请回答下列问题:
(1)(多选)为了后续程序处理,需要把数据读入到程序,每个学生一条记录,用Python存储学生测试得分数据,下列可行的是(以前两条记录为例)    (填字母)。
A.students=[[0901,50,32],[0902,50,45],……]
B.students={'0901':['50','32'],'0902':['50','45'],……}
C.students={0901:['50','32'],0902:['50','45'],……}
D.students=[['0901','50','32'],['0902','50','45'],……]
(2)编写函数f(xx,ty)实现传入信息得分和通用得分,返回吻合度级别    (返回示例:'1级偏差')。
(3)完成程序填空:
students={'0901':[50,82],'0902':[50,95],……}#(以前两条记录为例)
for i in students.keys():
  xx=①     
  ty=②     
  print(i,':',f(xx,ty))
答案 (1)BD
(2)def f(xx,ty):
   return str(abs(xx-ty)∥3)+'级偏差'及其他等价答案
(3)①students[i][0] ②students[i][1]-students[i][0]或students[i][1]-xx
解析 本题考查数据类型、自定义函数等。(1)0901只能作为文本字符串,若作为数值类型,其值会自动变为901。(2)分差每3分为一级,表达式abs(xx-ty)作为分差,返回值注意数据类型。(3)students是一个字典类型的数据,students.keys表示字典的键,其对应字典的值是一个列表,每个列表有两个元素,一个信息得分,一个技术得分,因此students[i]表示键i对应的得分列表,students[i][0]和students[i][1]分别表示信息得分和技术得分。
一、基础巩固
1.有如下Python程序段:
def days(y,m,d):
  md=[31,28,31,30,31,30,31,31,30,31,30,31]
  ans=y*365+y∥4-y∥100+y∥400
  for i in range(m-1):
    ans+=md[i]
  if(y%4==0 and y%100!=0 or y%400==0)and m>=3:
    ans+=1
  ans+=d
  return ans
print(days(2023,2,9)-days(2022,11,29))
运行该程序段后,输出结果是 (  )
A.71 B.72 C.73 D.74
答案 B
2.如果A的所有正因子和等于B,B的所有正因子和等于A,因子包括1但不包括本身,且A不等于B,则称A,B为亲密数对。下列程序段可以求出3000以内的亲密数。
def div(n):
  lis=[]
  for i in range(1,n∥2+1):
    if n%i==0:
        (1)  
  return lis
for i in range(3000):
  sum1=sum(div(i))
  sum2= (2) 
  if sum2==i and   (3)   :
    print(i,sum1)
上述程序段中,划线处可选代码为:
①lis.append(i) ②sum(div(sum1-i)) ③sum(div(sum1)) ④iA.①③④ B.①③⑤ C. ①②④ D.①②⑤
答案 B
3.用Python程序随机生成100个[0,20]之间的随机数,统计0~9及9以上每个数字出现的次数并输出结果:
import random
list=[0]*100
count=[0]*11
for i in range(0,100):
  num=random.randint(0,20)  #产生[0,20]之间的随机整数
  list[i]=num
  if   :
    num=10
  count[num]+=1
print("0~9及9以上依次出现的次数为:",count)
程序某次运行的结果如下:
0~9及9以上依次出现的次数为:[3,5,4,6,5,5,2,5,9,4,52]
则划线处的代码为 (  )
A.num>i B.list[i]>num
C.num>9 D.count[i]>9
答案 C
解析 本题考查随机数和桶的应用。语句list[i]=num将索引为i的列表元素修改为num。语句count[num]+=1的功能是统计num的数量。从输出语句来看,count[10]表示超过9以上的数字,因此当num>9时,全部统计在count[10]中。
4.使用 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
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
6.有如下Python程序段:
import random
a=[0]*6
i=0
while i<6:
  r=random.randint(2, 11 )
  if r not in a :
    a[i]=r
    i+=1
print(a)
运行程序后,输出的结果可能是 (  )
A.[3,0,0,0,0,0] B.[2,3,4,5,6,7]
C.[0,10,0,3,0,5] D.[9,11,4,6,0,0]
答案 B
7.有如下Python程序段:
from random import *
d=[8,6,9,3,1,2]
a=randint(0,2) #随机产生 0-2 的整数
b=a+3
for i in range(a,b):
  if d[i]>d[i+1]:
    d[i],d[i+1]=d[i+1],d[i]
执行该程序段后,列表d中的元素值不可能是 (  )
A.6,8,3,9,1,2 B.6,8,3,1,9,2
C.8,6,3,1,9,2 D.8,6,3,1,2,9
答案 B
8.编写Python程序,模拟“石头剪刀布”的游戏,实现电脑随机输出“石头”“剪刀”“布”。函数功能表如下:
名称 含义
random.random() 随机生成一个[0,1)范围内的实数
random.randint(a,b) 随机生成一个[a,b]范围内的整数
random.sample(seq,k) 从序列中随机挑选k个元素
random.shuffle(seq) 将序列的所有元素随机排序
下列代码段中能够实现该功能的是 (  )
① ②
import randoma={0:"石头",1:"剪刀",2:"布"}b=int(random.random()*2)print(a[b]) import randoma={0:"石头",1:"剪刀",2:"布"}b=random.randint(0,2) print(a[b])
③ ④
import randoma=["石头","剪刀","布"]b=random.sample(a,1)print(b[1]) import randoma=["石头","剪刀","布"]random.shuffle(a)print(a[1])
A.①③ B.①④ C.②③ D.②④
答案 D
解析 本题考查随机数、字典和列表的应用。代码段①int(random.random()*2)产生的范围是0或1。代码段③在列表a中随机挑一个,因此b的值应为"石头"、"剪刀"或"布",而b[1]是这些字符中第1个字符。
9.某Python程序段如下:
import random
fibo=[1]*11
for i in range(2,11):
  fibo[i]=fibo[i-1]+fibo[i-2]
n=random.randint(1,10)
print(fibo[n])
运行该程序段,输出结果不可能是 (  )
A.1 B.21 C.35 D.89
答案 C
解析 本题考查列表及斐波拉契数列的相关知识。斐波拉契数列:1,1,2,3,5,8,13,21,34,55,89,144…n为该数列第2至第11项中随机一项,不可能为35,选C。
10.某Python程序如下:
from random import random
a=[0]*7
flag=[False]*10
i=1
while i<=6:
  a[i]=int(random()*5)*2+1
  if flag[a[i]]==False or a[i]>a[i-1]:
    flag[a[i]]=True
    i=i+1
该程序段运行后,列表a的值可能为 (  )
A.[0,7,5,9,7,1,7] B.[0,1,3,5,7,9,1]
C.[0,9,2,3,5,7,9] D.[0,9,5,9,7,9,1]
答案 D
11.有Python代码段如下:
import random
k=random.randint(1,3)
s="abcba"
n=len(s)
t=""
for i in range( int(n/2)):
  t=t+s[i]+s[n-i-k]
print(t)
运行该程序段,输出结果不可能是 (  )
A.aabb B.abbc C.acbb D.abba
答案 D
12.有如下Python程序段:
import random
s="123456789";g=""
for i in range(3):
  n=len(s)
  x=random.randint(0,n-1)
  g+=s[x]
  s=s[0:x]+s[x+1:n]
print (g)
在该程序段执行时,若变量x的值依次为2,2,5,则最终变量g的值为 (  )
A."348" B."237" C."336" D.15
答案 A
二、能力提升
13.所谓亲密数是指如果整数x的全部因子(包括1,不包括x自身)之和等于y,且整数y的全部因子之和等于x,则x和y称为一对亲密数(x与y不相等)。小王想通过Python程序统计1~1000间的亲密数对的个数。
def yzh(m):
  yz_sum=0
  for i in range(1,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。
14.check函数的功能是检查字符串s是否符合相应要求。如果符合返回True,否则返回False。要求s包括大写字母、小写字母、数字以及其他字符。
def check(s):
  c=0
  flag=[0]*4
  for i in s:
    if "0" <=i<="9": #①
      flag[0] =1
    elif 65<=ord(i)<=90:
      flag[1]=1
    elif 97<=ord(i)<=122:
      flag[2]=1
    else:
      flag[3]=1
  for j in range(4):
    c=c+flag #②
  if c=4: #③
    return True
  return False #④
有错误的代码是 (  )
A.①② B.②③ C.③④ D.①④
答案 B
解析 本题考查自定义函数的应用。flag是一个队列,循环for j in range(4)是把队列中元素进行累加,因此②处应修改为 c=c+flag[j]。在语句if c=4:中应该判断c和4是否相等,符号应为==。
15.有如下Python程序:
import turtle
import random
colors=["green","blue","red","purple","orange"]
x=-300;y=-300
def draw(m):
  turtle.begin_fill() #准备绘图
  k=random.randint(0,len(colors)-1) #①
  turtle.pencolor(colors[k]) #用colors[k]颜色做画笔
  for i in range(5): #②
    turtle.forward(m) #向画笔当前方向移动 m 像素长度
    turtle.right(180-36) #画笔向右旋转 144°
    turtle.color(colors[k]) #用第 k 种颜色填充
  turtle.end_fill() #填充结束
for i in range(10):
  x=x+50; y=y+50 #③
  turtle.goto(x,y) #画笔前往坐标位置(x,y)
  draw(30) #绘制大小为30像素的五角星
turtle.done() #绘图结束
下列说法错误的是 (  )
A.分析①处代码,绘图中无法设置“orange”颜色
B.分析②处代码,for循环结束时画笔指向初始时方向
C.分析③处代码,10个五角星将逐个绘制在右上角方向
D.运行程序,相邻两个五角星大小相同、填充色也可能相同
答案 A
解析 本题考查自定义函数和随机数模块。A选项产生0至len(colors)-1之间的正整数,而orange的索引号是len(colors)-1。B选项循环5次,每次旋转144度,共旋转了720度,因此正好指向初始时方向。C选项画笔的初始位置不断地向右上移动。
16.下列Python程序段功能为:随机生成省会城市的测试题目及相应答案。运行结果如图所示。
河北省的省会城市是 A.南京B.上海C.石家庄D.郑州本题参考答案为:C
import random
dict={"北京市":"北京","上海市":"上海","河北省":"石家庄",...}
#dict 中存储中国34个省级行政区及其省会城市
sf=list ( (1) )
sh=list ( (2) )
sj=random.randint(0,33) #生成[0,33]之间的整数
zd=sh[sj]
del sh[sj] #删除列表sh中的第sj项
xx=random.sample(sh,3)+[zd] #随机产生列表sh中的3项与zd连接成新列表xx
random.shuffle(xx) #对列表xx中的内容进行随机排序。
print("%s的省会城市是 "%( (3) ))
for i in range(4):
  print("%s.%s"%("ABCD"[i],xx[i]))
print("本题参考答案为:%s"%("ABCD"[ (4) ]))
上述程序段中(1)(2)(3)(4)处可选语句为:①dict.values(),②dict.keys(),③sh[sj],④sf[sj],
⑤xx.index(zd),⑥xx[zd]则(1)(2)(3)(4)处语句依次可为 (  )
A.①②④⑤ B.①②③⑥
C.②①④⑥ D.②①④⑤
答案 D
17.现有n个学生的7门学科成绩已存入一维数组cj中。某Python程序代码段如下:
def f(x):
  p=x*7;k=0
  for j in range(7):
    if cj[p+j]>cj[p+k]:
      k=j
  return(k)
cj=[96,83,91,85,86,77,88,98,93,94,82,96,87,99]
km="物化生政史地技"
n=2;s=""
for i in range(n):
  s+=km[f(i)]
print(s)
运行后,输出的结果为 (  )
A.物技 B.地政 C.物生 D.技物
答案 A
18.有如下Python程序段:
import random
flag=True;i=0
a=[0]*6
while i<6:
  x=random.randint(1,100)
  if flag or x>50:
    a[i]=x
    flag=not flag
    i+=1
执行该程序段后,在下列选项中,a数组元素中各元素值不可能的是 (  )
A.52,95,46,74,77,83
B.50,55,46,70,21,97
C.62,78,57,61,69,50
D.31,54,48,72,50,82
答案 C
19.某校高一有6个班,现需随机抽取一个班代表学校参加年级合唱比赛,实现该功能的Python程序如下:
import random
cla=["1班","2班","3班","4班","5班","6班"]
v_cla=   
print("随机抽取的班级为"+v_cla)
程序划线处应填入的代码为 (  )
A.random.shuffle(cla)
B.cla[random.randint(1,6)]
C.random.choice(range(6))
D.cla[int(random.random()*6)]
答案 D
20.有如下Python程序段
import random
list1=[]
flag=False
n=0
while n<6:
  num=random.randint( 10,100)
  if num%2==1 or flag:
    flag=not flag
    list1.append(num)
    n+=1
print(list1)
执行该程序段后,列表listl的值不可能是 (  )
A.[89.65,73,79,35,100]
B.[53,96,77,54.51,85]
C.[11,22,54,58,43,68]
D.[25,90,33,99,21,54]
答案 C
21.小明将图a经过如下Python程序段处理后,效果为图b所示,他发现处理后图像黑白颜色分布很不均衡,要想将图像处理成图c,需对程序进行修改。
0 from PIL import Image
1 import numpy as np
2 import matplotlib.pyplot as plt
3 img=np.array(Image.open('dog.jpg').convert('L'))
4 row,cols=img.shape
5 for i in range(row):
6  for j in range(cols):
7    if img[i,j]>188:
8      img[i,j]=1 #1 表示白色
9    else:
10 img[i,j]=0 #0 表示黑色
11 plt.figure('dog')
12 plt.imshow(img,cmap='gray')
13 plt.axis('off')
14 plt.show()
下列做法正确的是 (  )
A.将第7行中的数字’188’改成’100’
B.将第7行中的数字’188’改成’250’
C.将第7行中的’>’改成’<’
D.将第8行的数字’1’改成’0’,将第10行的数字’0’改成’1’
答案 A
22.小明在学习了函数的运用之后,决定编写一段十进制转为二进制的程序,根据输入的十进制正整数,返回其对应的二进制字符串,如图所示
输入要转换的十进制数:1231111011>>>
def D2B(x):
  s=""
  while x>0:
    ①   
    x=x∥2
  ②   
n=int(input("输入要转换的十进制数: "))
print(③    )
(1)若从键盘输入数字17,则程序输出结果为   。
(2)完成程序填空。
(3)如果将加框语名修改为x>=1,对程序结果    (填字母:A.有,B.没有)影响。
答案 (1)10001 (2)①s=str(x%2)+s ②return s ③D2B(n) (3)B
23.小明要将一定数量的糖果装进若干个盒子里,第一个盒子装1颗,后面的盒子装糖果的数量在前一个盒子的基础上翻倍,剩余的糖果则放在最后一个盒子中。例如:当糖果数量为10时,第一个盒子装1颗,第二个盒子装2颗,第三个盒子装4颗,此时剩下3颗糖果,则装在第四个盒子里。
根据对问题的分析,小明设计装糖果算法如下:
输入数据:糖果数量suger;
处理数据:先利用糖果数量suger得出所需盒子的数量total,再根据盒子数量及存放糖果的规律依次得出每个盒子糖果的数量并存储在列表a中;
输出数据:所需的盒子数量、各个盒子的糖果数量。
小明根据算法编写了如下Python程序,请结合算法和程序,回答下列问题。
(1)现已知糖果数量为32颗,则装完糖果后,最后一个盒子中的糖果数量为    颗。
(2)为实现上述功能,请在划线处填入合适代码。
def hz(n):
  c=0
  while n>0:
    c+=1
    ①   
  return c
a=[]
suger=int(input("请输入糖果数量:"))
total=hz(suger)
print ("共需要的盒子数为:"+str(total)+"个")
for i in range(②    ):
  t=2**i
  a.append(t) #将 t 添加到列表 a 中
  ③   
a.append(suger)
print ("每个盒子的糖果数量依次为:"+str(a))
答案 (1)1 (2)①n∥=2或n=n∥2 ②total-1或0,total-1 ③suger-=t或suger=suger-t
24.当从字符串中删除一些字符后,剩余的字符仍保持原顺序,则由剩余字符组成的新字符序列,我们称之为原字符串的子序列。例如:原始字符串“abcde”可以通过删除字符“b”“e”得到目标字符串“acd”,“acd”即为“abcde”的子序列;而原始字符串“abcde”通过删除字符无法得到目标字符串“ebd”,“ebd”则不是“abcde”的子序列。
根据对问题的分析,设计子序列判断算法如下:输入数据:原始字符串bg、目标字符串ed;
处理数据:①从目标字符串ed中依次读取字符;
②所取字符与原始字符串中仍未参与比较的字符逐位比较;
③若比较过程中存在相同字符,则转到①继续执行;若目标字符串已读取完毕,则转到⑤执行;
④若原始字符串中所有字符皆参与比较后,仍未出现相同字符,则终止判断,确定目标字符串不是原始字符串的子序列;
⑤上述过程执行后,目标字符串中所有字符都有序存在于原始字符串中,则确定目标字符串是原始字符串的子序列;输出数据:子序列判断结果。
现根据算法编写了如下Python程序,运行界面如图所示。请结合算法和程序,回答下列问题。
请输入原始字符串:abcde请输入目标字符串:acdacd是abcde的子序列!
def cgs(s,t):
  ①   
  for x in t:
    while pos      pos+=1
    if pos==len(s):
      return 1
    pos+=1
  return 0
jg=["是","不是"]
bg=input("请输入原始字符串:")
ed=input("请输入目标字符串:")
print (ed,③    ,bg,"的子序列!")
(1)为实现上述功能,请在划线处填入合适代码。
(2)若输入原始字符串和目标字符串均为“abcde”,程序中函数调用返回的值为    。
答案 (1)①pos=0 ②s[pos]!=x
③jg[cgs(bg,ed)] (2)0
25.某阅卷系统设计如下:
读取学生答案文件后和标准答案进行对照并判分,题型分为单选、多选和填空。单选阅卷规则:和标准答案一致得全部分数,错选或不选不给分
多选阅卷规则:和标准答案一致得全部分数,漏选给 1 分,错选或不选不给分
填空阅卷规则: 标准答案表中允许有多种答案存在。学生的答案在标准答案中存在,得全部分数,不存在或未填不给分。
例如"学生答案.txt" 内容如下:
张**|A|D|AC|B|flag|
李**|A|D|ACD|AB|flag==True|i>0
标准答案:
题号 1 2 3 4 5 6
题型 单选 单选 多选 多选 填空 填空
答案 A D ACD BC flag或flag==True i==0或i>=0
分值 2 2 3 3 2 2
程序执行结果:
张** 成绩:8分 李** 成绩:9分
(1)如果学生的答案数据为"王**|A|C|AD|BC|flag==True|i>=0",则输出的结果是    。
(2)完善划线处的代码。
def dx(s1,s2,n): #对多选题进行判分
  flag =True
  for i in s1:
    if ①    :
      flag =False
      break
    if ②    :
      return n
    elif flag==False or s1=="":
      return 0
    else:
      return 1
f=open("学生答案.txt")
line=f.readline() #按行读取'学生答案.txt'文件
bd=["单选","A",2, "单选", "D ",2, "多选", "ACD ",3, "多选", "BC ",3, "填空",[ "flag ", "flag==True"], 2, "填空",[ "i==0 ", "i>=0 "],2]
while line:
  sd=line.split("|") #将字符串以'|'为间隔分割成成多个字符串组成的列表
  zf=0
  for i in range(len(sd)-1):
    p=3*i
    if bd[p]== "单选":#对单选题判分
      if ③    :
        zf=zf+bd[p+2]
      elif bd[p]== "多选": #对多选题判分
        zf=④   
      else:
        if sd[i+1]!= "" and sd[i+1] in bd[p+1]:
          zf=zf+bd[p+2]
  print(sd[0],"成绩: ",zf, "分")
  line=f.readline() #读取下一行
f.close()
答案 (1)王** 成绩:10分 (2)①i not in s2 或not i in s2 ②s1==s2 ③sd[i+1]==bd[p+1] ④zf+dx(sd[i+1],bd[p+1],bd[p+2])
26.输入年月日判断是当前年份的第几天。例如:2020年3月1日是这一年的第61天。编写Python程序,实现该功能。(提示:普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年。世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年)
def leap(m): #判断是否是闰年
  if m%400==0 or①    and m%4==0:
    return True
  else:
    return False
year= int(input("请输入 4 位数字的年份:"))
month = int(input("请输入月份:"))
day = int(input("请输入日:"))
monthdays=[0,31,28,31,30,31,30,31,31,30,31,30]
if②    and leap(year):
  sum=1
else:
  sum=0
for i in range(month):
  sum=③   
sum=sum+day
print(year,"年",month,"月",day,"日是这一年的第",sum,"天")
(1)若日期是2022年4月18日是这一年的第    天
(2)请在划线处填入合适的代码。
答案 (1)108 (2)①m%100!=0 ②month>2或者month>=3 ③sum+monthdays[i]或者monthdays[i]+sum(共108张PPT)
课时7 函数与模块
第三章 算法的程序实现
1.掌握自定义函数的构造和调用方法。
2.掌握模块的导入方法和常用函数的应用。
目 录
CONTENTS
知识梳理
01
例题精析
02
随堂检测
03
巩固与提升
04
知识梳理
1
一、模块
1.Python内置模块:数学运算__________模块、生成随机数______________模块、图像____________模块。
2.Python其他模块:用于实现部分操作系统功能(可用于文件、目录等操作)的os模块,与时间处理有关的time模块,可实现科学计算、数据可视化的__________和______________,用于多媒体开发和游戏软件开发的pygame模块,支持图形处理的tkinter等。
math
random
Image
numpy
matplotlib
3.在Python中,把一组函数放到一个.py文件里,这个文件就称为一个______。
4.使用______________语句或_____________语句导入Python内置的模块和来自第三方的模块,将能使用其中的函数,如__________和______________函数。
模块
import
from-import
sqrt
random
二、函数的构造和应用
def函数名(参数集合):
  <函数体>
  [return函数值]
函数名的命名规则和变量名一样。完成函数的构造后,在程序中就可以根据需要,像内建函数一样调用该函数。
三、模块的导入及应用
在Python Shell中导入math模块,并调用该模块中的sqrt函数,可采用以下两种方法:
方法一 方法二
>>>import math >>>math.sqrt(9) 3.0 >>>from math import sqrt
>>>sqrt(9)
3.0
1.math模块中的常用常数与函数
名称 含义
math.e 自然常数e
math.pi 圆周率π
math.ceil(x) 对x向上取整,比如x=1.2,返回2
math.floor(x) 对x向下取整,比如x=1.2,返回1
math.pow(x,y) 指数运算,得到x的y次方
math.log(x) 对数,默认基底为e
math.sin(x) 正弦函数
math.cos(x) 余弦函数
math.tan(x) 正切函数
math.degrees(x) 角度转换成弧度
math.radians(x) 弧度转换成角度
2.random模块中的常用函数
名称 含义
random.random() 随机生成一个[0,1)范围内的实数
random.uniform(a,b) 随机生成一个[a,b]范围内的实数
random.randint(a,b) 随机生成一个[a,b]范围内的整数
random.choice(seq) 从序列的元素中随机挑选一个元素,比如:random.choice(range(10)),从0到9中随机挑选一个整数
random.sample(seq,k) 从序列中随机挑选k个元素
random.shuffle(seq) 将序列的所有元素随机排序
例题精析
2
例1 编写一个自定义函数实现判断字符串s是否是回文字符串,请在划线处填入合适的代码。
算法思想:采用双指针分别指向首尾字符,若两者相同,依次向中间靠拢
def hw(s):
  i=0
  j=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 下列Python函数实现了将大写字母循环后移t个位置功能,如A向后移3个位置后变为D,X后移3位后,变成A。已知'A'的ASCII码值为65。
def jm(s,t):
  n=ord(s)-65+t
  if n>=25:
     
  return chr(n+65)
(1)请在程序划线处填入合适的代码。
(2)若执行语句print(jm('Y',4)),则输出的内容是      。
答案 (1)n=n-25 (2)C
解析 根据题目的功能,n是加密字母在字母中位置,值的范围是[0,25],如果向后移动后超出25,则表示循环向前移动,需要减去25,最后返回ASCII码值对应的字母。将Y后移4位的值为C。
例2 生成一个随机密码,要求大写字母、小写字母和数字必须至少包含一个,且密码的长度不能少于6位。编写的Python代码如下:
import random
def pas():
  a="abcdefghijklmnopqrstuvwxyz"
  b="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  c="0123456789"
  st=a+b+c
  d=[]
  d.append(①    ) #从字符串a中随机取一个字符
  d.append(②    ) #从字符串b中随机取一个字符
  i=2
  f=True
 while i<=5③    f:
    d.append(random.choice(st))
    if d[i]>="0" and d[i]<="9":
       f=False
     i+=1
  random.shuffle(d)  #将序列d中所有元素随机排序
  print("".join(d))
pas()
(1)请在程序划线处填入合适的代码。
(2)执行上述算法,    (填:可能/不可能)产生密码“Eaf8dLdeS”。
答案 (1)①a[random.randint(0,25)]或random.choice(a) ②b[random.randint(0,25)]或random.choice(b) ③or (2)可能
解析 产生一个[0,25]之间的整数,在字符串中进行切片,或者在字符串中选择一个字母。当新增加的字母中包含数字或者密码位数大于或等于5个,密码中只可能包含一个数字,由于该密码后期是随机排序的,数字8有可能是最后一次产生的。
变式训练2 哥德巴赫猜想:任意一个大于等于4的偶数,都可以用两个素数之和表示。如:4=2+2,6=3+3,8=3+5,10=5+5,12=5+7,98=17+79。
编写一个验证哥德巴赫猜想的Python程序:程序运行时,输入一个大于等于4的偶数,如果哥德巴赫猜想验证成功,则第一行输出信息“Yes”,第二行输出用两个素数表示该偶数的等式,否则输出“No”。程序运行效果如图所示:
实现上述功能的程序如下,请在程序划线处填入合适的代码。
import math
def pp(x):
  pp=True
  j=2
  while j<=int(math.sqrt(x)) and pp==True:
    if x % j==0:
      pp=False
    else:
     ①     
  return pp
n=int(input('please input n:'))
p=1
pd=False
if n % 2==0:
  while not pd and p    p=p+1
    ②     
    if pp(p) and pp(q):
      print('Yes')
      ③     
      print(str(n),"=",str(p),'+',str(q))
  if pd==False:
    print('No')
 else:
  print('sorry,你输入的数不是偶数!')
答案 ①j=j+1 ②q=n-p ③pd=True
解析 函数pp(x)的功能是判断整数x是否为素数,若是素数,则返回True,否则返回False。判断素数的方法为:让x去除以j(2至根号x取整),若能被某个数j整除,则函数值为False,否则j+1后再试,因此①处语句修改为j=j+1;主程序的功能是寻找组成整数n的二个素数,方法是枚举p,因此q=n-p,然后再判断p和q是否均为素数,若是则完成定理证明,为了结束while循环,要更改pd的值为True,因此③处代码为pd=True,否则将继续枚举p的值。
C
解析 本题考查随机数模块以及for循环。其中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'划线字母为可能访问到并且输出的字符,因此C选项中的f错误,访问不到这个字符。
例4 小明用Python语言中对大小为100*100像素的图像“上.jpg”(如图所示)进行简单处理,得到下列四幅图像,请在划线处填入合适的代码。
n1 n2 n3 n4
部分代码如下:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img=np.array(Image.open('上.jpg').convert('L')) #将图像转换为灰色图像后转换为二维矩阵
width,height = img.shape[0],img.shape[1]
n1 = np.zeros(shape=(width,height)) # 用于存储结果图像,大小和img相同
n2 = np.zeros(shape=(width,height))
n3 = np.zeros(shape=(width,height))
n4 = np.zeros(shape=(width,height))
for x in range(0,width):
  for y in range(0,height):
    ①     
    ②     
    n3[x,y]=img[x,y]
    n4[x,y]=img[x,y]
    if y%10==0:
      ③     
    if x%10==0:
      ④     
#显示图像,代码略
答案 ①n2[x,height-y-1]=img[x,y]
②n1[width-x-1,y]=img[x,y]
③n3[x,y]=0
④n4[x,y]=0
解析 本题考查Image模块。n1图像显然是对原图的上下翻转,行x的对称行为height-y-1,而行保持不变。n1图像显然是对原图的左右翻转,列保持不变,列y的对称列为width-x-1,而。③n3图像是每隔一定数量的列数时,出现一个黑条,因此当条件y%10==0成立时,显示黑色。③n4图像是每隔一定数量的行数时,出现一个黑条,因此当条件x%10==0成立时,显示黑色。
变式训练3 现有一幅文件名为“车牌.jpg”的彩色图像,车牌底色为蓝色,如图a所示,通过Python程序对该图像进行二值化,即将车牌蓝色部分变为白色,其他全部变为黑色,如图b所示,以凸显出车牌的轮廓。程序代码如下,请在划线处填入合适的代码。
图a         图b
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt #获取车牌蓝色的RGB分量的边界,红色rl,r2,绿色gl,g2,蓝色
b1,b2。代码略
img =np.array(Image.open("①    ")) #打开图片并将其像素矩阵存入img
rows, cols = img.shape[0],img.shape[1]
imgnew = np.zeros(shape=(rows,cols))
# imgnew用于存储结果图像,大小和 img相同
for i in range(rows):
  for j in range(cols):
    r,g,b=img[i,j] #获取img当前位置的r,g,b分量
    if r1<=r<=r2 and g1<=g<=g2 and b1<=b<=b2:
      imgnew[i,j]=1 #将新矩阵该位置设为白色
    else:
      ②   
plt.figure('车牌')
plt.imshow(imgnew, cmap='gray')
plt.axis('off')
plt.show()
答案 ①车牌.jpg ②imgnew[i,j]= 0
解析 本题考查Image模块。①打开车牌.jpg图片并将其像素矩阵存入img。②将该点的值设置为黑色。
随堂检测
3
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个位上的数字,符合立方和等于他本身,因此属于水仙花数。
C
2.有如下Pyhton程序段:
def gcd(a,b):
  c = a%b
  while c > 0:
    a,b = b,c
    c=a%b
  return b
a=int(input("请输入:"))
b=int(input("请输入:"))
A
gcd = gcd(a,b)
scm = a * b ∥ gcd
print( gcd,scm)
运行该程序,输入a,b的值分别为16,12,则输出gcd,scm的值分别为(  )
A.4 48 B.48 4 C.2 12 D.12 2
3.有如下Pyhon程序段:
def sel(a,b,c):
  if a    a+=b;b=a-b;a=a-b
  if a    t=a;a=c;c=t
  print(a,b,c)
sel(1,2,3)
执行该程序段后,输出的结果是(  )
A.1,2,3 B.3,2,1 C.3,1,2 D.1,3,2
C
4.有Python的程序代码如下:
def change_c(s):
  if "a"<=s<="z":
    s = chr(ord(s)-32)
  return s
ss = input("请输入一串英文字母:")
n = len(ss)
ans = ""
for i in range(n):
  c = change_c(ss[i])
B
  ans = c + ans #①
print(ans)
现执行该程序,输入"abcDEF",下列说法正确的是(  )
A.函数change_c()被调用了3次
B.函数change_c()的功能是将小写字母变成大写字母
C.输出的内容为"ABCDEF"
D.将①所在语句改为“ans+=c”程序功能不变
5.有如下Python程序段:
import turtle as tt
t=tt.Pen() #导入海龟,定义画笔t
import random
tt.bgcolor("white")
colors=["red","green","blue","yellow"]
for x in range(100):
  t.pencolor(colors[x%random.randint(1,4)]) #设置画笔的颜色
  t.circle(x) #画半径是x像素的圆
  t.left(91) #画笔方向逆时针旋转91度
C
关于该程序段,下列说法正确的是 (  )
A.程序运行后,绘制了100个同心圆
B.程序运行后,绘制的所有圆的颜色不可能都为红色
C.程序运行后,最后绘制的一个圆的颜色可能为黄色
D.程序运行后,绘制的各圆没有交点
解析 本题考查随机数和海龟模块应用。一共画了100个圆,每画完一个圆,画笔回到原点,且方向逆时针旋转91度,因此所有的圆起点是一样的,因此有交点,但不是同心圆。若x%random.randint(1,4)的值均为0,则可能全部是红色的。
6.某Python程序段如下:
def isprime(x):
  for i in range(2,x):
    if x % i ==0:
      return False
  return True
prime =[]
for i in range(2,21):
  if isprime(i):
    prime.append(i) #将 i 添加到列表
print(len(prime))
运行该程序段,输出结果是     。
答案 8
解析 本题考查自定义函数的相关知识,功能是判断是否是质数。[2,20]之间的素数有8个。
7.技术学科一共包含2门学科——信息技术和通用技术,这就需要我们关注学科的平衡,而衡量某位学生学科平衡的重要指标就是学科吻合度,采用信息技术与通用技术的得分差来判断[分差每3分为一级:分差0到3分(不含3分),表示“0级偏差”;分差3到6分(不含6分),表示“1级偏差”,分差6到9分(不含9分),表示“2级偏差”……分差最高为50分,最后一级分差48到50(含50分),表示“16级偏差”],计算每位学生的吻合度偏差值。根据题意,请回答下列问题:
(1)(多选)为了后续程序处理,需要把数据读入到程序,每个学生一条记录,用Python存储学生测试得分数据,下列可行的是(以前两条记录为例)    (填字母)。
A.students=[[0901,50,32],[0902,50,45],……]
B.students={'0901':['50','32'],'0902':['50','45'],……}
C.students={0901:['50','32'],0902:['50','45'],……}
D.students=[['0901','50','32'],['0902','50','45'],……]
(2)编写函数f(xx,ty)实现传入信息得分和通用得分,返回吻合度级别    (返回示例:'1级偏差')。



(3)完成程序填空:
students={'0901':[50,82],'0902':[50,95],……}#(以前两条记录为例)
for i in students.keys():
  xx=①     
  ty=②     
  print(i,':',f(xx,ty))
答案 (1)BD
(2)def f(xx,ty):
   return str(abs(xx-ty)∥3)+'级偏差'及其他等价答案
(3)①students[i][0] ②students[i][1]-students[i][0]或students[i][1]-xx
解析 本题考查数据类型、自定义函数等。(1)0901只能作为文本字符串,若作为数值类型,其值会自动变为901。(2)分差每3分为一级,表达式abs(xx-ty)作为分差,返回值注意数据类型。(3)students是一个字典类型的数据,students.keys表示字典的键,其对应字典的值是一个列表,每个列表有两个元素,一个信息得分,一个技术得分,因此students[i]表示键i对应的得分列表,students[i][0]和students[i][1]分别表示信息得分和技术得分。
4
巩固与提升
基础巩固
能力提升
1.有如下Python程序段:
def days(y,m,d):
  md=[31,28,31,30,31,30,31,31,30,31,30,31]
  ans=y*365+y∥4-y∥100+y∥400
  for i in range(m-1):
    ans+=md[i]
  if(y%4==0 and y%100!=0 or y%400==0)and m>=3:
    ans+=1
  ans+=d
  return ans
print(days(2023,2,9)-days(2022,11,29))
运行该程序段后,输出结果是(  )
A.71 B.72 C.73 D.74
B
2.如果A的所有正因子和等于B,B的所有正因子和等于A,因子包括1但不包括本身,且A不等于B,则称A,B为亲密数对。下列程序段可以求出3000以内的亲密数。
def div(n):
  lis=[]
  for i in range(1,n∥2+1):
    if n%i==0:
        (1)  
  return lis
B
for i in range(3000):
  sum1=sum(div(i))
  sum2= (2) 
  if sum2==i and   (3)   :
    print(i,sum1)
上述程序段中,划线处可选代码为:
①lis.append(i) ②sum(div(sum1-i)) ③sum(div(sum1)) ④iA.①③④ B.①③⑤ C. ①②④ D.①②⑤
3.用Python程序随机生成100个[0,20]之间的随机数,统计0~9及9以上每个数字出现的次数并输出结果:
import random
list=[0]*100
count=[0]*11
for i in range(0,100):
  num=random.randint(0,20)  #产生[0,20]之间的随机整数
  list[i]=num
  if   :
    num=10
  count[num]+=1
print("0~9及9以上依次出现的次数为:",count)
程序某次运行的结果如下:
0~9及9以上依次出现的次数为:[3,5,4,6,5,5,2,5,9,4,52]
则划线处的代码为 (  )
A.num>i B.list[i]>num C.num>9 D.count[i]>9
解析 本题考查随机数和桶的应用。语句list[i]=num将索引为i的列表元素修改为num。语句count[num]+=1的功能是统计num的数量。从输出语句来看,count[10]表示超过9以上的数字,因此当num>9时,全部统计在count[10]中。
C
4.使用 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
print(s)
方框中的代码由以下三部分组成:
①k-=1 ②a[m]=a[k-1] ③s+=str(a[m]) 代码顺序正确的选项是(  )
A.①②③ B.②③① C.②①③ D.③②①
D
6.有如下Python程序段:
import random
a=[0]*6
i=0
while i<6:
  r=random.randint(2, 11 )
  if r not in a :
    a[i]=r
    i+=1
print(a)
运行程序后,输出的结果可能是(  )
A.[3,0,0,0,0,0] B.[2,3,4,5,6,7]
C.[0,10,0,3,0,5] D.[9,11,4,6,0,0]
B
7.有如下Python程序段:
from random import *
d=[8,6,9,3,1,2]
a=randint(0,2) #随机产生 0-2 的整数
b=a+3
for i in range(a,b):
  if d[i]>d[i+1]:
    d[i],d[i+1]=d[i+1],d[i]
B
A.6,8,3,9,1,2 B.6,8,3,1,9,2 C.8,6,3,1,9,2 D.8,6,3,1,2,9
8.编写Python程序,模拟“石头剪刀布”的游戏,实现电脑随机输出“石头”“剪刀”“布”。函数功能表如下:
名称 含义
random.random() 随机生成一个[0,1)范围内的实数
random.randint(a,b) 随机生成一个[a,b]范围内的整数
random.sample(seq,k) 从序列中随机挑选k个元素
random.shuffle(seq) 将序列的所有元素随机排序
下列代码段中能够实现该功能的是 (  )
D
① ②
import random a={0:"石头",1:"剪刀",2:"布"} b=int(random.random()*2) print(a[b]) import random
a={0:"石头",1:"剪刀",2:"布"}
b=random.randint(0,2) print(a[b])
③ ④
import random a=["石头","剪刀","布"] b=random.sample(a,1) print(b[1]) import random
a=["石头","剪刀","布"]
random.shuffle(a)
print(a[1])
A.①③ B.①④ C.②③ D.②④
解析 本题考查随机数、字典和列表的应用。代码段①int(random.random()*2)产生的范围是0或1。代码段③在列表a中随机挑一个,因此b的值应为"石头"、"剪刀"或"布",而b[1]是这些字符中第1个字符。
C
解析 本题考查列表及斐波拉契数列的相关知识。斐波拉契数列:1,1,2,3,
5,8,13,21,34,55,89,144…n为该数列第2至第11项中随机一项,不可能为35,选C。
10.某Python程序如下:
from random import random
a=[0]*7
flag=[False]*10
i=1
while i<=6:
  a[i]=int(random()*5)*2+1
  if flag[a[i]]==False or a[i]>a[i-1]:
    flag[a[i]]=True
    i=i+1
该程序段运行后,列表a的值可能为(  )
A.[0,7,5,9,7,1,7] B.[0,1,3,5,7,9,1]
C.[0,9,2,3,5,7,9] D.[0,9,5,9,7,9,1]
D
11.有Python代码段如下:
import random
k=random.randint(1,3)
s="abcba"
n=len(s)
t=""
for i in range( int(n/2)):
  t=t+s[i]+s[n-i-k]
print(t)
D
12.有如下Python程序段:
import random
s="123456789";g=""
for i in range(3):
  n=len(s)
  x=random.randint(0,n-1)
  g+=s[x]
  s=s[0:x]+s[x+1:n]
print (g)
在该程序段执行时,若变量x的值依次为2,2,5,则最终变量g的值为(  )
A."348" B."237" C."336" D.15
A
13.所谓亲密数是指如果整数x的全部因子(包括1,不包括x自身)之和等于y,且整数y的全部因子之和等于x,则x和y称为一对亲密数(x与y不相等)。小王想通过Python程序统计1~1000间的亲密数对的个数。
def yzh(m):
  yz_sum=0
  for i in range(1,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。
14.check函数的功能是检查字符串s是否符合相应要求。如果符合返回True,否则返回False。要求s包括大写字母、小写字母、数字以及其他字符。
def check(s):
  c=0
  flag=[0]*4
  for i in s:
    if "0" <=i<="9": #①
      flag[0] =1
    elif 65<=ord(i)<=90:
      flag[1]=1
    elif 97<=ord(i)<=122:
      flag[2]=1
    else:
      flag[3]=1
  for j in range(4):
    c=c+flag #②
  if c=4: #③
    return True
  return False #④
有 的代码是(  )
A.①② B.②③ C.③④ D.①④
B
解析 本题考查自定义函数的应用。flag是一个队列,循环for j in range(4)是把队列中元素进行累加,因此②处应修改为 c=c+flag[j]。在语句if c=4:中应该判断c和4是否相等,符号应为= = 。
15.有如下Python程序:
import turtle
import random
colors=["green","blue","red","purple","orange"]
x=-300;y=-300
def draw(m):
  turtle.begin_fill() #准备绘图
  k=random.randint(0,len(colors)-1) #①
  turtle.pencolor(colors[k]) #用colors[k]颜色做画笔
  for i in range(5): #②
    turtle.forward(m) #向画笔当前方向移动 m 像素长度
    turtle.right(180-36) #画笔向右旋转 144°
    turtle.color(colors[k]) #用第 k 种颜色填充
  turtle.end_fill() #填充结束
for i in range(10):
  x=x+50; y=y+50 #③
  turtle.goto(x,y) #画笔前往坐标位置(x,y)
  draw(30) #绘制大小为30像素的五角星
turtle.done() #绘图结束
解析 本题考查自定义函数和随机数模块。A选项产生0至len(colors)-1之间的正整数,而orange的索引号是len(colors)-1。B选项循环5次,每次旋转144度,共旋转了720度,因此正好指向初始时方向。C选项画笔的初始位置不断地向右上移动。
A
16.下列Python程序段功能为:随机生成省会城市的测试题目及相应答案。运行结果如图所示。
import random
dict={"北京市":"北京","上海市":"上海","河北省":"石家庄",...}
#dict 中存储中国34个省级行政区及其省会城市
河北省的省会城市是
A.南京
B.上海
C.石家庄
D.郑州
本题参考答案为:C
sf=list ( (1) )
sh=list ( (2) )
sj=random.randint(0,33) #生成[0,33]之间的整数
zd=sh[sj]
del sh[sj] #删除列表sh中的第sj项
xx=random.sample(sh,3)+[zd] #随机产生列表sh中的3项与zd连接成新列表xx
random.shuffle(xx) #对列表xx中的内容进行随机排序。
print("%s的省会城市是 "%( (3) ))
for i in range(4):
  print("%s.%s"%("ABCD"[i],xx[i]))
print("本题参考答案为:%s"%("ABCD"[ (4) ]))
上述程序段中(1)(2)(3)(4)处可选语句为:①dict.values(),②dict.keys(),③sh[sj],④sf[sj],
⑤xx.index(zd),⑥xx[zd]则(1)(2)(3)(4)处语句依次可为(  )
A.①②④⑤ B.①②③⑥
C.②①④⑥ D.②①④⑤
D
17.现有n个学生的7门学科成绩已存入一维数组cj中。某Python程序代码段如下:
def f(x):
  p=x*7;k=0
  for j in range(7):
    if cj[p+j]>cj[p+k]:
      k=j
  return(k)
cj=[96,83,91,85,86,77,88,98,93,94,82,96,87,99]
km="物化生政史地技"
n=2;s=""
for i in range(n):
  s+=km[f(i)]
print(s)
运行后,输出的结果为(  )
A.物技 B.地政 C.物生 D.技物
A
18.有如下Python程序段:
import random
flag=True;i=0
a=[0]*6
while i<6:
  x=random.randint(1,100)
  if flag or x>50:
    a[i]=x
    flag=not flag
    i+=1
执行该程序段后,在下列选项中,a数组元素中各元素值 的是 (  )
A.52,95,46,74,77,83
B.50,55,46,70,21,97
C.62,78,57,61,69,50
D.31,54,48,72,50,82
C
D
19.某校高一有6个班,现需随机抽取一个班代表学校参加年级合唱比赛,实现该功能的Python程序如下:
import random
cla=["1班","2班","3班","4班","5班","6班"]
v_cla=   
print("随机抽取的班级为"+v_cla)
程序划线处应填入的代码为(  )
A.random.shuffle(cla)
B.cla[random.randint(1,6)]
C.random.choice(range(6))
D.cla[int(random.random()*6)]
20.有如下Python程序段
import random
list1=[]
flag=False
n=0
while n<6:
  num=random.randint( 10,100)
  if num%2==1 or flag:
    flag=not flag
    list1.append(num)
    n+=1
print(list1)
C
21.小明将图a经过如下Python程序段处理后,效果为图b所示,他发现处理后图像黑白颜色分布很不均衡,要想将图像处理成图c,需对程序进行修改。
0 from PIL import Image
1 import numpy as np
2 import matplotlib.pyplot as plt
3 img=np.array(Image.open('dog.jpg').convert('L'))
4 row,cols=img.shape
5 for i in range(row):
6  for j in range(cols):
7    if img[i,j]>188:
8      img[i,j]=1 #1 表示白色
9    else:
10 img[i,j]=0 #0 表示黑色
11 plt.figure('dog')
12 plt.imshow(img,cmap='gray')
13 plt.axis('off')
14 plt.show()
下列做法正确的是 (  )
A.将第7行中的数字’188’改成’100’
B.将第7行中的数字’188’改成’250’
C.将第7行中的’>’改成’<’
D.将第8行的数字’1’改成’0’,将第10行的数字’0’改成’1’
A
22.小明在学习了函数的运用之后,决定编写一段十进制转为二进制的程序,根据输入的十进制正整数,返回其对应的二进制字符串,如图所示
输入要转换的十进制数:
123
1111011
>>>
    ①   
    x=x∥2
  ②   
n=int(input("输入要转换的十进制数: "))
print(③    )
(1)若从键盘输入数字17,则程序输出结果为   。
(2)完成程序填空。
(3)如果将加框语名修改为x>=1,对程序结果    (填字母:A.有,B.没有)影响。
答案 (1)10001 (2)①s=str(x%2)+s ②return s ③D2B(n) (3)B
23.小明要将一定数量的糖果装进若干个盒子里,第一个盒子装1颗,后面的盒子装糖果的数量在前一个盒子的基础上翻倍,剩余的糖果则放在最后一个盒子中。例如:当糖果数量为10时,第一个盒子装1颗,第二个盒子装2颗,第三个盒子装4颗,此时剩下3颗糖果,则装在第四个盒子里。
根据对问题的分析,小明设计装糖果算法如下:
输入数据:糖果数量suger;
处理数据:先利用糖果数量suger得出所需盒子的数量total,再根据盒子数量及存放糖果的规律依次得出每个盒子糖果的数量并存储在列表a中;
输出数据:所需的盒子数量、各个盒子的糖果数量。
小明根据算法编写了如下Python程序,请结合算法和程序,回答下列问题。
(1)现已知糖果数量为32颗,则装完糖果后,最后一个盒子中的糖果数量为
    颗。
(2)为实现上述功能,请在划线处填入合适代码。
def hz(n):
  c=0
  while n>0:
    c+=1
    ①   
  return c
a=[]
suger=int(input("请输入糖果数量:"))
total=hz(suger)
print ("共需要的盒子数为:"+str(total)+"个")
for i in range(②    ):
  t=2**i
  a.append(t) #将 t 添加到列表 a 中
  ③   
a.append(suger)
print ("每个盒子的糖果数量依次为:"+str(a))
答案 (1)1 (2)①n∥=2或n=n∥2 ②total-1或0,total-1 ③suger-=t或suger=suger-t
24.当从字符串中删除一些字符后,剩余的字符仍保持原顺序,则由剩余字符组成的新字符序列,我们称之为原字符串的子序列。例如:原始字符串“abcde”可以通过删除字符“b”“e”得到目标字符串“acd”,“acd”即为“abcde”的子序列;而原始字符串“abcde”通过删除字符无法得到目标字符串“ebd”,“ebd”则不是“abcde”的子序列。
根据对问题的分析,设计子序列判断算法如下:输入数据:原始字符串bg、目标字符串ed;
处理数据:①从目标字符串ed中依次读取字符;
②所取字符与原始字符串中仍未参与比较的字符逐位比较;
③若比较过程中存在相同字符,则转到①继续执行;若目标字符串已读取完毕,则转到⑤执行;
④若原始字符串中所有字符皆参与比较后,仍未出现相同字符,则终止判断,确定目标字符串不是原始字符串的子序列;
⑤上述过程执行后,目标字符串中所有字符都有序存在于原始字符串中,则确定目标字符串是原始字符串的子序列;输出数据:子序列判断结果。
现根据算法编写了如下Python程序,运行界面如图所示。请结合算法和程序,回答下列问题。
请输入原始字符串:abcde
请输入目标字符串:acd
acd是abcde的子序列!
def cgs(s,t):
  ①   
  for x in t:
    while pos      pos+=1
    if pos==len(s):
      return 1
    pos+=1
  return 0
jg=["是","不是"]
bg=input("请输入原始字符串:")
ed=input("请输入目标字符串:")
print (ed,③    ,bg,"的子序列!")
(1)为实现上述功能,请在划线处填入合适代码。
(2)若输入原始字符串和目标字符串均为“abcde”,程序中函数调用返回的值为    。
答案 (1)①pos=0 ②s[pos]!=x
③jg[cgs(bg,ed)] (2)0
25.某阅卷系统设计如下:
读取学生答案文件后和标准答案进行对照并判分,题型分为单选、多选和填空。单选阅卷规则:和标准答案一致得全部分数,错选或不选不给分
多选阅卷规则:和标准答案一致得全部分数,漏选给 1 分,错选或不选不给分
填空阅卷规则: 标准答案表中允许有多种答案存在。学生的答案在标准答案中存在,得全部分数,不存在或未填不给分。
例如"学生答案.txt" 内容如下:
张**|A|D|AC|B|flag|
李**|A|D|ACD|AB|flag==True|i>0
标准答案:
题号 1 2 3 4 5 6
题型 单选 单选 多选 多选 填空 填空
答案 A D ACD BC flag或flag==True i==0或i>=0
分值 2 2 3 3 2 2
程序执行结果:
张** 成绩:8分 李** 成绩:9分
(1)如果学生的答案数据为"王**|A|C|AD|BC|flag==True|i>=0",则输出的结果是    。
(2)完善划线处的代码。
def dx(s1,s2,n): #对多选题进行判分
  flag =True
  for i in s1:
    if ①    :
      flag =False
      break
    if ②    :
      return n
    elif flag==False or s1=="":
      return 0
    else:
      return 1
f=open("学生答案.txt")
line=f.readline() #按行读取'学生答案.txt'文件
bd=["单选","A",2, "单选", "D ",2, "多选", "ACD ",3, "多选", "BC ",3, "填空",[ "flag ", "flag==True"], 2, "填空",[ "i==0 ", "i>=0 "],2]
while line:
  sd=line.split("|") #将字符串以'|'为间隔分割成成多个字符串组成的列表
  zf=0
  for i in range(len(sd)-1):
    p=3*i
    if bd[p]== "单选":#对单选题判分
      if ③    :
        zf=zf+bd[p+2]
      elif bd[p]== "多选": #对多选题判分
        zf=④   
      else:
        if sd[i+1]!= "" and sd[i+1] in bd[p+1]:
          zf=zf+bd[p+2]
  print(sd[0],"成绩: ",zf, "分")
  line=f.readline() #读取下一行
f.close()
答案 (1)王** 成绩:10分 (2)①i not in s2 或not i in s2 ②s1==s2 
③sd[i+1]==bd[p+1] ④zf+dx(sd[i+1],bd[p+1],bd[p+2])
26.输入年月日判断是当前年份的第几天。例如:2020年3月1日是这一年的第61天。编写Python程序,实现该功能。(提示:普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年。世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年)
def leap(m): #判断是否是闰年
  if m%400==0 or①    and m%4==0:
    return True
  else:
    return False
year= int(input("请输入 4 位数字的年份:"))
month = int(input("请输入月份:"))
day = int(input("请输入日:"))
monthdays=[0,31,28,31,30,31,30,31,31,30,31,30]
if②    and leap(year):
  sum=1
else:
  sum=0
for i in range(month):
  sum=③   
sum=sum+day
print(year,"年",month,"月",day,"日是这一年的第",sum,"天")
(1)若日期是2022年4月18日是这一年的第    天 。
(2)请在划线处填入合适的代码。
答案 (1)108 (2)①m%100!=0 ②month>2或者month>=3 
③sum+monthdays[i]或者monthdays[i]+sum课时7 函数与模块
课时目标
1.掌握自定义函数的构造和调用方法。2.掌握模块的导入方法和常用函数的应用。
一、模块
1.Python内置模块:数学运算________模块、生成随机数________模块、图像________模块。
2.Python其他模块:用于实现部分操作系统功能(可用于文件、目录等操作)的os模块,与时间处理有关的time模块,可实现科学计算、数据可视化的________和________,用于多媒体开发和游戏软件开发的pygame模块,支持图形处理的tkinter等。
3.在Python中,把一组函数放到一个.py文件里,这个文件就称为一个________。
4.使用________语句或________________语句导入Python内置的模块和来自第三方的模块,将能使用其中的函数,如________和____________函数。
二、函数的构造和应用
def函数名(参数集合):
  <函数体>
  [return函数值]
函数名的命名规则和变量名一样。完成函数的构造后,在程序中就可以根据需要,像内建函数一样调用该函数。
三、模块的导入及应用
在Python Shell中导入math模块,并调用该模块中的sqrt函数,可采用以下两种方法:
方法一 方法二
>>>import math>>>math.sqrt(9)3.0 >>>from math import sqrt>>>sqrt(9)3.0
1.math模块中的常用常数与函数
名称 含义
math.e 自然常数e
math.pi 圆周率π
math.ceil(x) 对x向上取整,比如x=1.2,返回2
math.floor(x) 对x向下取整,比如x=1.2,返回1
math.pow(x,y) 指数运算,得到x的y次方
math.log(x) 对数,默认基底为e
math.sin(x) 正弦函数
math.cos(x) 余弦函数
math.tan(x) 正切函数
math.degrees(x) 角度转换成弧度
math.radians(x) 弧度转换成角度
2.random模块中的常用函数
名称 含义
random.random() 随机生成一个[0,1)范围内的实数
random.uniform(a,b) 随机生成一个[a,b]范围内的实数
random.randint(a,b) 随机生成一个[a,b]范围内的整数
random.choice(seq) 从序列的元素中随机挑选一个元素,比如:random.choice(range(10)),从0到9中随机挑选一个整数
random.sample(seq,k) 从序列中随机挑选k个元素
random.shuffle(seq) 将序列的所有元素随机排序
例1 编写一个自定义函数实现判断字符串s是否是回文字符串,请在划线处填入合适的代码。
算法思想:采用双指针分别指向首尾字符,若两者相同,依次向中间靠拢
def hw(s):
  i=0
  j=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+"不是回文字符串!")
听课笔记:                                    
                                    
                                    
                                    
变式训练1 下列Python函数实现了将大写字母循环后移t个位置功能,如A向后移3个位置后变为D,X后移3位后,变成A。已知'A'的ASCII码值为65。
def jm(s,t):
  n=ord(s)-65+t
  if n>=25:
____________
  return chr(n+65)
(1)请在程序划线处填入合适的代码。
(2)若执行语句print(jm('Y',4)),则输出的内容是____________。
例2 生成一个随机密码,要求大写字母、小写字母和数字必须至少包含一个,且密码的长度不能少于6位。编写的Python代码如下:
import random
def pas():
  a=″abcdefghijklmnopqrstuvwxyz″
  b=″ABCDEFGHIJKLMNOPQRSTUVWXYZ″
c=″0123456789″
st=a+b+c
d=[]
d.append(①________) #从字符串a中随机取一个字符
d.append(②________) #从字符串b中随机取一个字符
i=2
f=True
while i<=5③________f:
d.append(random.choice(st))
if d[i]>=″0″ and d[i]<=″9″:
     f=False
  i+=1
  random.shuffle(d)  #将序列d中所有元素随机排序
  print(″″.join(d))
pas()
(1)请在程序划线处填入合适的代码。
(2)执行上述算法,________(填:可能/不可能)产生密码“Eaf8dLdeS”。
听课笔记:                                    
                                    
                                    
                                    
                                    
                                    
变式训练2 哥德巴赫猜想:任意一个大于等于4的偶数,都可以用两个素数之和表示。如:4=2+2,6=3+3,8=3+5,10=5+5,12=5+7,98=17+79。
编写一个验证哥德巴赫猜想的Python程序:程序运行时,输入一个大于等于4的偶数,如果哥德巴赫猜想验证成功,则第一行输出信息“Yes”,第二行输出用两个素数表示该偶数的等式,否则输出“No”。程序运行效果如图所示:
实现上述功能的程序如下,请在程序划线处填入合适的代码。
import math
def pp(x):
  pp=True
  j=2
  while j<=int(math.sqrt(x)) and pp==True:
    if x % j==0:
      pp=False
    else:
     ①     
  return pp
n=int(input('please input n:'))
p=1
pd=False
if n % 2==0:
  while not pd and p    p=p+1
    ②     
    if pp(p) and pp(q):
      print('Yes')
      ③     
      print(str(n),"=",str(p),'+',str(q))
  if pd==False:
    print('No')
 else:
  print('sorry,你输入的数不是偶数!')
例3 有如下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
听课笔记:                                    
                                    
                                    
例4 小明用Python语言中对大小为100*100像素的图像“上.jpg”(如图所示)进行简单处理,得到下列四幅图像,请在划线处填入合适的代码。
n1 n2 n3 n4
部分代码如下:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img=np.array(Image.open('上.jpg').convert('L')) #将图像转换为灰色图像后转换为二维矩阵
width,height = img.shape[0],img.shape[1]
n1 = np.zeros(shape=(width,height)) # 用于存储结果图像,大小和img相同
n2 = np.zeros(shape=(width,height))
n3 = np.zeros(shape=(width,height))
n4 = np.zeros(shape=(width,height))
for x in range(0,width):
for y in range(0,height):
①____________
②____________
n3[x,y]=img[x,y]
n4[x,y]=img[x,y]
if y%10==0:
     ③____________
if x%10==0:
     ④____________
#显示图像,代码略
听课笔记:                                    
                                    
                                    
                                    
变式训练3 现有一幅文件名为“车牌.jpg”的彩色图像,车牌底色为蓝色,如图a所示,通过Python程序对该图像进行二值化,即将车牌蓝色部分变为白色,其他全部变为黑色,如图b所示,以凸显出车牌的轮廓。程序代码如下,请在划线处填入合适的代码。
     图a          图b
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt #获取车牌蓝色的RGB分量的边界,红色rl,r2,绿色gl,g2,蓝色
b1,b2。代码略
img =np.array(Image.open(″①________″)) #打开图片并将其像素矩阵存入img
rows, cols = img.shape[0],img.shape[1]
imgnew = np.zeros(shape=(rows,cols))
# imgnew用于存储结果图像,大小和 img相同
for i in range(rows):
for j in range(cols):
r,g,b=img[i,j] #获取img当前位置的r,g,b分量
if r1<=r<=r2 and g1<=g<=g2 and b1<=b<=b2:
    imgnew[i,j]=1 #将新矩阵该位置设为白色
else:
    ②________
plt.figure('车牌')
plt.imshow(imgnew, cmap='gray')
plt.axis('off')
plt.show()
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.有如下Pyhton程序段:
def gcd(a,b):
  c = a%b
  while c > 0:
    a,b = b,c
    c=a%b
  return b
a=int(input("请输入:"))
b=int(input("请输入:"))
gcd = gcd(a,b)
scm = a * b ∥ gcd
print( gcd,scm)
运行该程序,输入a,b的值分别为16,12,则输出gcd,scm的值分别为 (  )
A.4 48 B.48 4 C.2 12 D.12 2
3.有如下Pyhon程序段:
def sel(a,b,c):
  if a    a+=b;b=a-b;a=a-b
  if a    t=a;a=c;c=t
  print(a,b,c)
sel(1,2,3)
执行该程序段后,输出的结果是 (  )
A.1,2,3 B.3,2,1 C.3,1,2 D.1,3,2
4.有Python的程序代码如下:
def change_c(s):
  if "a"<=s<="z":
    s = chr(ord(s)-32)
  return s
ss = input("请输入一串英文字母:")
n = len(ss)
ans = ""
for i in range(n):
  c = change_c(ss[i])
  ans = c + ans #①
print(ans)
现执行该程序,输入"abcDEF",下列说法正确的是 (  )
A.函数change_c()被调用了3次
B.函数change_c()的功能是将小写字母变成大写字母
C.输出的内容为"ABCDEF"
D.将①所在语句改为“ans+=c”程序功能不变
5.有如下Python程序段:
import turtle as tt
t=tt.Pen() #导入海龟,定义画笔t
import random
tt.bgcolor("white")
colors=["red","green","blue","yellow"]
for x in range(100):
  t.pencolor(colors[x%random.randint(1,4)]) #设置画笔的颜色
  t.circle(x) #画半径是x像素的圆
  t.left(91) #画笔方向逆时针旋转91度
关于该程序段,下列说法正确的是 (  )
A.程序运行后,绘制了100个同心圆
B.程序运行后,绘制的所有圆的颜色不可能都为红色
C.程序运行后,最后绘制的一个圆的颜色可能为黄色
D.程序运行后,绘制的各圆没有交点
6.某Python程序段如下:
def isprime(x):
  for i in range(2,x):
    if x % i ==0:
      return False
  return True
prime =[]
for i in range(2,21):
  if isprime(i):
    prime.append(i) #将 i 添加到列表
print(len(prime))
运行该程序段,输出结果是     。
7.技术学科一共包含2门学科——信息技术和通用技术,这就需要我们关注学科的平衡,而衡量某位学生学科平衡的重要指标就是学科吻合度,采用信息技术与通用技术的得分差来判断[分差每3分为一级:分差0到3分(不含3分),表示“0级偏差”;分差3到6分(不含6分),表示“1级偏差”,分差6到9分(不含9分),表示“2级偏差”……分差最高为50分,最后一级分差48到50(含50分),表示“16级偏差”],计算每位学生的吻合度偏差值。根据题意,请回答下列问题:
(1)(多选)为了后续程序处理,需要把数据读入到程序,每个学生一条记录,用Python存储学生测试得分数据,下列可行的是(以前两条记录为例)    (填字母)。
A.students=[[0901,50,32],[0902,50,45],……]
B.students={'0901':['50','32'],'0902':['50','45'],……}
C.students={0901:['50','32'],0902:['50','45'],……}
D.students=[['0901','50','32'],['0902','50','45'],……]
(2)编写函数f(xx,ty)实现传入信息得分和通用得分,返回吻合度级别    (返回示例:'1级偏差')。
(3)完成程序填空:
students={'0901':[50,82],'0902':[50,95],……}#(以前两条记录为例)
for i in students.keys():
  xx=①     
  ty=②     
  print(i,':',f(xx,ty))

展开更多......

收起↑

资源列表