一 测试题
第18讲:
1 函数文档和直接用“#”为函数写注释有什么不同?
给函数写文档是为了让别人可以更好的理解你的函数,所以这是一个好习惯:
>>> def MyFirstFunction(name): '函数文档在函数定义的最开头部分,用不记名字符串表示' print('I love FishC.com!')
我们看到在函数开头写下的字符串Ta是不会打印出来的,但Ta会作为函数的一部分存储起来,这个我们称之为函数文档字符串,Ta的功能跟注释是一样的。
函数的文档字符串可以按如下方式访问:
>>> MyFirstFunction.__doc__ '函数文档在函数定义的最开头部分,用不记名字符串表示'
另外,我们用help()来访问这个函数也可以看到这个文档字符串:
>>> help(MyFirstFunction) Help on function MyFirstFunction in module __main__: MyFirstFunction(name) 函数文档在函数定义的最开头部分,用不记名字符串表示
还可以用pydoc命令查看说明性文档,此时文档字符串也会被提取出来。
2 使用关键字参数,可以有效避免什么问题的出现呢?
关键字参数,是指函数在调用的时候,带上参数的名字去指定具体调用的是哪个参数,从而可以不用按照参数的顺序调用函数,例如:
>>> def SaySome(name, words): print(name + '->' + words) >>> SaySome(words='让编程改变世界!', name='小甲鱼')
使用关键字参数,可以有效避免因不小心搞乱参数的顺序导致的BUG出现。
3 使用help(print)查看print()这个BIF有哪些默认参数?分别起到什么作用?
1 >>> help(print) 2 Help on built-in function print in module builtins: 3 4 print(...) 5 print(value, ..., sep=' ', end=' ', file=sys.stdout, flush=False) 6 7 Prints the values to a stream, or to sys.stdout by default. 8 Optional keyword arguments: 9 file: a file-like object (stream); defaults to the current sys.stdout. 10 # 文件类型对象,默认是sys.stdout(标准输出流) 11 sep: string inserted between values, default a space. 12 # 第一个参数如果有多个值(第一个参数是收集参数),各个值之间默认用空格(space)隔开 13 end: string appended after the last value, default a newline. 14 # 打印最后一个值之后默认参数一个新行标识符(‘ ’) 15 flush: whether to forcibly flush the stream. 16 # 是否强制刷新流
4 默认参数和关键字参数表面最大的区别是什么?
关键字参数是在函数调用的时候,通过参数名制定需要赋值的参数,这样做就不怕因为搞不清参数的顺序而导致函数调用出错。而默认参数是在参数定义的过程中,为形参赋初值,当函数调用的时候,不传递实参,则默认使用形参的初始值代替。
第19讲:
1. 请问以下这个函数有返回值吗?
1 >>> def hello(): 2 print('Hello FishC!')
如果没有使用 return 语句指定返回值,Python 也不是什么都不返回的,Ta 会返回一个 None 对象,所以我们说 Python 所有的函数都有返回值。
2. 请问 Python 的 return 语句可以返回多个不同类型的值吗?
可以的,默认用逗号隔开,是以元组的形式返回,你当然也可以用列表包含起来返回
3. 目测以下程序会打印什么内容:
1 def fun(var): 2 var = 1314 3 print(var, end='') 4 5 var = 520 6 fun(var) 7 print(var)
1314520
4. 目测以下程序会打印什么内容?
1 var = ' Hi ' 2 3 def fun1(): 4 global var 5 var = ' Baby ' 6 return fun2(var) 7 8 def fun2(var): 9 var += 'I love you' 10 fun3(var) 11 return var 12 13 def fun3(var): 14 var = ' 小甲鱼 ' 15 16 print(fun1())
会打印:
Baby I love you
我以为会打印'小甲鱼'的,在第10行虽然调用的fun3(var),但fun3()并没有返回值,所以在fun2里面,return语句返回的var值即是’Baby I love you‘
二 编程题
第18讲:
1 编写一个符合以下要求的函数:
a) 计算打印所有参数的和乘以基数(base=3)的结果
b) 如果参数中最后一个参数为(base=5),则设定基数为5,基数不参与求和计算。
我的代码:
1 """编写一个符合以下要求的函数: 2 a) 计算打印所有参数的和乘以基数(base=3)的结果 3 b) 如果参数中最后一个参数为(base=5),则设定基数为5,基数不参与求和计算。 4 """ 5 def fun(a,b,c): 6 base = 3 7 if (c == 5): 8 base = 5 9 sum = base * (a + b) 10 print(f"最后一个参数为5的情况下,计算结果为:{sum}") 11 else: 12 sum = base * (a + b + c) 13 print(f"最后一个参数不为5的情况下,计算结果为:{sum}") 14 return 15 x = int(input("请输入第一个参数:")) 16 y = int(input("请输入第二个参数:")) 17 z = int(input("请输入第三个参数:")) 18 result = fun(x,y,z)
小甲鱼代码:
1 def mFun(*param, base=3): 2 result = 0 3 for each in param: 4 result += each 5 6 result *= base 7 8 print('结果是:', result) 9 10 mFun(1, 2, 3, 4, 5, base=5)
对比之下小甲鱼的代码比我的精简多了,而且我似乎理解题目方面没有理解清楚:我以为base是一个单独参加运算的变量,不用把它当作参数,并且没有想到用*param这种形式来让代码实现传入多个参数的功能,还是编程思维的问题吧,吸收经验。
2 寻找水仙花数
题目要求:如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数。例如153 = 1^3+5^3+3^3,因此153是一个水仙花数。编写一个程序,找出所有的水仙花数。
我的代码:
1 """如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数。 2 例如153 = 1^3+5^3+3^3,因此153是一个水仙花数。编写一个程序,找出所有的水仙花数。 3 """ 4 def flower(): 5 for each in range(100,1000): 6 num = each 7 a = num % 10 8 b = (num //10)%10 9 c = num // 100 10 sum = a**3 + b**3 + c**3 11 if num == sum: 12 print(f"{num}",end = " ") 13 print("") 14 print("所有的水仙花数分别是:",end = '') 15 flower()
小甲鱼的代码
1 def Narcissus(): 2 for each in range(100, 1000): 3 temp = each 4 sum = 0 5 while temp: 6 sum = sum + (temp%10) ** 3 7 temp = temp // 10 # 注意这里用地板除 8 if sum == each: 9 print(each, end=' ') 10 print("所有的水仙花数分别是:", end='') 11 Narcissus()
小甲鱼在计算各个位数的值得时候使用了while循环,代码比我的代码可能更加节省存储空间(我另外定义了三个变量,小甲鱼只用了一个),还有我在编程过程中犯了两个很致命的错误:
(1)直接使用each计算各个位对应的数字,导致程序虽然没有报错,但也没有任何输出结果,程序根本就没有被执行。
(2)应该用地板除“//”,我用了“/”,结果导致没有数据输出,即程序没有找到水仙花数——因为“/”得到的结果是浮点数,所以一定不会满足sum=num的条件,所以没有数据输出。
3 编写一个函数 findstr(),该函数统计一个长度为 2 的子字符串在另一个字符串中出现的次数。例如:假定输入的字符串为“You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.”,子字符串为“im”,函数执行后打印“子字母串在目标字符串中共出现 3 次”。执行效果如下:
小甲鱼代码:
1 def findStr(desStr,subStr): 2 count = 0 3 length = len(desStr) # 计算输入长字符串的长度 4 if subStr not in desStr: # 判断子字符串是否在长字符串当中,如果不在,执行下列语句 5 print("在目标字符串中未找到字符串!") 6 else: # 如果在,统计子字符串出现的次数 7 for each1 in range(length-1): # 利用for循环遍历一个长字符串长度减1的数列 8 if desStr[each1] == subStr[0]: # 利用遍历过程得到的元素作为长字符串索引判断对应的字母是否跟子字符串第一个字母相同 9 if desStr[each1+1] == subStr[1]:# 利用遍历过程得到的元素值加1作为长字符串索引判断对应的字母, 10 # 是否跟子字符串第2个字母相同 11 count += 1 # 如果相同的话count加1 12 13 print("子字符串在目标字符串中共出现%d次" % count) 14 15 desStr = input("请输入目标字符串:") 16 subStr = input("请输入子字符串(两个字符):") 17 findStr(desStr,subStr)
第19讲:
0. 编写一个函数,判断传入的字符串参数是否为“回文联”(回文联即用回文形式写成的对联,既可顺读,也可倒读。例如:上海自来水来自海上)
方法一(使用reverse函数):
我的代码:
1 def Palindrome(string): 2 string1 = list(string) # 将字符串转换成列表 3 print(string1) # 打印列表的值 4 string1.reverse() # 用reverse函数将列表内的元素翻转 5 print(string1) # 打印翻转后的列表 6 result = "".join(string1) # 将翻转后的列表拼接成新的字符串 7 if string == result: # 判断翻转后的字符串与原来的字符串是否相同 8 print("是回文联!") 9 else: 10 print("不是回文联!") 11 12 string = input("请输入一句话:") 13 Palindrome(string)
小甲鱼代码:
1 def palindrome(string): 2 list1 = list(string) 3 list2 = reversed(list1) 4 if list1 == list(list2): 5 return '是回文联!' 6 else: 7 return '不是回文联!' 8 print(palindrome('上海自来水来自海上'))
方法二 :
1 def palindrome(string): 2 length = len(string) 3 last = length-1 # 字符串尾部元素的索引值 4 length //= 2 # 用来控制比较次数,只对字符串的前半部分进行比较 5 flag = 1 # flag为1表示该字符串是回文联 6 for each in range(length): 7 if string[each] != string[last]: # 利用for循环对字符串前后两端相对应的元素进行比较 8 flag = 0 9 last -= 1 10 11 if flag == 1: 12 return 1 13 else: 14 return 0 15 16 string = input('请输入一句话:') 17 if palindrome(string) == 1: 18 print('是回文联!') 19 else: 20 print('不是回文联!')
1. 编写一个函数,分别统计出传入字符串参数(可能不只一个参数)的英文字母、空格、数字和其它字符的个数。
程序执行结果如图:
我的代码:
1 English = "abcdefghigklmnopqrstuvwxyzABCDEFGHIJLMNOPQRSTUVWXYZ" 2 num = "0123456789" 3 space = " " 4 5 def count(*string): 6 length = len(string) 7 i = 0 8 while i < length: 9 charNum = 0 10 numNum = 0 11 spaceNum = 0 12 elseNum = 0 13 for each in string[i]: 14 if each in English: 15 charNum += 1 16 elif each in num: 17 numNum += 1 18 elif each == space: 19 spaceNum += 1 20 else: 21 elseNum += 1 22 print(f"第{i+1}个字符串共有:英文字母{charNum}个,数字{numNum}个,空格{spaceNum}个,其他字符{elseNum}个。") 23 i += 1 24 25 string1 = input("请输入第一个字符串:") 26 string2 = input("请输入第二个字符串:") 27 count(string1,string2)
小甲鱼代码:
1 def count(*param): 2 length = len(param) 3 for i in range(length): 4 letters = 0 5 space = 0 6 digit = 0 7 others = 0 8 for each in param[i]: 9 if each.isalpha(): 10 letters += 1 11 elif each.isdigit(): 12 digit += 1 13 elif each == ' ': 14 space += 1 15 else: 16 others += 1 17 print('第 %d 个字符串共有:英文字母 %d 个,数字 %d 个,空格 %d 个,其他字符 %d 个。' % (i+1, letters, digit, space, others)) 18 19 count('I love fishc.com.', 'I love you, you love me.')
可看出小甲鱼的代码比我的代码好一点,用到了字符串的isalpha()、isdigit()函数,我没想到这点。。。