Python 序号脚本

Python Ordinal Number Script

我们有一个作业让我难住了。我们必须编写一个名为 int2ordinal 的函数来解决以下任务:

任何以 11、12 或 13 结尾的数字都使用 th 后缀

所有以 1 结尾的剩余数字都使用 st 后缀

所有以 2 结尾的剩余数字使用 nd 后缀

所有以 3 结尾的剩余数字都使用 rd 后缀

所有剩余号码使用 th 后缀

所以基本上写了一个名为 int2ordinal 的函数,它接受一个整数作为它唯一的参数,returns 带有适当后缀的数字作为它的结果(存储在一个字符串中)。例如,如果函数被传递给 整数 1 那么它应该 return 字符串“1st”。如果它传递的是整数 12,那么它应该 return 字符串“12th”。如果它在 2003 年通过,那么它应该 return 字符串“2003rd”。

我们正在使用余数运算符通过计算整数除以 10 的余数来提取整数的最后一位,我们正在做同样的事情来提取整数的最后两位除以100. 例如 29 % 10 是 9 而 1911 %100 是 11。然后我们可以构造需要由函数 returned 的字符串,方法是将整数参数转换为字符串并使用+ 运算符。

这是我们目前的代码,我们认为前半部分完全不正确:

def int2ordinal(day, month, year):

    if day % 10 == 1: return (str(day + "st"))
    if day % 10 == 2: return (str(day + "nd"))
    if day % 10 == 3: return (str(day + "rd"))
    if month % 10 == 1: return (str(month + "st"))
    if month % 10 == 2: return (str(month + "nd"))
    if month % 10 == 3: return (str(month + "rd"))
    if year % 100 == 1: return (str(year + "st"))
    if year % 100 == 2: return (str(year + "nd"))
    if year % 100 == 3: return (str(year + "rd")) 
    for i in range (11, 13): return (str(day + "th"))
    for i in range (11, 13): return (str(month + "th"))
    for i in range (11, 13): return (str(year + "th"))
    else: return (str(day + "th", month + "th", year + "th"))

def main():

  day = int(input("Enter a day between 1 and 31: "))
  month = int(input("Enter a month between 1 and 12: "))
  year = int(input("Enter a year between 1 and 2100: "))

  print("On the", int2ordinal(day), "day of the", int2ordinal(month), \
        "month of the", int2ordinal(year), "year, something amazing happened!")

main()

任何帮助都会很棒!

为什么不保持简单?虽然未经测试,但应该可以。

def int2ordinal(num):
    def formatted_num(suffix):   # Nested function.
        return str(num) + suffix

    end_digits = int(num[-2:])   # Gets last 2 chars of the string. Instead of repeating this operation on every if clause, better do it here.
    # You only really need to check if it either finishes with 1,2,3 - remaining values will have a th suffix.
    if end_digits in [1]:
        return formatted_num('st')
    elif end_digits in [2]:
        return formatted_num('nd')
    elif end_digits in [3]:
        return formatted_num('rd')
    else:
        return formatted_num('th')

def main():

  day = input("Enter a day between 1 and 31: ")
  month = input("Enter a month between 1 and 12: ")
  year = input("Enter a year between 1 and 2100: ")

  print("On the", int2ordinal(day), "day of the", int2ordinal(month), \
        "month of the", int2ordinal(year), "year, something amazing happened!")

main()

根据您在评论中的回答,然后执行以下操作:

def int2ordinal(num):
    num = str(num)
    if len(num) > 2:  # Will be a year, not necessarily consisting of four digits. Could be 333
        end_digits = int(num) % 100
    else:   # Will be month / day
        end_digits = int(num) % 10
    if end_digits == 1: return (num + "st")
    if end_digits == 2: return (num + "nd")
    if end_digits == 3: return (num + "rd")
    else: return (num + "th")


def main():

  day = input("Enter a day between 1 and 31: ")
  month = input("Enter a month between 1 and 12: ")
  year = input("Enter a year between 1 and 2100: ")

  print("On the", int2ordinal(day), "day of the", int2ordinal(month), \
        "month of the", int2ordinal(year), "year, something amazing happened!")

main()

一般来说,尽量避免重复代码。如果您查看原始代码,您会发现每个子句都是 运行 num % 10/100 并且每个 return 都转换为 str (这里没有性能损失,但重复逻辑)。最好尽可能避免重复这样的调用,即使这段代码不是资源密集型的,正如你所说的你是一个业余爱好者:越早学习越好。

此外,您的原始代码总是会失败的一个原因是它有三个参数,您总是要花一天时间给它。命名参数的工作方式如下:

def foo(a,b,c):
    pass

foo(a=0)
foo(b=1)
foo(c=2)

正在做: foo(3)

结果 foo() 得到参数 a,b 和 c 将是 None

为什么不让它更简单一些?

您可以在下面找到它并通过使用 pip install mknxgn_essentials 然后使用 asordinal = essentials.GetOrdinal(my_num)

在您的所有代码中使用它
def GetOrdinal(number):
     if type(number) != type(1):
         try:
             number = int(number)
         except:
             raise ValueError("This number is not an Int!")
    lastdigit = int(str(number)[len(str(number))-1])
    last2 = int(str(number)[len(str(number))-2:])
    if last2 > 10 and last2 < 13:
        return str(number) + "th"
    if lastdigit == 1:
        return str(number) + "st"
    if lastdigit == 2:
        return str(number) + "nd"
    if lastdigit == 3:
        return str(number) + "rd"
    return str(number) + "th"