Homework2
1. 编写 Python 程序,求两个正整数的最大公约数。¶
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
num1 = int(input("请输入第一个正整数: "))
num2 = int(input("请输入第二个正整数: "))
print(f"{num1} 和 {num2} 的最大公约数是: {gcd(num1, num2)}")
55 和 7 的最大公约数是: 1
2. 用if语句实现百分制转等级制(考试成绩,60分以下不合格,60—74分合格,75—89分为良好,90分以上为优秀)。¶
def grade_conversion(score):
if score < 60:
return "不合格"
elif 60 <= score <= 74:
return "合格"
elif 75 <= score <= 89:
return "良好"
elif score >= 90:
return "优秀"
# 百分值成绩应该是整数
score = int(input("请输入考试成绩: "))
print(f"{score}分的成绩等级为: {grade_conversion(score)}")
74分的成绩等级为: 合格
3. 编写Python程序,完成十进制小数到二进制小数的转换¶
def float_decimal_to_binary( num ):
#整数部分转换
int_part = int(num)
int_list = []
while(int_part):
x = int_part % 2
int_list.append(str(x))
int_part //= 2
int_list.reverse()
int_binary = "".join(int_list)
#小数部分转换
float_part = num - int(num)
count_temp = 0
float_list = []
while(float_part):
float_part *= 2
x = str(int(float_part))
float_list.append(x)
float_part = float_part - int(float_part)
count_temp += 1
if count_temp > 10:
break
float_binary = "".join(float_list)
print("%f转化为二进制表达为:%s"%(num,int_binary+'.'+float_binary))
num = float(input("请输入要转化的小数(十进制):"))
float_decimal_to_binary(num)
16.875000转化为二进制表达为:10000.111
4. 编写Python程序,产生10-20的随机浮点数¶
import random
def random_float():
return random.uniform(10,20)
print("生成的随机数为:%f"%(random_float()))
生成的随机数为:14.972818
5. 编写一个Python函数,判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的数。¶
def is_palindrome(num):
str_num = str(num)
return str_num == str_num[::-1]
number = int(input("请输入一个整数: "))
if is_palindrome(number):
print(f"{number} 是回文数")
else:
print(f"{number} 不是回文数")
123321 是回文数
6.编写一个Python函数,返回一个包含斐波那契数列的前N个数的列表。斐波那契数列是一个数列,其中每个数是前两个数的和,数列以0和1开始。¶
def fibonacci(n):
if n <= 0:
return []
elif n == 1:
return [0]
elif n == 2:
return [0, 1]
fib_list = [0, 1]
for _ in range(2, n):
fib_list.append(fib_list[-1] + fib_list[-2])
return fib_list
N = int(input("请输入斐波那契数列的长度: "))
print(f"斐波那契数列的前 {N} 个数是: {fibonacci(N)}")
斐波那契数列的前 7 个数是: [0, 1, 1, 2, 3, 5, 8]
7.编写一个Python函数,接受一个整数数组作为输入,返回数组中第二大的数。如果数组中只有一个元素或数组为空,则返回-1。¶
def second_largest(arr):
if len(arr) < 2:
return -1
unique_elements = list(set(arr))
if len(unique_elements) < 2:
return -1
unique_elements.sort()
return unique_elements[-2]
# 我输入的数据 3 7 5 8 888 9 -1
array = [int(x) for x in input("请输入整数数组(用空格分隔): ").split()]
result = second_largest(array)
if result == -1:
print("数组中没有第二大的数")
else:
print(f"数组中第二大的数是: {result}")
数组中第二大的数是: 9
8. 编写一个函数,使其能够用正则表达式的方式简单验证身份证号是否合法。¶
validate_id_card函数使用正则表达式模式来匹配身份证号。模式通过以下方式验证身份证号的格式:
- 第一位必须是1-9的数字,不以0开头。
- 接下来5位是地区码。(开头6位都是地区码)
- 紧接着6位是出生年份和月份。
- 接下来2位是出生日。
- 然后是3位顺序码(通常是随机数字)。
- 最后一位可以是数字或大写字母X。
import re
def validate_id_card(id_card):
# 定义身份证号码的正则表达式模式
pattern = r'^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$'
# 使用正则表达式匹配身份证号码
if re.match(pattern, id_card):
if len(id_card) == 18:
# 验证校验位
factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
checksum = 0
for i in range(17):
checksum += int(id_card[i]) * factors[i]
remainder = checksum % 11
check_digit = '10X98765432'[remainder]
if id_card[-1].upper() == check_digit:
return True
elif len(id_card) == 15:
return True # 15位身份证不校验校验位
return False
id_card = input("请输入身份证号码:")
print(f"身份证号{id_card}",end="")
if validate_id_card(id_card):
print("合法!")
else:
print("非法!")
身份证号362322200708310651非法!
^:表示匹配字符串的开头,确保正则表达式从字符串的开头开始匹配。[1-9]:表示第一位是数字,但不包括0。这是因为身份证号的第一位通常不是0。\d{5}:表示接下来的5位是数字(0-9),共计6位,这部分用来表示地区编码。(19|20):这是一个分组,用于匹配年份的前两位。身份证号通常使用19或20作为年份的前两位。\d{2}:表示匹配年份的后两位,共计2位。(0[1-9]|1[0-2]):这是一个分组,用于匹配月份。月份的范围是01到12。这一部分可以匹配01到09月以及10到12月。(0[1-9]|[1-2]\d|3[0-1]):这是一个分组,用于匹配日期。它可以匹配01到09日,10到29日,以及30到31日。\d{3}:表示匹配身份证号中的顺序码,通常是3位数字。(\d|X|x):这是最后一部分,用于匹配身份证号的校验码。它可以是数字(0-9)或字母X(可以是大写或小写)。$:表示匹配字符串的结尾,确保正则表达式匹配到字符串的末尾。
以下是一些常见的正则表达式模式:
普通字符: 普通字符(例如字母、数字、标点符号等)表示它们自身。在示例中,
"apple"就是一个普通字符。特殊字符: 正则表达式中有一些特殊字符,如
.、*、+、?等,它们具有特殊的含义。例如,"."表示匹配任何字符,"*"表示匹配前一个字符的零个或多个重复,"+"表示匹配前一个字符的一个或多个重复,"?"表示匹配前一个字符的零个或一个重复。这些特殊字符需要进行转义,如\.、\*、\+、\?来匹配它们自身。字符类: 使用
[...]表示一个字符类,可以匹配括号内的任何一个字符。例如,[abc]匹配字符 'a'、'b' 或 'c' 中的任何一个。范围字符类: 使用
[a-z]表示匹配小写字母 'a' 到 'z' 中的任何一个字符。类似地,[0-9]表示匹配数字 0 到 9 中的任何一个字符。反向字符类: 使用
[^...]表示一个反向字符类,可以匹配不在括号内的任何字符。例如,[^0-9]匹配任何非数字字符。预定义字符类: 正则表达式还提供了一些预定义的字符类,如
\d表示任何数字字符,\w表示任何字母、数字或下划线字符,\s表示任何空白字符。相应的大写形式\D、\W、\S表示它们的补集。边界匹配:
^表示匹配字符串的开头,$表示匹配字符串的结尾。例如,"^apple"匹配以 "apple" 开头的字符串。重复: 使用
{m}表示前一个模式必须重复 m 次,使用{m, n}表示前一个模式必须重复至少 m 次,至多 n 次。例如,"a{2,4}"匹配 "aa"、"aaa" 或 "aaaa"。逻辑操作: 正则表达式支持逻辑操作,如
|表示或操作。例如,"apple|banana"匹配 "apple" 或 "banana"。分组: 使用
()创建分组,可以对模式进行分组和捕获。例如,"(apple|banana)"匹配 "apple" 或 "banana",并且可以通过捕获组来访问匹配的内容。
在示例中,pattern 的形式是一个普通字符串 "apple",它将匹配目标字符串的开头,只有当目标字符串以 "apple" 开头时才会找到匹配。