将参数数量限制为用户输入的数字

Limiting number of parameters to a number inputed by the user

我正在尝试将用户定义的参数数量限制为用户在第一行输入中首先定义的输入数量。 nexon = input('Number of exons')

(即如果用户输入 2,我希望用户输入 2 个参数的值,ex1ex2 如果他们输入 3,我希望他们输入 3 个参数的值,ex1,ex2,ex3 等等。)输入参数值后,我想按照下面显示的数学求和。

这是代码。我正在努力解决为什么 python 在 if 语句中时不请求 ex1、ex2 等的输入。有没有办法使用 for 循环对其进行优化?

这段代码只考虑了4个输入的可能性,理想情况下我希望它能够考虑任意数量的输入。

我要合并的数学公式就是这个

nexon = input('Number of exons:')

if nexon == 1:
  ex1 = input("Exon 1 lenght:")
if nexon == 2:
  ex1 = input("Exon 1 lenght:")
  ex2 = input("Exon 2 lenght:")
if nexon == 3:
  ex1 = input("Exon 1 lenght:")
  ex2 = input("Exon 2 lenght:")
  ex3 = input("Exon 3 lenght:")
if nexon == 4:
  ex1 = input("Exon 1 lenght:")
  ex2 = input("Exon 2 lenght:")
  ex3 = input("Exon 3 lenght:")
  ex4 = input("Exon 3 lenght:")

EL1 = int(ex1)
EL2 = int(ex2)
EL3 = int(ex3)
EL4 = int(ex4)

IP1 = (EL1%3)
IP2 = (EL1+EL2)%3
IP3 = (EL1+EL2+EL3)%3
IP4 = (EL1+EL2+EL3+EL4)%3

print('exon 1 phase IP1',IP1)
print('exon 2 phase IP2',IP2)
print('exon 3 phase IP3',IP3)
print('exon 3 phase IP4',IP4)```

你可以做到

nexon = int(input('Number of exons: '))

# stores key:value pairs where e.g. key = 'ex1' and value an int
d = {}
# stores key:value pairs where e.g. key = 'ip1' and value an int
e = {}
for i in range(nexon):
  d[f"ex{i + 1}"] = int(input(f"Exon {i + 1} length: "))
  e[f"ip{i + 1}"] = sum(d[key] for idx, key in enumerate(d) if idx < i + 1) % 3

print()
for i in range(nexon):
  print(f"Exon {i + 1} phase IP{i + 1}", e[f"ip{i + 1}"])

print(f"\nd: {d}\ne: {e}")

示例会话:

Number of exons: 3
Exon 1 length: 5
Exon 2 length: 2
Exon 3 length: 1

Exon 1 phase IP1 2
Exon 2 phase IP2 1
Exon 3 phase IP3 2

d: {'ex1': 5, 'ex2': 2, 'ex3': 1}
e: {'ip1': 2, 'ip2': 1, 'ip3': 2}

您可以使用循环重复请求用户输入。

关于取模计算,为了效率可以使用numpy:

nexon = int(input('Number of exons:'))

lengths = []
for i in range(nexon):
    lengths.append(int(input(f"Exon {i+1} lenght:")))

import numpy as np

IPs = (np.array(lengths).cumsum()%3).tolist()
    
for i, ip in enumerate(IPs, start=1):
    print(f'exon {i} phase IP{i} {ip}')

示例:

Number of exons:4
Exon 1 lenght:1
Exon 2 lenght:3
Exon 3 lenght:5
Exon 4 lenght:8
exon 1 phase IP1 1
exon 2 phase IP2 1
exon 3 phase IP3 0
exon 4 phase IP4 2

python 仅版本:

nexon = int(input('Number of exons:'))

cum_lengths = []
v = 0
for i in range(nexon):
    cum_lengths.append(v+int(input(f"Exon {i+1} lenght:")))
    v = cum_lengths[-1]

IPs = [v%3 for v in cum_lengths]
    
for i, ip in enumerate(IPs, start=1):
    print(f'exon {i} phase IP{i} {ip}')

1。为什么当前代码不能正常工作

Python 不请求外显子输入的原因是因为您正在比较 strint

Python 3 的 input() 函数总是 returns 一个 str 即使用户输入了一个数字,但你将它与 int 进行比较.相反,您首先需要使用 int(nexon)str 转换为 int。但是,如果用户输入的不是整数,这会报错,最好在尝试转换之前检查一下,如果用户没有输入数字,请再次询问,以避免出错。

这可以通过以下方式完成:

nexon = input("Enter the number of exons: ")
while not nexon.isdigit():
    nexon = input("Number of exons must be a nonnegative integer. Please try again: ")
nexon = int(nexon)

2。如何使用 for 循环

您可以使用 for 循环输入所有长度并将它们添加到列表中,然后将它们全部输出模 3。

您可以按照以下方式执行此操作:

exon_lengths = []
for i in range(nexon):
    exon_length = input(f"Enter the length of exon {i + 1}: ")
    while True:
        try:
            exon_lengths.append(float(exon_length))
            break
        except ValueError:
            exon_length = input("Exon length must be a number. Please try again: ")

3。完整代码

nexon = input("Enter the number of exons: ")
while not nexon.isdigit():
    nexon = input("Number of exons must be a nonnegative integer. Please try again: ")
nexon = int(nexon)

exon_lengths = []
for i in range(nexon):
    exon_length = input(f"Enter the length of exon {i + 1}: ")
    while True:
        try:
            exon_lengths.append(float(exon_length))
            break
        except ValueError:
            exon_length = input("Exon length must be a number. Please try again: ")

for i, l in enumerate(exon_lengths, start=1):
    print(f"Exon {i} phase IP{i}: {l}")