一、形参和实参
参数从调用的角度来说,分为形式参数(parameter)和实际参数(argument)
1.形式参数
- 形参指的是函数定义的过程中小括号里的参数
2.实际参数
- 实参指的是函数在被调用的过程中传递进来的参数
二、函数文档
- 函数文档的作用是描述该函数的功能以及一些注意事项,为了方便别人更好地理解这个函数,更好地为该函数调试
- 函数的文档字符串可以通过特殊属性_ _ doc _ _ 获取
- 也可以通过help()函数来查看函数文档
三、关键字参数
- 我们在调用一个函数的时候常常会搞乱参数的顺序,达不到我们希望的效果,尤其函数参数较多时
- 关键字参数就是在传入实参时明确指定形参的变量名,其特点就是参数之间不存在先后顺序
- 尽管使用这种技巧要多输入一些字符,但随着程序规模越大,参数越多的时候,关键字参数起到的作用就越明显
attention:在定义函数的时候,位置参数必须在默认参数的前面,否则会出错
四、默认参数
- Python的函数允许为参数指定默认的值,那么在函数调用的时候如果没有传递实参,则采用默认参数
区分关键字参数与默认参数:
【1】关键字参数是在函数调用的时候通过参数名制定需要赋值的参数,这样就不会因为搞不清参数的顺序而使得函数调用出现莫名其妙的错误
【2】默认参数是在参数定义的过程中为形参赋初值,当函数调用时,如果忘记传递参数,那么就会自动找默认值,而使得调用函数不会出现错误
五、收集参数
- 也称可变参数,有时候函数也不知道调用者实际上会传入多少个实参
- 用*定义
- Python把标志为收集参数的参数用元组把它打包起来
- 如果收集参数的后面还要加上其他定制的参数,那么在调用函数的时候就应该使用关键字参数,否则Python就会把你后面的定制参数也列为收集参数的范畴
- 如果定义的函数中带有收集参数,那么可以将其他参数设置为默认参数,如上例中将第二个参数exp默认设置为8,就算不给第二个参数赋值也不会报错
- print()函数的原型
【1】objects参数是一个收集参数,如果传入多个参数,将会依次打印出来
【2】sep参数指定多个参数之间的分隔符
【3】end参数指定以什么字符结束打印,默认是换行符
【4】file参数指定输出的位置
【5】flush、指定是否强制刷新缓存 - *的作用:
【1】在函数的定义中,收集参数前面的星号*起到的作用称为"打包"操作,就是将多个参数打包成一个元组的形式进行存储
【2】星号*在形参中的作用是打包,而在实参中则起到“解包”的作用
Task
0. 请问以下哪个是形参哪个是实参?
def MyFun(x):
return x ** 3
y = 3
print(MyFun(y))
x为形参,y为实参
形参指的是函数创建和定义过程中小括号里的参数,而实参指的是函数在调用过程中传递进去的参数
1. 函数文档和直接用“#”为函数写注释有什么不同?
给函数写文档是为了让别人可以更好的理解你的函数,所以这是一个好习惯
在函数开头写下的字符串Ta是不会打印出来的,但Ta会作为函数的一部分存储起来,这个我们称之为函数文档字符串,Ta的功能跟注释是一样的。
2. 使用关键字参数,可以有效避免什么问题的出现呢?
关键字参数,是指函数在调用的时候,带上参数的名字去指定具体调用的是哪个参数,从而可以不用按照参数的顺序调用函数,可以避免参数先后顺序出错
3. 使用help(print)查看print()这个BIF有哪些默认参数?分别起到什么作用?
【1】objects参数是一个收集参数,如果传入多个参数,将会依次打印出来
【2】sep参数指定多个参数之间的分隔符
【3】end参数指定以什么字符结束打印,默认是换行符
【4】file参数指定输出的位置
【5】flush、指定是否强制刷新缓存
4. 默认参数和关键字参数表面最大的区别是什么?
【1】关键字参数是在函数调用的时候通过参数名制定需要赋值的参数,这样就不会因为搞不清参数的顺序而使得函数调用出现莫名其妙的错误
【2】默认参数是在参数定义的过程中为形参赋初值,当函数调用时,如果忘记传递参数,那么就会自动找默认值,而使得调用函数不会出现错误
5.编写一个符合以下要求的函数:
def myfunction(*params,base = 3):
sum1 = 0
for i in params:
sum1 += i
results = sum1 * base
return results
6.寻找水仙花数 题目要求:如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数。例如153 = 13+53+3^3,因此153是一个水仙花数。编写一个程序,找出所有的水仙花数。
MY CODE

for i in range(100,1000):
a = i // 100
b = (i - a * 100) //10
c = i % 10
if i == a ** 3 + b ** 3 + c ** 3:
print(i)
小甲鱼
def Narcissus():
for each in range(100, 1000):
temp = each
sum = 0
while temp: #temp最后整除不了10时循环结束
sum = sum + (temp%10) ** 3 #先加个位数的立方,再加十位数的立方,最后加百位数的立方,
temp = temp // 10 # 注意这里用地板除,百位数立方加完后,temp为百位数,除以10为0,此时循环结束
if sum == each:
print(each, end='\t')# \t表示制表符
print("所有的水仙花数分别是:", end='')
Narcissus()
7.编写一个函数 findstr(),该函数统计一个长度为 2 的子字符串在另一个字符串中出现的次数。例如:假定输入的字符串为“You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.”,子字符串为“im”,函数执行后打印“子字母串在目标字符串中共出现 3 次”。
我的代码,缺点:若子字符不在字符串中,是有问题的
def findstr(string,substr):
string = input("请输入目标字符串:")
substr = input("请输入子字符串(两个字符):")
times = 0#次数
j = 0#索引值
for i in string:
a = i + string[j + 1]#a为两个字符串,依次往后移
if a == substr:
times += 1
j = j + 1#索引后移一位
if j == len(string) - 1:#保证j+1<len(string)-1,即最大索引值=长度减一,因为索引从0开始
break
print("子字符串在目标字符串中共出现",end = '')
print(times,end = '')
print('次')
小甲鱼
def findStr(desStr, subStr):
count = 0#计数
length = len(desStr)
if subStr not in desStr:
print('在目标字符串中未找到字符串!')
else:
for each1 in range(length-1): #因为索引是从0开始的
if desStr[each1] == subStr[0]:#第一位相同
if desStr[each1+1] == subStr[1]:#第二位也相同
count += 1#那么次数加一
print('子字符串在目标字符串中共出现 %d 次' % count)
desStr = input('请输入目标字符串:')
subStr = input('请输入子字符串(两个字符):')
findStr(desStr, subStr)