原创:XIAO油菜花
学习进度记录:
《零基础入门学习Python》P19:函数:灵活即强大
《Python开发入门与爬虫项目实战》:Python中的函数:递归查找
课后思考
- 0.你有听说过DRY吗?
- 1.都是重复一段代码,为什么我要使用函数(而不使用简单的拷贝黏贴)呢?
- 2.函数可以有多个参数吗?
- 3.创建函数使用什么关键字,要注意什么?
- 4.请问这个函数有多少个参数?
def MyFun((x, y), (a, b)):
return x * y - a * b
- 5.请问调用以下这个函数会打印什么内容?
>>> def hello():
print('Hello World!')
return
print('I Love XIAO油菜花!')
- 6.请问以下哪个是形参哪个是实参?
def MyFun(x):
return x ** 3
y = 3
print(MyFun(y))
- 7.函数文档和直接用“#”为函数写注释有什么不同?
- 8.使用关键字参数,可以有效避免什么问题的出现呢?
- 9.默认参数和关键字参数表面最大的区别是什么?
答案
- 0.DRY是程序员们公认的指导原则:Don't Repeat Yourself.
快快武装你的思维吧,拿起函数,不要再去重复拷贝一段代码了! - 1.使用函数:
- 可以降低代码量(调用函数只需要一行,而拷贝黏贴需要N倍代码)
- 可以降低维护成本(函数只需修改def部分内容,而拷贝黏贴则需要每一处出现的地方都作修改)
- 使程序更容易阅读
- 2.Python中函数可以有多个参数,理论上你想要有多少个就可以有多少个,但是建议不要设计太多参数,以免违背函数简单实用的初衷。
- 3.使用‘def’关键字,注意函数名后面应该接一对小括号,小括号后面有冒号,然后缩进部分均属于函数体的内容。
- 4.如果你回答两个,那么恭喜你错啦,答案是0,因为这样的写法是错误的!函数的参数需要的是变量,而这里你试图用只读的“元祖”的形式来传递是不可行的。你应该是要表达这么个意思:
>>> def MyFun(x, y):
return x[0] * x[1] - y[0] * y[1]
>>> MyFun((3, 4), (1, 2))
10
- 5.会返回:Hello World! 因为当Python执行到return语句的时候,Python认为函数到此结束,需要返回了(尽管返回值是空)。
- 6.x是形式参数(形参),y是实际参数(实参)。
- 7.给函数写文档是为了让别人可以更好的理解你的函数,在函数开头写下的字符串Ta是不会打印出来的,但Ta会作为函数的一部分存储起来,这个我们称之为函数文档字符串,Ta的功能跟注释是一样的。
- 8.避免忘记参数位置时导致的BUG出现。
- 9.关键字参数是在函数调用的时候,通过参数名制定需要赋值的参数,这样做可以避免搞不清参数的顺序而导致函数调用出错。而默认参数是在参数定义的过程中,为形参赋初始值,当函数调用的时候,没有传递相应的实参则默认使用形参的初始值代替。
实战
0.编写一个函数power()模拟内建函数pow(),即power(x, y)为计算并返回x的y次幂的值。
def power(x, y):
result = 1
for i in range(y):
result *= x
print(str(x)+'的'+str(y)+'次幂是:'+str(result))
1.编写一个函数,利用欧几里得算法求最大公约数,例如gcd(x, y)返回值为参数x和参数y的最大公约数。
def gcd(x,y):
while y:
t = x % y
x = y
y = t
return x
2.编写一个将十进制转换为二进制的函数,要求采用“除2取余”的方式,结果与调用bin()一样返回字符串形式。
def my_bin(x):
temp = []
result = ''
while x:
#取余
y = x % 2
#地板除法
x = x // 2
#用append()在列表的最后添加一个元素
temp.append(y)
while temp:
#用pop()移除列表中的最后一个元素,并且返回该元素的值
result += str(temp.pop())
return result
3.编写一个符合以下要求的函数:
- a.计算打印所有参数的和乘以基数(base=3)的结果
- b.如果参数中最后一个参数为(base=5),则设定基数为5,基数不参与求和计算。
def base(*value):
base = 3
if value[-1] == 5:
base = 5
h = sum(value[0:(len(value)-1)])
result = h*base
else:
h = sum(value)
result = h*base
return result
#参考答案
def mFun(*param, base=3):
result = 0
for each in param:
result += each
result *= base
print('结果是:', result)
mFun(1, 2, 3, 4, 5, base=5)
4.寻找水仙花数: 如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数。例如153 = 13+53+3^3,因此153是一个水仙花数。编写一个程序,找出所有的水仙花数。
def flower():
for x in range(100,1000):
if x == (x//100)**3 + (x%100//10)**3 + (x%10)**3:
print(x, end = ' ')
#参考答案:
def Narcissus():
for each in range(100, 1000):
temp = each
sum = 0
while temp:
sum = sum + (temp%10) ** 3
temp = temp // 10 # 注意这里用地板除
if sum == each:
print(each, end='\t')
print("所有的水仙花数分别是:", end='')
Narcissus()
5.编写一个函数 findstr(),该函数统计一个长度为 2 的子字符串在另一个字符串中出现的次数。例如:假定输入的字符串为“You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.”,子字符串为“im”,函数执行后打印“子字母串在目标字符串中共出现 3 次”。程序执行效果:
def findStr(desStr, subStr):
count = 0
length = len(desStr)
if subStr not in desStr:
print('在目标字符串中未找到字符串!')
else:
for each1 in range(length-1):
if desStr[each1] == subStr[0]:
if desStr[each1+1] == subStr[1]:
count += 1
print('子字符串在目标字符串中共出现 %d 次' % count)
desStr = input('请输入目标字符串:')
subStr = input('请输入想要查找的子字符串(两个字符):')
findStr(desStr, subStr)
如果你关注了我,希望你监督我,鼓励我,与我一起学习,一起成长!❤
网友评论