hw1是很基础的内容。主要是按照要求编写4个函数。
(1)a_plus_abs_b(a, b)
from operator import add, sub
def a_plus_abs_b(a, b):
"""Return a+abs(b), but without calling abs.
>>> a_plus_abs_b(2, 3)
5
>>> a_plus_abs_b(2, -3)
5
>>> a_plus_abs_b(-1, 4)
3
>>> a_plus_abs_b(-1, -4)
3
"""
if b < 0:
f = sub
else:
f = add
return f(a, b)
他有个关键的要求就是最后返回的要是f(a,b)的形式。这就意味着f必须是一个函数而非一个变量。这是我第一次意识到还可以将一个函数赋给一个变量,使得变量变成了函数,最后也直接可以用f(a,b)的形式来表示。既可以表示add(a,b)函数,也可以表示sub(a,b)函数
(2)two_of_three(i, j, k)
def two_of_three(i, j, k):
"""Return m*m + n*n, where m and n are the two smallest members of the
positive numbers i, j, and k.
>>> two_of_three(1, 2, 3)
5
>>> two_of_three(5, 3, 1)
10
>>> two_of_three(10, 2, 8)
68
>>> two_of_three(5, 5, 5)
50
"""
return min(i,j)**2+min(max(i,j),k)**2
要求函数中没有内容,所有的任务都要在最后return中反映出来。我们可以用的函数只有min()和max()这两个。要得到3个数中最小的2个,必须要一个一个来得到。在i,j,k中选出任意两个数,min(i,j)都会得到三个数中最小两个数的其中之一(记为a)。那么i和j中的另一个数我们就可以用max(i,j)来表示。接着我们用min(max(i,j),k),将除a外的剩下两个数进行比较,取最小的数。我觉得核心就是使用min和max对数字进行多轮两两比较。
(3)largest_factor(n)
def largest_factor(n):
"""Return the largest factor of n that is smaller than n.
>>> largest_factor(15) # factors are 1, 3, 5
5
>>> largest_factor(80) # factors are 1, 2, 4, 5, 8, 10, 16, 20, 40
40
>>> largest_factor(13) # factor is 1 since 13 is prime
1
"""
"*** YOUR CODE HERE ***" "n=15"
b=0
a=n-1
while b ==0 :
if n % a == 0 :
b=b+1
print(a)
else:
a=a-1
求一个数小于自己的最大因数。注意while 是条件循环,for是取值循环。并且此处从最大的数开始最简单。
(4)hailstone(n)
def hailstone(n):
"""Print the hailstone sequence starting at n and return its
length.
>>> a = hailstone(10)
10
5
16
8
4
2
1
>>> a
7
>>> b = hailstone(1)
1
>>> b
1
"""
"*** YOUR CODE HERE ***"
if n ==1 :
print(n)
return 1
elif n > 1 :
print(n)
num=1
while n > 1:
if n % 2 ==0 : #even
n = n // 2 #整除
num=num+1
print(n)
else :
n = n * 3 + 1
num=num+1
print(n)
return num
他的要求是打印hailstone里的数并输出其长度。如果n为1,那么hailstone就为1,长度为1。如果n是奇数,那么乘3加1得到新的n。如果n是偶数,那么直接除以2得到新的n。我在实现的过程中发现缩进的错误和循环函数的错误使用都影响到了我的结果。并且在函数中print()和return是两个东西。只要你调用了函数就会得到print的结果,如a=hailstone(n)。但a的值是hailstone()函数的返回值。这两者不能混淆。