tongsiying

阅读|运动|自律

0%

第17篇:函数部分巩固提升

## 函数部分巩固提升

练习1:实现计算求最大公约数和最小公倍数的函数。

参考答案:

1
2
3
4
5
6
7
8
9
10
11
def gcd(x, y):
"""求最大公约数"""
(x, y) = (y, x) if x > y else (x, y)
for factor in range(x, 0, -1):
if x % factor == 0 and y % factor == 0:
return factor


def lcm(x, y):
"""求最小公倍数"""
return x * y // gcd(x, y)

练习2:实现判断一个数是不是回文数的函数。

参考答案:

1
2
3
4
5
6
7
8
def is_palindrome(num):
"""判断一个数是不是回文数"""
temp = num
total = 0
while temp > 0:
total = total * 10 + temp % 10
temp //= 10
return total == num

练习3:实现判断一个数是不是素数的函数。

参考答案:

1
2
3
4
5
6
def is_prime(num):
"""判断一个数是不是素数"""
for factor in range(2, int(num ** 0.5) + 1):
if num % factor == 0:
return False
return True if num != 1 else False

练习4:写一个程序判断输入的正整数是不是回文素数。

参考答案:

1
2
3
4
if __name__ == '__main__':
num = int(input('请输入正整数: '))
if is_palindrome(num) and is_prime(num):
print('%d是回文素数' % num)

注意:通过上面的程序可以看出,当我们将代码中重复出现的和相对独立的功能抽取成函数后,我们可以组合使用这些函数来解决更为复杂的问题,这也是我们为什么要定义和使用函数的一个非常重要的原因。

练习5:生成验证码

要求:设计一个函数产生指定长度的验证码,验证码由大小写字母和数字构成。

参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import random


def generate_code(code_len=4):
"""
生成指定长度的验证码

:param code_len: 验证码的长度(默认4个字符)

:return: 由大小写英文字母和数字构成的随机验证码
"""
all_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
last_pos = len(all_chars) - 1
code = ''
for _ in range(code_len):
index = random.randint(0, last_pos)
code += all_chars[index]
return code

练习6:返回文件名后缀

设计一个函数返回给定文件名的后缀名。

参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def get_suffix(filename, has_dot=False):
"""
获取文件名的后缀名

:param filename: 文件名
:param has_dot: 返回的后缀名是否需要带点
:return: 文件的后缀名
"""
pos = filename.rfind('.')
if 0 < pos < len(filename) - 1:
index = pos if has_dot else pos + 1
return filename[index:]
else:
return ''

练习7:寻找列表前两大元素

设计一个函数返回传入的列表中最大和第二大的元素的值。

参考答案:

1
2
3
4
5
6
7
8
9
def max2(x):
m1, m2 = (x[0], x[1]) if x[0] > x[1] else (x[1], x[0])
for index in range(2, len(x)):
if x[index] > m1:
m2 = m1
m1 = x[index]
elif x[index] > m2:
m2 = x[index]
return m1, m2

练习8:打印杨辉三角

要求:给定一个非负整数num,生成杨辉三角的前num行

在杨辉三角中,每个数是它左上方和右上方的数的和

Example:

1
2
3
4
5
6
7
8
9
Input: 5
Output:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]

参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def main():
num = int(input('Number of rows: '))
yh = [[]] * num
for row in range(len(yh)):
yh[row] = [None] * (row + 1)
for col in range(len(yh[row])):
if col == 0 or col == row:
yh[row][col] = 1
else:
yh[row][col] = yh[row - 1][col] + yh[row - 1][col - 1]
print(yh[row][col], end='\t')
print()


if __name__ == '__main__':
main()

练习9:趣味体重排序

丽在一个”减肥会所”,每到月底小丽就很担心,因为每个月都会公布一份成员体重列表,每个月她都是列表中的最后一个,这意味着她是最重的。于是她就建议会长修改规则,比如新的规则如下:
新的排序规则将是按照“权重”来进行排序,如果权重相同,则按照体重字符串来进行排序。(权重的计算规则:体重数字不同位数上的数字的总和)
给定某种正常顺序俱乐部的成员的体重字符串,如何实现按照新规则排序呢? 测试用例: 输入: “99 189 86 75” 输出: “75 86 189 99”

解法1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def order_weight(weight_string):
weight_list = weight_string.split(' ')
def helper(x):
if not x:
return x
y = int(x)
z = 0
while y:
z += y % 10
y = int(y / 10)
return (z, x)

weight_list.sort(key=helper)
new_weight_string = " ".join(weight_list)
return new_weight_string

if __name__ == '__main__':
weight_string = '99 189 86 75'
new_weight = order_weight(weight_string)
print(new_weight)

解法2:

1
2
3
4
5
6
7
def order_weight(_str):
return' '.join(sorted(_str.split(' '),key = lambda x: sum(int(c) for c in x)))

if __name__ == '__main__':
weight_string = '99 189 86 75'
new_weight = order_weight(weight_string)
print(new_weight)

综合案例:井字棋游戏。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import os


def print_board(board):
print(board['TL'] + '|' + board['TM'] + '|' + board['TR'])
print('-+-+-')
print(board['ML'] + '|' + board['MM'] + '|' + board['MR'])
print('-+-+-')
print(board['BL'] + '|' + board['BM'] + '|' + board['BR'])


def main():
init_board = {
'TL': ' ', 'TM': ' ', 'TR': ' ',
'ML': ' ', 'MM': ' ', 'MR': ' ',
'BL': ' ', 'BM': ' ', 'BR': ' '
}
begin = True
while begin:
curr_board = init_board.copy()
begin = False
turn = 'x'
counter = 0
os.system('clear')
print_board(curr_board)
while counter < 9:
move = input('轮到%s走棋, 请输入位置: ' % turn)
if curr_board[move] == ' ':
counter += 1
curr_board[move] = turn
if turn == 'x':
turn = 'o'
else:
turn = 'x'
os.system('clear')
print_board(curr_board)
choice = input('再玩一局?(yes|no)')
begin = choice == 'yes'


if __name__ == '__main__':
main()
赞赏一下吧~