4. 请问这个函数有多少个参数?
1. def MyFun((x, y), (a, b)):
2. return x * y - a * b
回答两个是错误的,答案是零
因为(x,y)和(a,b)中的xyab是元祖的参数,而函数调用的是变量,元祖是不变的
同样如果改为这样:
def MyFun([x, y], [a, b]):
return x * y - a * b
print(MyFun([1,2],[3,4]))
同样会报错,因此可以发现,定义函数的时候括号里面变量无限但是通常为(x,y,c,a,d,f)
而x可以为列表,在后面的编程代码可以这样写x[0],从而引用x中的值。
因此改变以后是这样:
def MyFun(x,y):
return x[0] * x[1] - y[0] * y[1]
print(MyFun([1,2],[3,4]))
编程题
0. 编写一个函数power()模拟内建函数pow(),即power(x, y)为计算并返回x的y次幂的值。
def power(x,y):
return x**y
print(power(2,3))
1. 编写一个函数,利用欧几里得算法求最大公约数,例如gcd(x, y)返回值为参数x和参数y的最大公约数。
def gcd(x,y):
i = 1
b = 0
while i < 100:
if x % i ==0 and y % i == 0:
if i > b :
b = i
i += 1
if i > x and i >y :
break
return b
print(gcd(52,64))
#没有注意到欧几里得算法:俩数小的数除俩数相除的余数
def gcd(x,y):
while y:
t = x % y
x = y
y = t
return x
print(gcd(18,9))
2. 编写一个将十进制转换为二进制的函数,要求采用“除2取余”的方式,结果与调用bin()一样返回字符串形式。
先附上我的答案:
def binbin(x):
temp=[]
while x:
y = x % 2
x = x // 2
temp.append(y)
temp.reverse()
print(temp)
print(binbin(10))
我的思路:
首先算法没有大的问题,但是主要是从最后开始取答案,也就是说算法算出来其实是0101而答案是1010.然而字符串并没有内置功能可以直接翻转。因此就定义了一个空序列,加入进去以后用内置函数reverse进行翻转(注意:序列有操作符reversed,是用于从大到小排列,且需要外加list输出)。
问题出现:
1.打印结果会有一个None。究其原因是因为在def中最后print出结果,此时函数无返回值,其默认的一个返回值是None,如果这时再次print,则会出现None。解决办法有两种,第一种将最后一行改为:binbin(10),这样输出的就直接是temp的值。第二种是将print(temp)改为,return temp。
2.打印出来为列表形式,和需要的字符串形式不同,且若用str()将列表转换为字符串,逗号中括号依然会在。
借鉴答案:
新知识:1.当列表为空时相当于为0
2.return的值在开始时必须有定义(result),不然会报错
旧知识回顾:pop可以删除列表最后一位并调用,因此可以将列表进行倒叙变字符串的操作
def binbin(x):
temp=[]
result = ''
while x:
y = x % 2
x = x // 2
temp.append(y)
while temp:
result += str(temp.pop())
return result
print(binbin(10))
总结:最后一道编程题将字符串,整型,列表知识都回忆了一次,尤其是列表,利用append加入末尾,又用pop依次取出来,达到翻转的目的。字符串本身没有翻转的内置函数,而列表虽然有,但是输出依然显得很麻烦。注意分清字符串内置函数和列表内置函数的使用