笔记
形参与实参
形参(parameter)
实参(argument)
函数文档
如图中所示,用单引号括起来的部分被称作函数文档,与#后的注释不同。
可以通过__doc__调用显示,如:
以双下横线开始并以之结束是函数的特殊属性。
使用help()也可以显示函数文档:
再例如对于print函数,可用print.__doc__显示其函数文档,
但不是很美观,使用help(print)会显示的比较规整:
关键字参数
关键字参数是指在带入实际参数时利用了形式参数名,可以解决由于函数参数过多从而导致参数顺序错乱的问题。
例如:
在输入实参时使用关键字参数的方法,Python就不会按照实参顺序去对应索引到形参上,而是根据关键字去索引。
默认参数
在定义函数时,在形参列表中为形参赋初值,此时的形参便是默认参数。
例如:
即便忘记带参数去调用该函数,也会正常输出一个结果,因为在定义函数时给了形参默认值(即默认参数)。
如果给予参数,则会相应改变:
收集参数
在定义函数时,在参数前加上'*'。这是为了解决不知道函数在实际调用时具体需要多少个参数的问题而设计的。
原理:Python将这些实参打包成元组输入到了params里。
若在收集参数后还需要定制别的参数,则需要用关键字参数的方式,否则Python会将全部的实参都打包成元组传入到收集参数中。例如:
可见,Python提示exp参数没有得到值。
这样就没问题。
建议:如果定义函数时既有收集参数,又有其他的参数,请为其他的参数设置默认值。
print在定义时就有一个收集参数,和诸多默认参数。
课后作业
测试题:
0. 请问以下哪个是形参哪个是实参?
def MyFun(x):
return x ** 3
y = 3
print(MyFun(y))
答:x是形参,y是实参。
1. 函数文档和直接用“#”为函数写注释有什么不同?
答:函数文档可以通过__doc__以及help()调用查看;而用“#”为函数写的注释只能在py文件里面查看。
2. 使用关键字参数,可以有效避免什么问题的出现呢?
答:可以避免因为忘记形参顺序而导致实参传入错误。
3. 使用help(print)查看print()这个BIF有哪些默认参数?分别起到什么作用?
答:print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
4. 默认参数和关键字参数表面最大的区别是什么?
答:在调用函数时 ,是否必须给形参传递实参。
动动手:
0. 编写一个符合以下要求的函数:
a) 计算打印所有参数的和乘以基数(base=3)的结果
b) 如果参数中最后一个参数为(base=5),则设定基数为5,基数不参与求和计算。
答:
def compute(*number,base = 3):
add = 0
for each in number:
add += each
return add*base
1. 寻找水仙花数
题目要求:如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数。例如153 = 1^3+5^3+3^3,因此153是一个水仙花数。编写一个程序,找出所有的水仙花数。
答:
def flowernumber():
for i in range(100,999):
sum = 0
temp = i
while temp:
sum = sum + (temp%10) ** 3
temp //= 10 # 注意这里要使用地板除哦~
if sum == i:
print(i)
2. 编写一个函数 findstr(),该函数统计一个长度为 2 的子字符串在另一个字符串中出现的次数。例如:假定输入的字符串为“You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.”,子字符串为“im”,函数执行后打印“子字母串在目标字符串中共出现 3 次”。
程序执行效果:
答:
def findstr():
str2 = input('请输入目标字符串:')
str1 = input('请输入子字符串(两个字符):')
print('子字符串在目标字符串中共出现',str2.count(str1),'次',sep = '')