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"
我们有一个作业让我难住了。我们必须编写一个名为 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"