将前面几章用while循环的习题,用for循环实现,并尽量写成函数...... 以前的: chapter1-task2: 练习2:仿照实践1,写出由用户指定整数个数,并由用户输入多个整数,并求和的代码。


In [1]:
def compute_sum(n):
    total = 0
    for i in range(n):
        m = int(input('请输入一个正整数为加数,以回车结束。   '))
        total += m
    return total
    
n = int(input('请输入一个正整数为次数,以回车结束。   '))
print ('total=',compute_sum(n))


请输入一个正整数为次数,以回车结束。   3
请输入一个正整数为加数,以回车结束。   3
请输入一个正整数为加数,以回车结束。   3
请输入一个正整数为加数,以回车结束。   3
total= 9

以前的: chapter2-task4: 练习 1:仿照求$ \sum_{i=1}^mi + \sum_{i=1}^ni + \sum_{i=1}^ki$的完整代码,写程序,可求m!+n!+k!


In [2]:
def computer_sum(num):
    total = 1
    for i in range(1,num+1):
        total *= i
    return total

m = int(input('请输入第一个整数,回车结束  '))
n = int(input('请输入第二个整数,回车结束  '))
k = int(input('请输入第三个整数,回车结束  '))
print ('tatol =',computer_sum(m)+computer_sum(n)+computer_sum(k))


请输入第一个整数,回车结束  3
请输入第二个整数,回车结束  3
请输入第三个整数,回车结束  3
tatol = 18

以前的: chapter2-task4: 练习 2:写函数可返回1 - 1/3 + 1/5 - 1/7...的前n项的和。在主程序中,分别令n=1000及100000,打印4倍该函数的和。


In [3]:
def computer_add(num):
    total = 0
    for i in range(num):
        j = 2*i + 1
        if (i+1)%2 != 0:
            total += 1/j
        else:
            total -= 1/j
    return total

m = int(input('请输入第一个整数,回车结束  '))
print ('4倍的和:tatol1 =',4*computer_add(m))
n = int(input('请输入第二个整数,回车结束  '))
print ('4倍的和:tatol2 =',4*computer_add(n))


请输入第一个整数,回车结束  1000
4倍的和:tatol1 = 3.140592653839794
请输入第二个整数,回车结束  10000
4倍的和:tatol2 = 3.1414926535900345

以前的: chapter2-task4: 挑战性练习:写程序,可以求从整数m到整数n累加的和,间隔为k,求和部分需用函数实现,主程序中由用户输入m,n,k调用函数验证正确性。


In [4]:
def computer_sum(m,n,k):
    for i in range(m,n):
        i += k
    return i

m = int(input('请输入第一个整数即m,回车结束  '))
n = int(input('请输入第二个整数即n,回车结束  '))
k = int(input('请输入第三个整数即k,回车结束  '))
print ('tatol =',computer_sum(m,n,k))


请输入第一个整数即m,回车结束  2
请输入第二个整数即n,回车结束  6
请输入第三个整数即k,回车结束  1
tatol = 6

以前的: chapter2-task5: 练习 1:求n个随机整数均值的平方根,整数范围在m与k之间。


In [5]:
import random,math

def compute_sqrt(n,m,k,total,avg):
    for i in range(1,n):
        num = random.randint(m,k)
        print ('num',i,': ',num,sep='')
        total += num
        avg = total/2
        sqr = math.sqrt(avg)
    return sqr
        
m = int(input('please input a smaller number     '))
k = int(input('please input a bigger number      '))
n = int(input('please input a  number for times  '))
total = 0
avg = 0
num = random.randint(m,k)
print ('num0:',num)
total += num
print (n,'个随机整数均值的平方根等于:',compute_sqrt(n,m,k,total,avg))


please input a smaller number     1
please input a bigger number      2
please input a  number for times  2
num0: 1
num1: 1
2 个随机整数均值的平方根等于: 1.0

以前的: chapter2-task5: 练习 2:共n个随机整数,整数范围在m与k之间,求西格玛log(随机整数)及西格玛1/log(随机整数)


In [6]:
import random,math

def compute_sqrt(n,m,k):
    total1 = 0
    total2 = 0
    for i in range(n):
        num = random.randint(m,k)
        print ('num',i,': ',num,sep='')
        num1 = math.log(num)
        num2 = 1/math.log(num)
        total1 += num1
        total2 += num2
        i += 1
    print ('西格玛log总和为:',total1,'\n西格玛1/log总和为:',total2)
    return
    
m = int(input('please input a smaller number     '))
k = int(input('please input a bigger number      '))
n = int(input('please input a  number for times  '))

compute_sqrt(n,m,k)


please input a smaller number     2
please input a bigger number      6
please input a  number for times  2
num0: 4
num1: 4
西格玛log总和为: 2.772588722239781 
西格玛1/log总和为: 1.4426950408889634

以前的: chapter2-task5: 练习 3:写函数,求s=a+aa+aaa+aaaa+aa...a的值,其中a是[1,9]之间的随机整数。 例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘输入。


In [7]:
import random,math

def compute(n,a):
    b = a
    total = a
    for i in range(n-1):
        b = b*10+a   
        total += b
    print ('total:',total)
    return

a = random.randint(1,9)
print ('a:',a)
n = int(input('please input a  number for times  '))
print ('n:',n)

compute(n,a)


a: 5
please input a  number for times  3
n: 3
total: 615

6.8 习题: 写函数,返回一个list中所有数字的和


In [8]:
def compute_sum(numbers):
    numTotal = 0
    for num in numbers:
        numTotal += num
    print ('numTotal:',numTotal)
    
numbers = [i for i in range(1,10)]
compute_sum(numbers)


numTotal: 45

6.8 习题: 写函数,返回一个list中的最小值


In [9]:
def compute_min(numbers):
    min = numbers[0]
    for num in numbers:
        if num < min:
            min = num
    print ('Min:',min)
    return
    
numbers = [i for i in range(1,10)]
compute_min(numbers)


Min: 1

6.8 习题: 写函数,返回某个元素/对象在一个list中的位置,如果不在,则返回-1.


In [11]:
def compute_pos(numbers):
    n = int(input('please input a number:  '))
    num = 0
    for i in range(len(numbers)):
        if numbers[i] == n :
            print ('pos:',i+1)
            break
        num += 1
    if num >= len(numbers):
        print ('pos:',-1)
            
numbers = [i for i in range(1,10)]
print (numbers)
compute_pos(numbers)


[1, 2, 3, 4, 5, 6, 7, 8, 9]
please input a number:  10
pos: -1

6.8 习题: 写函数,可求两个向量的夹角余弦值,向量可放在list中。主程序调用该函数。


In [12]:
def compute_cos():
    vector_frt = []
    vector_sec = []
    for i in range(2):
        print ('请输入第',i+1,'个向量的坐标')
        x = int(input('请输入x坐标: ')) 
        y = int(input('请输入y坐标: '))
        if i == 0:
            vector_frt.append(x)
            vector_frt.append(y)
        else:
            vector_sec.append(x)
            vector_sec.append(y)
    print ('vector1: [',vector_frt[0],',',vector_frt[1],']',sep = '')
    print ('vector2: [',vector_sec[0],',',vector_sec[1],']',sep = '')
    vect_a = math.sqrt(vector_frt[0]*vector_frt[0] + vector_frt[1]*vector_frt[1])
    vect_b = math.sqrt(vector_sec[0]*vector_sec[0] + vector_sec[1]*vector_sec[1])
    vect_ab = vector_frt[0]*vector_sec[0] + vector_frt[1]*vector_sec[1]
    vect_cos = vect_ab/(vect_a*vect_b)
    print ('两个向量的夹角余弦值为:',vect_cos)
    
compute_cos()


请输入第 1 个向量的坐标
请输入x坐标: 1
请输入y坐标: 0
请输入第 2 个向量的坐标
请输入x坐标: 1
请输入y坐标: 1
vector1: [1,0]
vector2: [1,1]
两个向量的夹角余弦值为: 0.7071067811865475

6.8 习题: 挑战性习题:python语言老师为了激励学生学python,自费买了100个完全相同的Macbook Pro,分给三个班级,每个班级至少分5个,用穷举法计算共有多少种分法?


In [1]:
def compute_counts():  
    num = 0
    for i in range(5,100):
        for j in range(5,100):
            for k in range(5,100):
                if i+j+k == 100:
                    num += 1
                    #print (i,j,k,sep = '--')
    print ('total:',num)

compute_counts()


total: 3741