## 函数部分巩固提升
练习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 randomdef 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
要求:给定一个非负整数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 osdef 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()