第5章〓函数 学习目标  掌握函数的调用过程。  掌握函数参数传递的方法。  理解局部变量和全局变量的区别。  掌握datetime模块的用法。 扫一扫 视频讲解 5.1函数调用 5.1.1函数的含义 函数由一段代码构成,通常这段代码具有一定的功能,且可以被另一段程序调用。例如,排序函数,函数的功能可以将几个数以从小到大或从大到小的顺序排列。在一个工程里,可以包含若干程序模块,每个模块包含一个或多个函数,每个函数实现一个特定的功能。主函数调用其他函数,其他函数之间也可以互相调用。同一个函数可以被一个或多个函数调用任意次。函数的使用能提高程序应用的模块性和代码的复用性。函数的定义形式如下。 def <函数名>(<参数列表>): <函数体> return <返回值列表> 具体说明如下。 (1) 保留字def用于定义函数; 函数名要符合标识符的命名规则; 小括号中包含的是形式参数,多个参数用逗号隔开,参数可以为空; 第一行以冒号结尾。 (2) 函数体相对于def 要有缩进。 (3) return语句将返回值带回调用函数。 5.1.2函数的调用过程 1. 形参与实参 函数名后面的小括号中,一般包含参数,参数可以为空。当一个函数调用另一个函数时,调用函数中的参数称为实参,被调用函数中的参数称为形参。实参: 调用函数的函数名后面小括号中的参数。形参: 定义函数时,函数名后面的小括号中的参数。具体示例如下。 def area(width, height): # width, height为形参 z=width * height return z w, h =6,5 print("面积:",area(w, h))# w, h为实参 2. 函数调用 从用户使用角度看,函数可以分为标准函数和用户自定义函数。从函数的形式划分,函数可分为无参函数和有参函数。 (1) 无参函数的调用。 有的函数仅实现一定的功能,如输出字符串,这时无须指定参数。 【例5.1】利用函数调用实现输出字符串Hello,world!。 def myfun( ) : print("Hello,world!") myfun( ) #运行结果 Hello,world! (2) 有参函数的调用。 有参函数的调用将在5.1.3节中详细介绍,这里通过例5.2~例5.4简单说明函数调用的过程。 【例5.2】使用函数调用实现求矩形的面积。 1. def area(width, height): #函数定义 2. z=width * height 3. return z 4. w,h =6,5 5. print("面积:",area(w, h)) #函数调用 在例5.2中,第1~3行,定义了函数area(width, height),包含两个参数宽和高(width,height),函数功能为求矩形的面积,return语句将z值返回赋给area(w, h),即area(w, h)的函数值等于z值。第4行中的w和h代表矩形的宽和高,分别被赋值6和5。第5行在输出矩形面积时,发生了函数调用,实参为w和h。 ① 在area(w,h)调用函数时,实参w和h的值分别传送给形参width和height,如图5.1所示。 ② 变量z的值为矩形的面积,return z 是将z的值作为函数返回值赋值给调用它的函数area(w,h),即z的值就是area(w,h)的函数值,如图5.2所示。 (3) return语句。 return 带回返回值。无表达式的return相当于返回 None,函数只是完成一定的功能,没有返回值。这时,return可以省略不写。 图5.1值传递 图5.2返回值 【例5.3】利用函数调用实现输出字符串。 def printstr( str ): print (str) return printstr("第一次调用") printstr("第二次调用") #运行结果 第一次调用 第二次调用 【例5.4】利用函数调用实现求两个数的和。 def sum( a, b): total = a+ b print ("函数内 : ", total) return total total = sum( 10, 20 ) print ("函数外 : ", total) #运行结果 函数内 : 30 函数外 : 30 语句total=sum(10,20)调用sum()函数时,实参10和20分别赋值给形参a和b。在被调用函数内输出求和结果为30,语句return total将变量total的值返回并赋给sum(10,20),所以在函数外的输出结果也是30。 扫一扫 视频讲解 5.1.3参数传递 在 Python 中,变量没有类型,变量仅是一个对象的引用。例如,a可以指向List类型的对象,也可以是指向String 类型的对象,关于对象的概念将在第6章中详细介绍。 a=[1,2,3] a="hello" 1. 不可变类型参数 字符串、元组和数字类型均属于不可变数据类型,不可变数据类型的特点是一旦创建,其中的元素不能再改变,因为改变值时,会重新分配内存空间,例如,a=3,当a的值变成5时,则重新为5分配内存空间。 【例5.5】整数类型的参数传递。 图5.3变量赋值过程 整数类型属于数字类型,例如,存在一个int类型的对象2和指向它的变量b,在函数调用时,实参b的地址传给形参a,a也指向int型对象2。在定义的函数中,执行语句a=10,则系统为10分配新的内存空间,并让a指向它,类似把贴在2上的小便签a撕下来贴到10上,变量赋值过程如图5.3所示。用函数id()查看变量地址,不难看出a=10前后的两条print()输出的地址是不同的。 2. 可变类型参数 参数为可变数据类型,如 list、集合、字典等。例5.6以列表作函数参数实现两个变量之间的交换。 图5.4变量交换 【例5.6】列表内两个变量的交换。 本例中实参与形参同名,调用函数为swap(),ls[0]和ls[1]的值分别为1和2。在发生函数调用时,swap()函数中ls[0]与ls[1]中的地址进行了交换,类似交换了小便签,因此ls[0]和ls[1]的值分别为2和1,如图5.4所示。 def swap(ls): ls[1],ls[0]=ls[0],ls[1] ls=[1,2] swap(ls) print(ls) #运行结果 [2, 1] 3. 一致性 函数调用时,参数必须和声明时对应一致。例如,以下代码中发生函数调用时,函数printstr()中无参数,而被调用函数中含有一个参数str1,实参与形参不一致,运行程序时会报错。 def printstr(str1): print(str1) return printstr( ) Traceback (most recent call last): File "", line 5, in printstr( ) TypeError: printstr( ) missing 1 required positional argument: 'str1' 5.1.4常见的函数参数 Python语言中,函数的参数类型除了可变类型和不可变类型的参数 外,常用的还有关键字参数、默认参数和不定长参数。 1. 关键字参数 关键字参数是用名称指定的参数。当参数较多时,使用关键字参数有利于标记各个参数的作用,实参顺序不必与形参顺序完全一致。在例5.7的示例二中,函数print_info(age=20, name="John")中包含实参age和name,与定义函数时的参数name,age顺序不同,但由于使用了名称指定参数,所以输出的是与实参对应的值。 【例5.7】关键字参数传递。 #示例一 def printstr( str ): print (str) return printstr( str = "关键字参数") #运行结果 关键字参数 #示例二 def print_info( name, age ): print ("名字: ", name) print ("年龄: ", age) return print_info( age=20, name="John" ) #运行结果 名字: John 年龄: 20 2. 默认参数 调用函数时,如果没有传递参数,则会使用默认参数。在例5.8中,第二次发生函数调用时,print_info(name="John") 函数中只有一个实参,而函数print_info(name,age=25)中有两个形参,在参数传递时,缺少的参数默认使用形参的参数age,值为25。 【例5.8】输出学生的年龄与姓名。 def print_info( name, age = 25 ): print ("名字: ", name) print ("年龄: ", age) return print_info( age=30, name="John" ) print( ) #输出空行 print_info( name="John" ) #age使用默认参数 #运行结果 名字: John 年龄: 30 名字: John 年龄: 25 3. 不定长参数 当需要函数处理比声明中更多的参数时,需要在参数前加星号(*),这种参数称为不定长参数,也称为可变长参数,主要有两种形式: *变量和**变量。 (1) *变量。 在函数调用时,带星号(*)的参数对应实参多余的值,实参放入一个元组中赋值给形参。如果没有指定实参,不定长参数则为一个空元组。 【例5.9】不定长参数传递的用法。 在下面示例一中,实参值10传递给形参变量a,剩下的20,30形成元组(20,30)赋值给形参p。示例二中,'Params:'赋值给形参title,元组(10,20,30)赋值给形参p。 #示例一 def star( a, *p ): print ("输出: ") print (a) print (p) star( 10,20, 30 ) #运行结果 10 (20, 30) #示例二 def print_params(title, *p): print(title) print(p) print_params('Params:', 10, 20, 30) #运行结果 Params: (10, 20, 30) 带星号的参数如果不是放在最后,需要使用名称指定后续参数。下面代码中,实参10赋值给x,调用函数star()中的实参z值为9与形参z对应,实参中剩余的元素组成元组(20, 30, 40, 50)赋值给形参*y。 def star(x, *y, z): print(x, y, z) star(10, 20, 30, 40, 50, z=9) #运行结果 10 (20, 30, 40, 50) 9 如果单独出现星号(*),则星号后的参数必须用关键字参数传入。在下面的代码中,*号后面的形参c需要用关键字参数传入,即实参c的值3传递给形参c。 def f(a,b,*,c): return a+b+c f(1,2,c=3) (2) **变量。 加了两个星号 (**) 的参数以字典的形式传入实参。例如: def star( a, **p): print ("输出: ") print (a) print (p) star(1, x=2,y=3) 输出: #运行结果 1 {'x': 2, 'y': 3} 其中实参1赋值给形参a,实参x和y则以字典的形式传递给有两个星号的形参p。 (3) 混合使用。 当几种参数同时出现时,参数传递方法与(1)、(2)中分析类似,如下面代码所示。1、2、3对应赋值给x、y、z,同时关键字参数a和b以字典的形式赋值给形参k。形参p是带星号的不定长参数,则调用函数comb()中剩余值组成的元组(5,6,7)赋值给形参p。 def comb(x, y, z, *p, **k): print(x, y, z) print(p) print(k) comb(1, 2, 3, 5, 6, 7, a=1, b=2) #运行结果 1 2 3 (5, 6, 7) {'a': 1, 'b': 2} 在应用中,经常出现参数*args和**kwargs,这两个参数的用法与可变参数传递同理。*args一般放在**kwargs前面。args为元组类型,kwargs为字典类型。 #示例一 def test_args(a, *args): print(a) print(type(args)) print(args) test_args(8, 2, 6, 7) #运行结果 8 (2, 6, 7) #示例二 def test_kwargs(a, *args, **kwargs): print(a) print(args) print(kwargs) print(type(kwargs)) test_kwargs(8, 2, 6, 7, b=3, c=4) #运行结果 8 (2, 6, 7) {'b': 3, 'c': 4} 扫一扫 视频讲解 5.1.5匿名函数 Python中使用保留字lambda创建匿名函数,匿名函数不使用标准的def 定义函数,匿名函数的函数体比def定义函数简洁,常用lambda表达式的形式,格式如下。 lambda [arg1 [,arg2,…argn]]:表达式 其中arg1,arg2,…,argn为可选参数,冒号右边为参数的表达式。 【例5.10】利用lambda表达式求和。 在sum(10, 20)调用函数时,10和20分别传递给lambda后的形参a和b,并把求和结果a+b赋值给变量sum。 sum = lambda a, b: a+b # 调用sum函数 print ("sum= ", sum( 10, 20 )) #运行结果 sum=30 5.1.6递归调用 递归的含义是在函数调用过程中,直接或间接地调用自身。 【例5.11】用函数递归调用求n!。 1. def fac(n): 2. if n<0: 3. print("n<0,data error") 4. elif n == 1 or n == 0: 5. f=1 6. else: 7. f=n*fac(n-1) 8. return f 9. 10. c=fac(4) 11. print("The result is {:.2f}".format(c)) 第1~8行定义函数fac(n),该函数的功能是求阶乘。第10行,实参为4,通过函数调用,参数传递给形参n,4>0则执行第7行,函数递归调用自身,如图5.5所示。返回值f,即第10行fac(4)函数返回值。 图5.5求n! 扫一扫 视频讲解 5.2局部变量与全局变量 局部变量为在函数内部定义的变量,只在函数内部起作用。如形参、实参以及函数内定义的仅在函数内使用的变量都属于局部变量。全局变量是在函数外部定义的变量,作用范围是从定义点到文件结束。 【例5.12】局部变量与全局变量的使用。 #示例一 n = 1#n是全局变量 def func(a, b): c = a * b #c是局部变量,a和b作为函数参数也是局部变量 return c s = func("knock~", 2) print(c) Traceback (most recent call last): File "", line 1, in print(c) NameError: name 'c' is not defined 因为变量c是局部变量,只在func()函数内起作用。程序在函数外部输出,所以出错。如果希望让func()函数将n当作全局变量,需要在变量n使用前显式声明该变量为全局变量,见示例二。 #示例二 #n = 1#n是全局变量 def func(a, b): global n n = b #将局部变量b赋值给全局变量n return a*b s = func("knock~", 2) print(s, n) knock~knock~ 2 如果将global n这一行去掉,而将n在函数外部赋值,令n=1再运行,分析运行结果。 5.3多文件函数调用 在一个工程中常包含多个.py文件,不同文件中的函数可以互相调用。下面举例说明同一文件夹下的两个py文件间的函数调用。不同文件夹下的py文件也可以进行函数调用。 【例5.13】求矩形的面积,要求file2调用file1中的面积函数。 #file1.py def area(x,y): print('面积为:',(x*y)) #file2.py import file1 file1.area(3,4) #运行结果 面积为: 12 新建一个工程MultiFiles, 工程下建两个源文件file1.py和file2.py。在file1中定义矩形面积函数area(x,y),在file2中用import导入file1。然后,在file2.py中调用file1.py,实参为3,4,对应的x=3,y=4,执行area(x,y)函数,输出结果。file2.py也可以写成: from file1 import area area(3,4) 扫一扫 视频讲解 5.4math与random库 5.4.1math库 math库中包含的数学函数不适用于复数,如果需要计算复数,使用cmath模块中的同名函数。除特别说明外,所有函数返回值均为浮点数。内置常用运算函数如表5.1所示,详细的math库函数见附录B。 加载math库,使用语句为import math; 导入某一个具体的函数,如导入开平方函数,使用语句为from math import sqrt。这两种用法略有不同。 import math math.sqrt(25) from math import sqrt sqrt(25) 表5.1math库常用运算函数 函数数 学 表 示描述 math.fabs(x)|x|返回x的绝对值 math.sqrt(x)x返回x的平方根 math.factorial(x)x! 返回x的阶乘,如果x是小数或负数,返回ValueError math.ceil(x) x 向上取整,返回不小于x的最小整数 math.floor(x) x 向下取整,返回不大于x的最大整数 math.pow(x,y) xy 返回x的y次幂 math.exp(x) ex 返回e的x次幂 【例5.14】利用math库函数计算,分步执行下列代码并查看结果。 import math as m m.pi m.exp(2) m.pow(2,3) m.sqrt(100) m.fabs(-9.18) m.factorial(5) m.floor(3.6) m.ceil(3.6) #运行结果 3.141592653589793 7.38905609893065 8.0 10.0 9.18 120 3 4 5.4.2random库 Python内置的random库主要用于产生各种分布的伪随机数序列。random库采用梅森旋转算法(Mersenne twister)生成伪随机数序列,可用于除随机性要求更高的加解密算法外的大多数工程应用中。 一般函数都是基于random.random()函数扩展而来的。使用表5.2中的函数时,需要导入random库,可用语句from random import * 导入。 表5.2常用的random库函数 函数描述 seed(a=None)初始化给定的随机数种子,默认为当前系统时间 random()生成一个[0.0,1.0)的随机小数 randint(a,b)生成一个[a,b]的整数 randrange(m,n[,k])生成一个[m,n)以k为步长的随机整数 getrandbits(k)生成一个k比特长的随机整数 uniform(a,b)生成一个[a,b]的随机小数 choice(seq)序列相关从序列中随机选择一个元素 shuffle(seq)序列相关将序列seq中元素随机排列,返回打乱后的序列 【例5.15】生成随机数。 from random import * #导入random库 random( ) #生成随机数 Out[1]: 0.983090336696193 uniform(1,10) Out[2]: 9.088254313590586 randrange(0,50,2) Out[3]: 46 choice(range(100)) Out[4]: 68 ls = list(range(10)) shuffle(ls) print(ls) Out[5]: [5, 8, 6, 7, 9, 4, 0, 1, 3, 2] seed()函数: 指定随机数种子,随机种子一般是一个整数,只要种子相同,每次生成的随机数序列也相同。 seed(125) #随机种子赋值125 "{}.{}.{}".format(randint(1,10),randint(1,10),randint(1,10)) Out[1]: '4.4.10' seed(125) #随机种子仍然是125,生成随机数同上 "{}.{}.{}".format(randint(1,10),randint(1,10),randint(1,10)) Out[2]: '4.4.10' seed( ) "{}.{}.{}".format(randint(1,10),randint(1,10),randint(1,10)) Out[3]: '7.5.10' 扫一扫 视频讲解 5.5datetime库 datetime库是Python语言用于时间处理的库,解决日期格式不统一的问题。这个库主要包含三个类: time、date与datetime。类和对象的概念详见6.1节的内容,这里不做详细介绍,仅介绍datetime库的基本用法。 time类主要包含一天内的小时、分、秒、毫秒信息。date类包含年、月、日。datetime类是前两者的结合。 5.5.1datetime类型转换 在处理日期数据时,通常需要将数据集中的日期字符串转换为指定格式。datetime.strptime()方法用于将日期字符串转换为datetime类型,常用于数据预处理中,具体用法如下。 datetime.strptime(date_string,format) ① date_string为日期字符串。 ② format为日期字符串的日期格式。 strptime()时间格式的表示符号由%与格式字符组成,含义如表5.3所示。 表5.3常用的datetime()库函数 函数说明函数说明 %y两位数的年份表示,区间为[00, 99]%B本地完整的月份名称 %Y四位数的年份表示,区间为[000, 9999]%c本地相应的日期表示和时间表示 %m月份 [0112]%j年内的一天 [001366] %d月内中的一天 [031]%p本地A.M.或P.M.的等价符 %H24小时制小时数 [023]%U一年中的星期数[0053],星期日为星期的开始 %I12小时制小时数 [0112]%w星期[06],星期日为星期的开始 %M分钟数 [0059]%W一年中的星期数[0053],星期一为星期的开始 %S秒 [0059]%x本地相应的日期表示 %a本地简化星期名称%X本地相应的时间表示 %A本地完整星期名称%Z当前时区的名称 %b本地简化的月份名称%%%本身 下面举例说明将日期字符串转换为datetime类型的方法。 【例5.16】将日期"2020/04/01"或"20200401"转换为datetime类型。 示例二的"20200401"中,四位的年、两位的月份和日期用“”分隔,两位的小时、分与秒用“:”分隔,如“20200401 23:04:07”。 #示例一 import datetime as d date1="2020/04/01" format1="%Y/%m/%d" t1=d.datetime.strptime(date1,format1) t1 Out[1]: datetime.datetime(2020, 4, 1, 0, 0) #示例二 import datetime as d date2="2020-04-01 23:04:07" format2="%Y-%m-%d %H:%M:%S" t2=d.datetime.strptime(date2,format2) t2 Out[2]: datetime.datetime(2020, 4, 1, 23, 4, 7) 5.5.2datetime对象的属性 1. 获取时间信息 datetime对象的属性,可以用于截取给定时间中的年、月、日以及具体时间等,见表5.4。 表5.4datetime对象的属性 属性含义 datetime.year年 datetime.month月 datetime.day 日 datetime.hour 小时 datetime.minute 分 datetime.second 秒 datetime.microsecond 毫秒 【例5.17】使用datetime.hour得到对应日期中的小时。 import datetime as d date3="20-01-05 23:00" format3="%y-%m-%d %H:%M" t3=d.datetime.strptime(date3,format3) print(t3.hour) #运行结果 23 【例5.18】利用datetime()方法计算时间差。 t1=d.datetime(2020,4,1,23,0) t2=d.datetime(2019,4,1,22,0) print(t1-t2) #运行结果 366 days, 1:00:00 datetime对象一般不做加法运算,因为没有实际意义。 2. isoweekday()方法与datetime.now()方法 (1) isoweekday()方法。 利用isoweekday()方法可以直接查看日期对象是星期几。 import datetime as d newsTime='Sun, 23 Aug 2020 05:15:05' GMT_FORMAT = '%a, %d %b %Y %H:%M:%S' newsTime=d.datetime.strptime(newsTime,GMT_FORMAT) print(newsTime.isoweekday( )) #运行结果 7 (2) datetime.now()方法。 利用datetime.now()方法可以获得当前日期和系统时间。 【例5.19】通过datetime.now()方法计算系统时间差。 第一次系统时间的输出结果为datetime.datetime(2021,8,23,23,12,23,596904)括号中对应为年、月、日、小时、分、秒、毫秒。同理,求出第二次系统时间,两次系统时间做差。 import datetime dt1=datetime.datetime.now( ) dt1 Out[1]: datetime.datetime(2021, 8, 23, 23, 12, 23, 596904) dt2=datetime.datetime.now( ) dt2 Out[2]: datetime.datetime(2021, 8, 23, 23, 12, 32, 977437) print (dt2-dt1) #运行结果 0:00:09.380533 5.5.3date类 date类有三个参数: 年、月、日,datetime.date(year,month,day)返回为yearmonthday。例如: import datetime as d date3="20-01-05 23:00" format3="%y-%m-%d %H:%M" t3=d.datetime.strptime(date3,format3) print(t3.date( )) #运行结果 2020-01-05 利用这个属性,可以对日期数据进行批量处理,例如,把一批数据中日期在同一年的挑选出来。 5.6实例 【例5.20】求Cmn的值。 1. def fac(x): 2. t=1 3. for i in range(1,x+1): 4. t=t*i 5. return t 6. 7. n,m=map(int,input("please input n,m:").split(",")) 8. c=fac(n)/(fac(m)*fac(n-m)) 9. print("The result is {:.2f}".format(c)) 第1~5行,定义的函数fac(x)功能为求阶乘。第8行语句中发生了3次函数调用,第一次函数调用的返回值t的值是fac(n)函数值,其余两次函数调用类似。第9行,输出的c值保留2位小数。 【例5.21】在一行中任意输入10个数,输出这10个数中的最大值。 split()函数默认用空格分隔数据。max()函数可用于求列表元素最大值。首先,输入10个数保存在列表变量n中,创建空列表list1。然后,用i遍历列表n并把取出的列表元素添加到列表list1中。最后,用max()函数求出列表list1中的最大值。 n = input( ) list1 = [] for i in n.split( ): list1.append(int(i)) print(max(list1)) # max( )函数可用于求列表元素最大值 【例5.22】有两个源文件file1和file3存在于不同路径,用函数调用实现求矩形面积。 #file1.py def area(x,y): print('面积为:',(x*y)) #file3.py import file1 import sys sys.path.append('F:/file1.py') file1.area(3,4) 用import导入模块时,Python语言是在sys.path中按顺序查找路径,因此需要将file1的路径添加到sys.path。 5.7习题 一、 单选题 1. 关于Python的全局变量和局部变量,以下选项中描述错误的是()。 A. 局部变量指在函数内部使用的变量,当函数退出时,变量依然存在,下次函数调用可以继续使用 B. 使用global保留字声明简单数据类型变量后,该变量作为全局变量使用 C. 简单数据类型变量无论是否与全局变量重名,仅在函数内部创建和使用,函数退出后变量被释放 D. 全局变量指在函数之外定义的变量,一般没有缩进,在程序执行的全过程中有效 2. 以下选项中,不属于函数作用的是()。 A. 复用代码B. 增强代码可读性 C. 降低编程复杂度 D. 提高代码执行速度 3. 在Python语言中,关于函数的描述,以下选项中正确的是()。 A. return语句后可以没有返回值 B. Python函数定义中必须有参数 C. 一个函数中只允许有一条return语句 D. def和return是函数必须使用的保留字 4. 关于形参和实参的描述,以下选项中正确的是()。 A. 程序在调用时,将形参复制给函数的实参 B. 参数列表中给出要传入函数内部的参数,这类参数称为形式参数,简称形参 C. 函数定义中参数列表里面的参数是实际参数,简称实参 D. 多个参数之间用空格隔开 5. 关于lambda函数,以下选项中描述错误的是()。 A. lambda不是Python的保留字 B. lambda函数定义了一种特殊的函数 C. lambda函数也称为匿名函数 D. lambda函数有返回值 6. 导入模块的方式错误的是()。 A. import mathB. from math import * C. import math as mD. import m from math 7. 以下程序中,输出结果不可能是()。 from random import * print(round(random(),2)) A. 0.57B. 0.14 C. 0.97 D. 1.33 8. Python语言中,函数不包括()。 A. 标准函数B. 第三库函数C. 内建函数D. 参数函数 9. Python语言中,函数定义可以不包括()。 A. 函数名B. 关键字 def C. 一对圆括号D. 可选参数列表 10. 以下程序的输出结果是()。 def func(num): num *= 2 x = 20 func(x) print(x) A. 40 B. 出错 C. 无输出 D. 20 二、 填空题 1. Python语言中,用于定义函数的关键字是。 2. Python标准库math中,用于计算平方根的函数是。 3. Python内置函数用于返回序列中的最大元素。 4. Python内置函数用于返回序列中的最小元素。 5. Python内置函数用于返回数值型序列中所有元素之和。 三、 编程题 1. 自定义函数,求两个数的最大值。 2. 自定义lambda函数,求两个数的最小值。 3. 编程实现: 输出当前的系统时间。 4. 自定义函数,判断传入的字符参数是否为“回文”。 5. 自定义函数,计算n的阶乘(非递归)。 6. 自定义函数,计算n的阶乘(递归)。 7. 自定义函数,计算1~n的累加和。 8. 自定义函数,计算任意给定数的累加和(提示: 使用不定长参数)。 9. 编写函数,判断一个数字是否为素数,是则返回字符串YES,否则返回字符串NO,并用数字29与12进行验证。 10. 编写程序,实现将列表ls中的素数删除并输出删除素数后列表的元素个数,ls = [23,45,78,87,11,67,89,13,243,56,67,311,431,111,141]。 11. 编程实现: 计算两个日期之间的天数,输入日期的格式为2020/12/1。 12. 编程实现: 获取系统日期,并计算该日期是所在年份的第几天。 13. 自定义函数,实现输入一行字符,分别统计其中英文字母、空格、数字和其他字符的个数。 14. 自定义函数,求m和n的最大公约数。 15. 编程实现: 以123 为随机数种子,随机生成10个1~999(含999)的随机数,以逗号分隔并输出。 16. 用递归方式求解1~100的累加和。 17. 求1!+2!+3!+…+n!,要求在文件f1.py中定义求阶乘的函数,在文件f2.py中求阶乘的累加和,求阶乘时需调用f1.py中的函数。 四、 简答题 1. 简述普通参数、关键字参数、默认参数、不定长参数的区别。 2. 简述定义函数的规则。 3. 简述在Python语言中生成随机数的方法。