1. 程式人生 > >似乎解禁了,發幾個Python小程式試下

似乎解禁了,發幾個Python小程式試下

部落格被封了好長時間了,今天發現似乎解禁了,試一下現在的發帖系統。

# !/usr/bin/env python3
# -*- coding:utf-8 -*-
# author:怦然☆動

# 匯入模組
from decimal import *
import math


def tower(x = 1, n = 5):
    """
     把從x開始的整數排列成n行塔形
     :param x:
     :param n:
     :return:
     """
    while x <= n:
        i = x
        for y in range(x):
            print(i, end=" ")
            i = i + n - y - 1
        print()
        x += 1


def prime(m = 2, n = 1000):
    """
     篩選法計算質數,據說是效率最高的,I7 8350U 計算 10,000,000 以內的質數只需要不到 15 秒
     :param m: 輸出範圍的下限
     :param n: 輸出範圍的上限
     :return: 從 2 到上限範圍內的所有質數
     """
    mark = [True] * (n +1)
    for i in range(2, int(math.sqrt(n)) + 1):
        j = i
        k = j
        while j * k < n + 1:
            mark[j * k] = False
            k += 1
    result = []
    sums = 0
    for i in range(m, n +1):
        if mark[i] == True:
            print(i, end= "\t")
            result.append(i)
            sums += 1
            if sums % 20 == 0:
                print("")
    print("")
    return result


def reverseNumber(n = -123):
    """
     將數字除符號外倒序排列,比如“123”轉換為“321”,“-123”轉化為“-321”
     :param n:
     :return:
     """
    if n < 0:
        f = -1
    else:
        f = 1
    s = str(n * f)
    s = s[::-1]  # name[x:y:z]中x表示起始位置(預設為0),y終止位置的前一個(預設為len-1),z步長(預設為1)
    n = int(s) * f
    return n


def convertChar(text = ""):
    """
     1、所有母音字母輸出小寫
     2、所有子音字母輸出大寫
     3、其他字元輸出“*”
     :param text: 需要轉換的字串
     :return: 轉換後的字串
     """
    char_List = [chr(x) for x in range(ord("A"), ord("Z")+1)]
    char_List.append(" ")
    vowel = ["A", "E", "I", "O", "U"]
    text = text.upper()
    conv_List = []
    for c in text:
        if c not in char_List:
            conv_List.append("*")
        elif c in vowel:
            conv_List.append(c.lower())
        else:
            conv_List.append(c)
    result = "".join(conv_List)
    return result


def str_wday(wday= 0):
    """
     返回中文星期幾
     :param wday: [0, 6]之間的一個數字
     :return:
     """
    d = {
        0: "星期日",
        1: "星期一",
        2: "星期二",
        3: "星期三",
        4: "星期四",
        5: "星期五",
        6: "星期六",
   }
    return d.get(wday)


def robbits(month = 3, ini_number = 1, adult = 3):
    """
     有 ini_number 對小兔子,出生後第 adult 個月起每個月都生一對兔子,
     小兔子長到第 adult 個月後每個月又生一對兔子,
     假如兔子都不死,問 month 個月內,每個月的兔子總數為多少對?
     :param robbit_Number[adult]: 每個月兔子總數的序列表
     :param month: 需要計算多少個月的兔子數目
     :param ini_number: 初始擁有的小兔子數目
     :param adult: 成年時間,預設為第3個月即成年可以生小兔子
     :return: 返回每個月的總兔子數目列表
     """
    robbit_Number = [ini_number for x in range(0, adult - 1)]
    for x in range(adult - 1, month):
        robbit_Number.append(robbit_Number[x - 1] + robbit_Number[x - adult])
    return robbit_Number


def certID(idStr = "66666619880808008"):
    """
     根據身份證前面17位計算身份證第18位驗證碼
     :param idStr: 字串方式的身份證號碼前17位
     :return certChar: 完整的身份證號碼
     """
    factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    last = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"]
    certChar = ""
    totles = 0
    lens = len(idStr)
    if lens == 17:
        for i in range(lens):
            totles += eval(idStr[i]) * factor[i]
        certChar = last[totles % 11]
    certChar = idStr + certChar
    return certChar


def gongYinshu(m, n):
    """
     計算最大公約數
     :param m: 整數
     :param n: 整數
     :return: 最大公約數
     """
    c = m % n
    while (c):
        m = n
        n = c
        c = m % n
    return n


def gongBeishu(m, n):
    """
     計算最小公倍數
     :param m: 整數
     :param n: 整數
     :return: 最小公倍數
     """
    return (int(m * n / gongYinshu(m, n)))


def bbp(n):
    """
     計算 n 位精度的圓周率
     :param n: 需要計算的小數位數
     :return: n 位 Pi
     """
    getcontext().prec = n
    my_Pi = Decimal(0)
    k = 0
    while k <= n:
        my_Pi += (Decimal(1) / (16 ** k)
                  ) * ((Decimal(4) / (8 * k + 1)
                        ) - (Decimal(2) / (8 * k + 4)
                             ) - (Decimal(1) / (8 * k + 5)
                                  ) - (Decimal(1) / (8 * k + 6)
                                       )
                       )
        k += 1
    return my_Pi


if __name__ == "__main__":
    tower(1, 9)
    n = 1234
    m = 666
    prime()
    print(f"{n}的顛倒數字, {reverseNumber(n)}")
    text = "My car Goes very FAST!"
    print(convertChar(text))
    print(f"19個月內每月兔子總數: {robbits(19, 2)}")
    print("certID:" + certID("66666619880808008"))
    print(f"{n}和{m}的最大公因數是:{gongYinshu(n, m)}")
    print(f"{n}和{m}的最小公倍數是:{gongBeishu(n, m)}")
    print("Pi = " + str(bbp(n)))