巩固
R-1.1 编写一个Python函数is_multiple(n, m)
,用来接收两个整数值n
和m
,如果n
是m
的倍数,即存在整数i使得n = mi
,那么函数返回True,否则返回False。
def is_multiple(n, m):
return n % m == 0
原始答案
# 同上
R-1.2 编写一个Python函数is_even(k)
,用来接收一个整数k
,如果k
是偶数返回True,否则返回False。但是,函数中不能使用乘法、除法或取余操作。
def is_even(k):
return (k & 1 == 0)
原始答案
# 同上
R-1.3 编写一个Python函数minmax(data)
,用来在数的序列中找出最小数和最大数,并以一个长度为2的元组返回。请注意:不能通过内置函数min
和max
来实现。
import numpy as np
def minMax(data):
minVal = data[0]
maxVal = data[0]
for val in data:
if val < minVal:
minVal = val
if val > maxVal:
maxVal = val
return minVal, maxVal
if __name__ == '__main__':
array = np.random.randint(10, 99, size=10, dtype=np.uint8)
print(array)
minVal, maxVal = minMax(array)
print(minVal, maxVal)
原始答案
def minmax(data):
small = big = data[0] # assuming nonempty
for val in data:
if val < small:
small = val
if val > big:
big = val
return small,big
R-1.4 编写一个Python函数,用来接收正整数n
,返回1~n
的平方和。
def sum_of_squares(n):
return sum(x * x for x in range(n+1))
if __name__ == '__main__':
print(sum_of_squares(3))
原始答案
def sum_of_squares(n):
total = 0
for j in range(1, n+1):
total += j*j
return total
R-1.5 基于Python的解析语法和内置函数sum
,写一个单独的命令来计算R-1.4中的和。
def sum_of_squares(n):
return sum(x * x for x in range(n+1))
if __name__ == '__main__':
print(sum_of_squares(3))
原始答案
total = sum(j*j for j in range(1, n+1))
R-1.6 编写一个Python函数,用来接收正整数n
,并返回1~n
中中所有奇数的平方和。
def sum_of_squares(n):
total = 0
for i in range(1, n + 1, 2):
total += i * i
return total
if __name__ == '__main__':
print(sum_of_squares(3))
原始答案
def sum_of_squares(n):
total = 0
for j in range(1, n+1, 2):
total += j*j
return total
R-1.7 基于Python的解析语法和内置函数sum
,写一个单独的命令来计算练习R-1.6中的和。
def sum_of_squares(n):
total = sum(x * x for x in range(1, n + 1, 2))
return total
if __name__ == '__main__':
print(sum_of_squares(3))
原始答案
total = sum(j*j for j in range(1, n+1, 2))
R-1.8 Python允许负整数作为序列的索引值,如一个长度为n
的字符串s
,当索引值-n <= k < 0
时,所指的元素为s[k]
,那么求一个正整数索引值j >= 0
,使得s[j]
指向的也是相同的元素。
- 序列的正负索引值对照如下图所示:
所以j = n + k
。
R-1.9 要生成一个值为50,60,70,80的排列,求range
构造函数中的参数。
for val in range(50, 90, 10):
print(val, end=',')
原始答案
range(50, 81, 10)
R-1.10 要生成一个值为8,6,4,2,0,-2,-4,-6,-8的排列,求range
的构造函数的参数。
range(8, -9, -2)
for val in range(8, -9, -2):
print(val, end=" ")
原始答案
range(8, -10, -2)
R-1.11 演示怎么使用列表解析语法来产生列表[1, 2, 4, 8, 16, 32, 64, 128, 256]
。
list = [2 ** x for x in range(9)]
print(list)
原始答案
[2∗∗k for k in range(9)]
R-1.12 Python的random
模块包括一个函数choice(data)
,可以从一个非空序列返回一个随机元素。Random
模块还包含一个更基本的randrange
函数,参数化类似于内置的range
函数,可以在给定范围内返回一个随机数。只使用randrange
函数,实现自己的choice
函数。
from random import randrange
def choice(data):
i = randrange(len(data))
return data[i]
if __name__ == '__main__':
data = [1, 2, 4, 8, 16, 32, 64, 128, 256]
print(choice(data))
原始答案
def choice(data):
return data[randrange(len(data))]
创新
C-1.13 编写一个函数的伪代码描述,该函数用来逆置n个整数的列表,使这些数以相反的顺序输出,并将该方法与可以实现同样功能的Python函数进行比较。
def reverse(data):
return data[::-1]
c-1.14 编写一个Python函数,用来接收一个整数序列,并判断该序列中是否存在一对乘积是奇数的互不相同的数。
提示,两个数字必须是奇数。
以下解法时间复杂度为 O ( n 2 ) O(n^{2}) O(n2)。
def find_result(data):
for i in range(len(data)):
for j in range(len(data)):
if i == j:
continue
elif (data[i] % 2) == 1 and (data[i] % 2):
return data[i], data[j]