内容正文:
第10课 函数与模块
第三章│算法的程序实现
——3.2 Python语言程序设计,教材第90~96页
新课程目标
1.能够设计运用自定义函数。 2.掌握并能运用常见的模块。
目录
CONTENTS
教材整体感悟 知本与探源
01
02
命题整体感知 尝试与研析
01
教材整体感悟 知本与探源
教材整体感悟 知本与探源
1.函数的构造及应用
定义函数的语法:
def 函数名(参数集合):
<函数体>
[return 函数值]
def:关键字,定义声明;参数集合:调用函数所需要传入的参数;return:返回,返回函数执行后的结果。
教材整体感悟 知本与探源
例如:def add(a,b):
c=a+b
return c
教材整体感悟 知本与探源
2.Python常见模块
Python包括了大量的模块,它们的功能涉及系统管理、科学计算、图形处理等各个领域。比如,用于实现部分操作系统功能的os模块,与时间处理有关的time模块,可以实现科学计算、数据可视化的numpy和matplotlib,用于多媒体开发和游戏软件开发的pygame模块,支持图形处理的tkinter等。
(1)模块导入
方法一:import语句
教材整体感悟 知本与探源
import <模块1>,<模块2>,<模块3>
导入某个模块,就可以引用它的所有公共函数,故该方式调用模块中函数的形式如下:
<模块名>.<函数名>
方法二:from——import语句
from <模块名> import <函数名>
导入某个模块中的特定函数,建立一个指向该函数的引用,故该方式
教材整体感悟 知本与探源
调用函数的形式如下:
<函数名>
(2)math模块
名称 含义
math.e 自然常数e
math.pi 圆周率π
math.ceil(x) 对x向上取整,比如math.ceil(1.3)=2
math.floor(x) 对x向下取整,比如math.floor(1.3)=1
math.pow(x,y) 指数运算,得到x的y次方,比如math.pow(2,3)=8
math.log(x) 对数运算,默认基底为e
math.sin(x) 正弦函数
math.cos(x) 余弦函数
math.tan(x) 正切函数
math.degrees(x) 弧度转换成角度
math.radians(x) 角度转换成弧度
教材整体感悟 知本与探源
注意:ceil()、floor()、int() 的对比
ceil(1.5)=2 floor(1.5)=1 int(1.5)=1
ceil(-1.5)=-1 floor(-1.5)=-2 int(-1.5)=-1
ceil():_____________ floor():____________ int():____________
(3)random模块
向上取整
向下取整
截取整数
名称 含义
random.random() 随机生成一个[0,1)范围内的实数
random.uniform(a,b) 随机生成一个[a,b]范围内的实数
random.randint(a,b) 随机生成一个[a,b]范围内的整数
random.choice(seq) 从序列的元素中随机挑选一个元素
random.sample(seq,k) 从序列中随机挑选k个元素
random.shuffle(seq) 将序列的所有元素随机排序
教材整体感悟 知本与探源
例如:import random #导入random模块
a=random.random()*10 #a为[0,10)范围内的某个实数
b=random.uniform(0,10) #b为[0,10]范围内的某个实数
c=random.randint(0,10) #c为[0,10]范围内的某个整数
random.choice(range(10)) #从[0,9]中随机挑选一个整数
random.sample(range(10),3) #从[0,9]中随机挑选三个整数
d=[0,1,2,3,4]
教材整体感悟 知本与探源
random.shuffle(d) #对整数序列d进行重新随机排序
(4)Image模块
Image模块是PIL库(Python Imaging Library )中的重要模块,引用它可以完成对图像的一些常用操作,比如获取图像尺寸和像素颜色、旋转图像或改变图像格式等。
numpy模块可以将图像每个像素的RGB值以矩阵形式存储。
matplotlib模块可以根据调整后的像素生成新的图像。
教材整体感悟 知本与探源
①导入模块。
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
②打开图像并转换成数字矩阵。
img=np.array(Image.open('lena.jpg').convert('L'))
③调整每个像素的值。
教材整体感悟 知本与探源
rows,cols=img.shape #图像尺寸分别赋值
for i in range(rows): #依次取每个像素的坐标
for j in range(cols):
if (img[i,j]>128): #像素值大于128,赋值为1,否则为0
img[i,j]=1
else:
img[i,j]=0
教材整体感悟 知本与探源
④生成新的图像并显示。
plt.figure('lena') #指定当前绘图对象
plt.imshow(img,cmap='gray') #显示灰度图像
plt.axis('off') #关闭图像坐标
plt.show() #弹出包含了图片的窗口
教材整体感悟 知本与探源
1.函数调用
(1)函数调用时参数传递的方法:
①按位置依次传递:按照函数声明时的参数原有顺序依次进行参数传递。如Area(3,4,5)。
教材整体感悟 知本与探源
②参数赋值:通过赋值语句实现参数传递(可突破原有顺序)。如Area(b=4,c=5,a=3)。
(2)形式参数、实际参数
形式参数:函数定义时,用来接收调用该函数时传入的参数。
实际参数:函数调用时,实际传递给函数的参数。
2.递归:就是在函数运行的过程中不断地调用自己。递归有两个过程,简单地说,一个是递的过程,另一个是归的过程。
02
命题整体感知 尝试与研析
命题整体感知 尝试与研析
例1有如下Python程序段,执行该程序段后,输出的结果是5,则对应s中的元素是( )
import math
s=[int(3.8),math.floor(4.4),round(4.5),math.ceil(4.2)]
print(max(s))
A.int(3.8) B.math.floor(4.4)
C.round(4.5) D.math.ceil(4.2)
D
命题整体感知 尝试与研析
【解析】 选项A,int()截取整数部分,结果为3;选项B,floor()向下取整,结果为4;选项C,round()求圆整数,结果为4;选项D,ceil()向上取整,结果为5,选项符合题意。
命题整体感知 尝试与研析
例2下列表达式能够生成[10,99]范围内的随机整数的是( )
A.random.randint(10,100)
B.random.choice(range(10,99))
C.int(random.random()* 89)+10
D.int(random.random()* 90)+10
D
命题整体感知 尝试与研析
【解析】 选项A,random.randint(10,100) 产生[10,100]范围内的任意一个整数;选项B,random.choice(range(10,99)) 随机在[10,98]范围内选择一个整数;选项C,int(random.random()*89)+10 随机产生在[10,98]范围内的任意一个整数,选项D符合题意。
命题整体感知 尝试与研析
变式1[2024·艾青中学检测]下列表达式计算结果一定为True 的是( )
A.int(-3.5678)==-4
B.chr((ord(”B”)-70)%26+65)==”Q”
C.0<=int(random.random*10)<10
D.(not a and not b)==(not a or b)
C
命题整体感知 尝试与研析
【解析】 选项A,int()函数的功能为取整(取整数部分),转化为-3==-4,结果为False;选项B,chr((ord(”B”)-70)%26+65)的功能为将字符”B”前移5 位,转换为”W”,结果为False;选项C,random.random()随机生成一个[0,1)的数,int(random.random()*10)取值范围为[0,9]的整数,结果为True;选项D,not a and not b 等价于not (a or b),原表达式结果为False。
命题整体感知 尝试与研析
变式2脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成。构成 DNA 的碱基共有 4 种,分别为腺嘌呤(A)、鸟嘌呤(G)、胸腺嘧啶(T)和胞嘧啶(C)。在两条互补碱基链的对应位置上,A 总是和 T 配对,G 总是和 C 配对。编写Python程序实现如下功能: 随机产生一条单链上的碱基序列,输出其对应的互补链上的碱基序列。程序中①、②处应填入的代码分别为( )
import random
DNA=['A','G','T','C']
B
命题整体感知 尝试与研析
s=”
for i in range(20):
①________________
print(s)
match={'A':'T','T':'A','G':'C','C':'G'}
t=”
for i in range(20):
命题整体感知 尝试与研析
②______________
print('互补链: ',t)
A.①s=random.choice()+s ②t=t+match[i]
B.①s=s+random.choice(DNA) ②t=t+match[s[i]]
C.①s=s+random.choice() ②t=t+match[s[i]]
D.①s=random.choice(DNA)+s ②t=t+match[i]
命题整体感知 尝试与研析
【解析】 随机产生第1条碱基链,choice()函数从序列的元素中随机挑选一个元素,需要有参数,选项A、C错误;利用字典进行匹配,字符串使用下标提取,选项B正确。
命题整体感知 尝试与研析
例3[2024·岱山中学检测]有如下Python 程序段:
def s(b):
n=b[0]
for i in b:
if i>n:
n=i
return n
命题整体感知 尝试与研析
a=[20,10,70,30]
print(s(a))
执行该程序段后,输出的结果是( )
A.10 B.20
C.30 D.70
【解析】 将列表a传递给函数s()中的列表b;在函数中遍历列表b查找最大值,存在变量n中,并返回,选项D正确。
D
命题整体感知 尝试与研析
变式1 有如下Python 程序段:
def fibres(n):
a,b=1,1
for i in range(n-1):
a,b=b,a+b
return a
print(fibres(9))
命题整体感知 尝试与研析
执行该程序段后,输出的结果是( )
A.21 B.34
C.55 D.89
【解析】 将9传递给函数fibres()中的n,循环实现了计算斐波那契数列中某一项的值,选项B正确。
B
命题整体感知 尝试与研析
变式2 有如下Python程序段:
def fun(a,b):
n=min(len(a),len(b))
for i in range(n):
if a[i]>b[i]:
return a
if a[i]<b[i]:
命题整体感知 尝试与研析
return b
if len(a)>len(b):
return a
else:
return b
print(fun(”123”,”23”))
执行该程序段后,输出的结果是( )
A.a B.b C.123 D.23
D
命题整体感知 尝试与研析
【解析】 在函数fun()中按顺序执行语句,先循环,再分支语句;在循环中逐个比较字符,a[0]<b[0]成立,执行return b,函数结束,选项D正确。
命题整体感知 尝试与研析
例4针对选考[2023·浙江6月选考]定义如下函数:
def f(a,s):
if a>=s:
return a
else:
return f(a+1,s-a)
执行语句k=f(6,21)后,k 的值为( )
A.6 B.7 C.8 D.9
C
命题整体感知 尝试与研析
【解析】 观察自定义函数f(a,s)可知:当参数a≥s 时(即递归结束条件),返回值为a;否则递归调用f(a+1,s-a)。执行语句k=f(6,21),模拟计算过程如下:第一次调用函数f(6,21);由于未达到递归结束条件,第二次调用函数f(7,15);未达到递归结束条件,第三次调用函数f(8,8),满足递归结束条件a≥s,返回值为a,得到答案8,选项C正确。
命题整体感知 尝试与研析
变式 针对选考有如下Python程序段:
def f(x):
if x==1 or x==2:
return 1
else:
return f(x-1)+f(x-2)
s=0
命题整体感知 尝试与研析
for i in range(2,6):
s+=f(i)
print(s)
执行该程序段后,变量s的值为( )
A.20 B.19 C.12 D.11
【解析】 本题的递归式是f(x)=f(x-1)+f(x-2),递归结束条件为:当x为1或2,返回值为1,即x从3开始,f(x)为前两项的和,循环中s对f(2)到f(5)进行求和,即s=1+2+3+5=11。选项D正确。
D
命题整体感知 尝试与研析
例5[2024·台州一中检测]有如下Python 程序段,假设程序运行正常,选项A所示的图片是原始图片,则推测程序运行后得到的图片是( )
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
choicelist,choice=[50,128,188,255],256
for i in choicelist:
B
命题整体感知 尝试与研析
if i<choice:
choice=i
fn='tiger02.jpg'
img=np.array(Image.open(fn).convert('L'))
rows,cols=img.shape #图像尺寸分别赋值
for i in range(rows): #依次取每个像素的坐标
for j in range(cols):
命题整体感知 尝试与研析
if img[i,j]<=choice: #像素值小于或等于指定值的赋值为0,否则为1
img[i,j]=0
else:
img[i,j]=1
plt.figure(”tiger128”) #指定当前绘图对象
plt.imshow(img,cmap='gray') #显示灰度图像
plt.axis('off') #关闭图像坐标
命题整体感知 尝试与研析
plt.show() #弹出包含了图片的窗口
【解析】 第1个循环后choice为50,当img[i,j]<=50时,将像素值设置为0,选项B正确。
A. B. C. D.
命题整体感知 尝试与研析
例6有如下Python 程序段:
import random
a=[0]*6
i=0
while i<6:
a[i]=random.randint(1,5) #元素值在1 到5 之间
if a[i]%2!=i%2:
命题整体感知 尝试与研析
i-=1
elif i%2==1:
a[i]+=a[i-1]
i+=1
print(a)
执行该程序段后,a的值不可能的是( )
A.[2,3,4,5,2,5] B.[4,5,2,7,3,8]
C.[2,7,2,7,2,7] D.[4,9,4,7,2,5]
B
命题整体感知 尝试与研析
【解析】 由条件a[i]%2!=i%2和相关语句可知,i与 a[i]的奇偶性必须相同,否则i-1;接着判断i是否是奇数,如果是则当前a[i]的值加上前一项的值;选项B中a[4]=3,不符合要求,选项错误。
命题整体感知 尝试与研析
变式[2024·丽水中学检测]有如下Python程序段:
import random
a=[0]*6
a[0]=random.randint(1,5)
i=1
while i<6:
a[i]=a[i-1]+random.randint(1,5)
if i%2==0:
命题整体感知 尝试与研析
a[i]=a[i]+a[i]%2
else:
a[i]=a[i]//2
i+=1
print(a)
执行该程序段后,a的值可能是( )
A.[2,3,8,6,12,7] B.[2,1,2,3,3,4]
C.[4,5,6,4,8,6] D.[6,5,10,7,10,8]
A
命题整体感知 尝试与研析
【解析】 a[i]的初始值在上一个位置的值的基础上递增,由if的条件和语句可知,i为偶数时,a[i]的值必为偶数;i为奇数时,a[i]的值为原来的一半。选项B,a[4]=3,不符合要求,选项错误;选项C,a[1]=5,则原来的a[1]=10,由于a[0]=4,故无法实现,选项错误;选项D,a[5]=8,则原来的a[5]=16,由于a[4]=10,故无法实现,选项错误。
命题整体感知 尝试与研析
|随|堂|检|测|
1.下列语句不能产生[0,10]之间随机偶数的语句是( )
A.int(random.random()*5)*2
B.random.randint(0,5)*2
C.random.choice(range(0,11,2))
D.int(random.uniform(0.1,5.4))*2
【解析】 random.random()产生的区间为[0,1),取值可以为0,不能为1,故选项A无法产生10。
A
命题整体感知 尝试与研析
2.有如下Python程序段:
def outer(func):
print(func)
def foo(func):
print(”HelloWorld!”)
return 10
foo(outer(”HelloWorld!”))
命题整体感知 尝试与研析
outer(foo(”HelloWorld!”))
执行该程序段后,输出的结果是( )
A.HelloWorld!
HelloWorld!
HelloWorld!
10
B.HelloWorld!
HelloWorld!
10
HelloWorld!
A
命题整体感知 尝试与研析
C.HelloWorld!
10
HelloWorld!
HelloWorld!
【解析】 按顺序依次调用函数,在foo()函数中传递outer()函数,在outer()函数中传递foo()函数,选项A正确。
D.10
HelloWorld!
HelloWorld!
HelloWorld!
命题整体感知 尝试与研析
3.[2024·龙泉一中检测]有如下Python程序段:
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
命题整体感知 尝试与研析
【解析】 gcd()函数的作用是求解a和b的最大公约数,scm存储的是最小公倍数,选项A正确。
命题整体感知 尝试与研析
4.图1经过如下Python程序段处理后,效果如图2所示,小明发现处理后的图像的黑白颜色分布很不均衡。要想将图像处理成如图3所示的效果图,下列做法正确的是( )
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'))
图1 图2 图3
A
命题整体感知 尝试与研析
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”
命题整体感知 尝试与研析
【解析】 黑色值过多,需要将“img[i,j]>188”中的188调小,选项A正确。
命题整体感知 尝试与研析
5.针对选考[2024·新昌中学检测]有如下Python 程序段:
def peach(n):
if n==10:
return 1
else:
return (peach(n+1)+1)*2
print(peach(8))
命题整体感知 尝试与研析
执行该程序段后,输出的结果是( )
A.2 B.6
C.8 D.10
【解析】 “递”过程:peach(8)=(peach(9)+1)*2
peach(9)=(peach(10)+1)*2
“归”过程:peach(9)=(1+1)*2=4
peach(8)=(4+1)*2=10
选项D正确。
D
命题整体感知 尝试与研析
6.有如下Python程序段:
import random
sj=[0,0,0,0,0,0]
i=0
while i<6:
x=random.randint(1,50)
if i%2==0 or x>30:
命题整体感知 尝试与研析
sj[i]=x
i=i+1
执行该程序段后,列表sj的值不可能的是( )
A.[7,49,24,33,1,44]
B.[45,44,42,30,9,37]
C.[20,38,29,40,29,37]
D.[43,40,13,36,19,39]
B
命题整体感知 尝试与研析
【解析】 当i为偶数或产生的随机数大于30时,存入sj[i],否则重新产生。选项B中,a[3]=30,不符合要求,选项错误。
温馨提示:请完成高效作业10
感谢聆听,再见!
$$