函数-灵活即强大
测试题:
0. 请问以下哪个是形参哪个是实参?
def MyFun(x):
return x ** 3
y = 3
print(MyFun(y))
x 是
形式参数(形参)
,y 是实际参数(实参)
,跟绝大部分编程语言一样:
(1)形参
指的是函数创建和定义过程中小括号里的参数
(2)实参
指的是函数在调用过程中传递进去的参数
1. 函数文档和直接用 “#” 为函数写注释有什么不同?
给函数写文档是为了让别人可以更好的理解你的函数,所以这是一个好习惯:
>>> def MyFirstFunction(name):
'函数文档在函数定义的最开头部分,用不记名字符串表示'
print('I love China!')
我们看到在函数开头写下的字符串 Ta 是不会打印出来的,但 Ta 会作为函数的一部分存储起来,这个我们称之为函数文档字符串,Ta 的功能跟注释是一样的
函数的文档字符串可以按如下方式访问:
>>> MyFirstFunction.__doc__
'函数文档在函数定义的最开头部分,用不记名字符串表示'
另外,我们用 help() 来访问这个函数也可以看到这个文档字符串:
>>> help(MyFirstFunction)
Help on function MyFirstFunction in module __main__:
MyFirstFunction(name)
函数文档在函数定义的最开头部分,用不记名字符串表示
2. 使用关键字参数,可以有效避免什么问题的出现呢?
关键字参数,是指函数在调用的时候,带上参数的名字去指定具体调用的是哪个参数,从而可以不用按照参数的顺序调用函数
例如:
>>> def SaySome(name, words):
print(name + '->' + words)
>>> SaySome(words='让编程改变世界!', name='小甲鱼')
小甲鱼->让编程改变世界!
使用关键字参数,可以有效避免不小心搞乱参数的顺序导致的BUG出现
3. 使用 help(print) 查看 print() 这个 BIF 有哪些默认参数?分别起到什么用作?
>>> help(print)
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
# 文件类型对象,默认是sys.stdout(标准输出流)
file: a file-like object (stream); defaults to the current sys.stdout.
# 第一个参数如果有多个值(第一个参数是收集参数),各个值之间默认用空格(space)隔开
sep: string inserted between values, default a space.
# 打印最后一个值之后默认参数一个新行标识符('\n')
end: string appended after the last value, default a newline.
# 是否强制刷新流
flush: whether to forcibly flush the stream.
4. 默认参数和关键字参数表面最大的区别是什么?
(0) 关键字参数是在函数调用的时候,通过参数各制定需要赋值的参数,这样做就不怕因为搞不清楚参数的顺序而导致函数调用出错
(1) 默认参数是在参数定义的过程中,为形参赋初值,当函数调用的时候,不传递实参,则默认使用形参的初始值代替
动动手:
0. 编写一个符合以下要求的函数:
(0) 计算打印所有参数的和乘以基数(base = 3)的结果
(1) 如果参数中最后一个参数为(base = 5),则设定基数为5,基数不参与求和计算
def mFun(*param, base = 3): # 创建函数mFun(),*param: 收集参数,base: 基数默认为 3
result = 0 # 定义结果变量,初始值为0
for each in param: # 将收集到的参数依次赋值给 each
result += each # 将收集到的参数进行求和(不包括基数(base))
result *= base # 将求和后的参数结果(result) 乘以 基数(base)
print('结果是:', result) # 打印输出最后结果
mFun(1, 2, 3, 4, 5, base = 5) # 调用函数mFun(),给5个实参,将基数base默认值改为 5
1. 寻找水仙花数
题目要求:
如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数。
例如 153 = 1(3+5次方)3+3^3,因此153是一个水仙花数。 编写一个程序,找出所有的水仙花数
'''
水仙花数的定义是:
这个数等于他每一位上数的幂次之和-->见维基百科的定义
比如一个3位的十进制整数153就是一个水仙花数,因为 153 = 13 + 53 + 33
'''
def Narcissus(): # 创建水仙花数函数Narcissus()
for each in range(100, 1000): # 将100到1000-1的数依次赋值给each
temp = each # 将each临时存放起来
sum = 0 # 定义sum求和
while temp: # while循环
sum = sum + (temp % 10)**3 # 求水仙花数
temp = temp // 10 # 注意这里用地板除
if sum == each: # 判断水仙花数是否存在 each 这些数里
print(each, end = '\t') # 存在,打印出水仙花数,范围:999内,间隔八个空格
print('所有的水仙花数分别是:', end='\t') # 打印提示
Narcissus() # 调用水仙花数函数Narcissus()
2. 编写一个函数 findStr(),该函数统计一个长度为2的子字符串在另一个字符串中出现的次数。
例如:
假定输入的字符串为 “You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.”,子字符串为“im”,函数执行后打印“子字符串在目标字符串中共出现3次”
Str(desStr, subStr): # 创建函数findStr(),给两个形参
count = 0 # 计数器
lenght = len(desStr) # 取出目标字符串的长度
if subStr not in desStr: # 用成员运算符判断子字符串是否存在于目标字符串(默认不存在)
print('抱歉!在目标字符串未找到子字符串!')
else:
for each in range(lenght - 1): # 将目标字符串的长度减1依次赋值给 each
if desStr[each] == subStr[0]: # 判断目标字符串里找到的第一个子字符串是不是第 0 位置出现的
if desStr[each + 1] == subStr[1]: # 判断目标字符串里找到的第二个子字符串是不是第 1 位置出现的
count += 1 # 符合前面两个判断的子字符串将被记录出现次数
print('子字符串在目标字符串中共出现%d次' % count) # 打印提示
desStr = input('请输入目标字符串:') # 用户输入目标字符串
subStr = input('请输入子字符串(两个字符):') # 用户输入子字符串
findStr(desStr, subStr) # 调用函数findStr(),输入的目标字符串和子字符串作为实参
程序执行效果:
请输入目标字符串:You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.
请输入子字符串(两个字符):im
子字符串在目标字符串中共出现3次