Python初学者看这一篇就够了【7】——函数基础编程练习

第7节课 【函数基础编程练习】

练习01 求一个整数各个数字的和

编写一个函数,计算一个整数各个数字的和,例如 输入234,输出9,因为2 + 3 + 4 = 9

def sum_digits(n):
"""
    123 % 10 = 3
    12 % 10 = 2
    1 % 10 = 1
    0
"""
def sum_digits(n):
    ret = 0
    while n != 0:
        temp = n % 10
        ret += temp
        n //= 10
    return ret

n = int(input("Enter n:"))
print(sum_digits(n))

练习02 回文整数

编写函数,判断一个数字是否为回文数

def is_palindrome(number):
def reverse(number):
"""
num = 12321
reverse_num = 12321

num = 12345
reverse_num = 54321
"""
"""
12345 % 10 = 5
1234 % 10 = 4
123 % 10 = 3
12 % 10 = 2
1 % 10 = 1
0
# 12345 => 54321
ret = 0
ret = ret * 10 + temp
50 + 4 = 54
540 + 3 = 543
5430 + 2 = 5432
54320 + 1 = 54321
"""
def reverse(number):
    ret = 0
    while number != 0:
        temp = number % 10
        number //= 10
        ret = ret * 10 + temp
    return ret

def is_palindrome(number):
    # 反转数字
    # reverse_num = reverse(number)
    # 将反转数字和原数字进行对比
    return number == reverse(number)

number = int(input("Enter a number:"))
print(is_palindrome(number))

练习03 计算三角形面积

编写函数,读入三角形三边的值,若输入有效则计算面积,否则显示输入无效。

def is_valid(side1, side2, side3):
def area(side1, side2, side3):
def is_valid(s1, s2, s3):
    # if s1 + s2 > s3 and s1 + s3 > s2 and s2 + s3 > s1:
    #     return True
    # return False
    return s1 + s2 > s3 and s1 + s3 > s2 and s2 + s3 > s1

def area(s1, s2, s3):
    s = (s1 + s2 + s3) / 2
    return (s * (s - s1) * (s - s2) * (s - s3)) ** 0.5

if __name__ == "__main__":
    #1.输入三边
    side1, side2, side3 = map(int, input("Enter three sides:").split(" "))
    #2.判断是否符合三角形的性质
    if is_valid(side1, side2, side3):
        #3.1 符合 计算面积
        result = area(side1, side2, side3)
        print(result)
    else:
        #3.2 不符合 提示信息
        print("三边不符合三角形的性质")

练习04 显示0和1构成的矩阵

编写函数,打印一个元素由随机0或1产生的 n × n 矩阵。

def print_matrix(n):
import random
def print_matrix(n):
    for i in range(n):
        for j in range(n):
            num = random.randint(0, 1) #[0, 1] 整数
            print(num, end=" ")
        print()

if __name__ == "__main__":
    n = int(input("Enter n:"))
    print_matrix(n)
"""
0 0 0
1 0 1
0 1 0
"""

练习05 平方根的近似求法

有几种实现开平方 n \sqrt{n} n 的技术,其中一个称为巴比伦法

它通过使用下面公式的反复计算近似地得到:
n e x t G u e s s = ( l a s t G u e s s + n / l a s e t G u e s s ) / 2 nextGuess=(lastGuess+n/lasetGuess)/2 nextGuess=(lastGuess+n/lasetGuess)/2
当nextGuess和lastGuess几乎相同时,nextGuess就是平方根的近似值

lastGuess初始值为1,如果nextGuess和lastGuess的差值小于一个很小的数,比如0.0001,就可以认为nextGuess是n的平方根的近似值;否则,nextGuess成为下一次计算的lastGuess,近似过程继续执行

编写代码,求解n的平方根的近似值

def sqrt(n):
def sqrt(n):
    lastGuess = 1
    nextGuess = 0
    while True:
        nextGuess = (lastGuess + n / lastGuess) / 2
        dif = abs(lastGuess - nextGuess)
        if dif < 0.0001:
            return nextGuess
        else:
            lastGuess = nextGuess
print(sqrt(9))
print(sqrt(81))
print(sqrt(2))

练习06 掷色子

掷两个色子,每个色子由六个面,分别表示1,2,3,4,5,6。

每次掷塞子检查两个色子的和:

(1)如果为2,3或12,你就输了;

(2)如果为7或11,你就赢了;

(3)如果是其他数字(4,5,6,8,9,10),标记为 point,接着继续掷色子;

(4)直到掷出一个7或者和point相同的点数。

(5)如果掷出为7,则你输了;如果掷出的点数和point相同,你就赢了。

import random
count = 0
def play_game_level_2(point):
    while True:
        num = random.randint(2, 12)
        global count
        count += 1
        print(f"第{count}次掷色子:{num}")
        if num == 7:
            print("第二层逻辑下:输了")
            return
        elif num == point:
            print("第二层逻辑下:赢了")
            return
    
def play_game_level_1():
    num = random.randint(2, 12)
    global count
    count += 1
    print(f"第{count}次掷色子:{num}")
    if num == 2 or num == 3 or num == 12:
        print("第一层逻辑下:输了")
        return
    elif num == 7 or num == 11:
        print("第一层逻辑下:赢了")
        return
    else:
        play_game_level_2(num)

if __name__ == "__main__":
    play_game_level_1()

练习07 打印日历

以2000年1月1日周六为基准,打印一个年份的日历

请输入年份(2000年起步):2025
          一月
————————————————————————————
一  二  三  四  五  六  日
        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

          二月
————————————————————————————
一  二  三  四  五  六  日
                    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

          三月
————————————————————————————
一  二  三  四  五  六  日
                    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
......
# 基准年月日 全局变量
BEGIN_YEAR = 2000
BEGIN_MONTH = 1
BEGIN_WEEK = 6

# 将月份的数字转汉字
def get_month_str(month):
    if month == 1:
        return "一月"
    elif month == 2:
        return "二月"
    elif month == 3:
        return "三月"
    elif month == 4:
        return "四月"
    elif month == 5:
        return "五月"
    elif month == 6:
        return "六月"
    elif month == 7:
        return "七月"
    elif month == 8:
        return "八月"
    elif month == 9:
        return "九月"
    elif month == 10:
        return "十月"
    elif month == 11:
        return "十一月"
    elif month == 12:
        return "十二月"

# 打印month月的内容
def print_month_title(month):
    print("          ", get_month_str(month))
    print(" ---------------------------")
    print("  一  二  三  四  五  六  日")
    print()

# 判断year是否为闰年
def is_leapyear(year):
    return 400 % year == 0 or (year % 4 == 0 and year % 100 != 0)

# 获取year年month月的天数
def get_days_count(year, month):
    if month in [1, 3, 5, 7, 8, 10, 12]:
        return 31
    elif month in [4, 6, 9, 11]:
        return 30
    elif is_leapyear(year):
        return 29
    else:
        return 28

def get_days_begin(year, month):
    # 核心:计算距离2000年1月1日 有多少天(整年 整月)
    # 2002年3月 其实 2000年 + 2001年 + 1月 + 2月
    # 先累计年的天数
    total_days = 0
    for i in range(BEGIN_YEAR, year):
        if is_leapyear(i):
            total_days += 366
        else:
            total_days += 365
    # 再累计月的天数(当年的第1月)
    for i in range(BEGIN_MONTH, month):
        total_days += get_days_count(year, i)

    return (total_days % 7 + BEGIN_WEEK) % 7

# 打印year年month月的具体内容
def print_month_body(year, month):
    # 本月总共多少天
    days_count = get_days_count(year, month)
    # 本月的第一天是周几
    days_begin = get_days_begin(year, month)
    # 布局日期
    cur_count = 0 # 记录打印的次数 每7次换行
    # 打印前置空格
    for i in range(days_begin):
        print("    ", end="")
        cur_count += 1
    # 打印具体的日期
    for i in range(1, days_count + 1):
        print("%4d" % i, end="")
        cur_count += 1
        if cur_count % 7 == 0:
            print()
    print()

# 打印year年month月的内容
def print_month(year, month):
    # 先打印标题
    print_month_title(month)
    # 再打印内容
    print_month_body(year, month)


# 打印year年的日历 12个月
# 分别把每个月的日历都要打印出来
def print_calendar(year):
    for month in range(1, 13):
        # 打印month月的日历
        print_month(year, month)


if __name__ == "__main__":
    year = int(input("请输入年份(2000年起步):"))
    # 打印year年的日历
    print_calendar(year)

你可能感兴趣的:(python,开发语言,算法)