Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python 3中,如何将input()函数放入def函数中_Python_Python 3.x_Function_Input - Fatal编程技术网

在python 3中,如何将input()函数放入def函数中

在python 3中,如何将input()函数放入def函数中,python,python-3.x,function,input,Python,Python 3.x,Function,Input,我正在处理我在一本书中找到的collatz序列,我想输入数字,但它不起作用,当我输入数字时,回车键不起作用,我的程序有什么错误吗 even = range(0,10**5,2) odd = range(1,10**5,2) def collatz_s(num): while num !=1 : if num in even : result = num /2 print(result) num =

我正在处理我在一本书中找到的collatz序列,我想输入数字,但它不起作用,当我输入数字时,回车键不起作用,我的程序有什么错误吗

even = range(0,10**5,2)
odd = range(1,10**5,2)

def collatz_s(num):
    while num !=1 :
        if num in even :
            result = num /2
            print(result)
            num = result

        elif num is odd :
            result = num *3+1
            num = result
            print(result)


num = int(input('choose a random number'))
collatz_s(num)

问题在
elif
块中,这里
elif num是奇数:
change
is
to
in
处理余数时,使用
整数除法(//)
来避免
精度
错误

def collatz_s(num):
    while num != 1:
        if num in even:
            result = num // 2
            print(result)
            num = result

        elif num in odd:
            result = num * 3 + 1
            print(result)
            num = result



num = int(input('choose a random number'))
collatz_s(num) 
# input 5
# output 

16
8
4
2
1

要检查一个数字是奇数还是偶数,而不是生成
range
对象并检查这些对象中的一个数字是否为
,请查看除以2的余数,可以使用
num%2
获得。如果剩余值为1,则表示该数字为偶数。否则,这很奇怪

另外,使用
num//2
执行整数除法。用16除以2会得到8(整数),而不是8.0(浮点数)。事实证明,这在这里非常重要,特别是因为你对求除法的余数感兴趣(这个概念主要涉及整数)

我相信浮点除法中的舍入错误很可能会使程序进入无限循环(因为小数点很小的数字既不在
偶数范围内,也不在
奇数范围内),或者超过了范围的限制(105)您将处于两个分支都不匹配的相同情况。使用整数除法和使用余数检查偶数或奇数应该可以解决这两个问题

def collatz_s(num):
    while num != 1:
        if num % 2 == 0:
            num = num // 2
            print(num)
        else:
            num = num * 3 + 1
            print(num)

是的,它现在正在工作,但该程序不支持大数字。它将支持大数字,但需要很长时间。想一个有效的方法。@Tasnuva如果你在奇数中引用
,在偶数中引用
它已经是常数时间了,范围对象具有常数时间成员身份checking@YassineRemmal那是因为你对你的偶数和奇数使用固定的数量。这不是检查某物是否为偶数或奇数的正常方法,您应该使用
编号%2
@Tasnuva否,它不是迭代,它不是
列表
对象它是
范围
对象,它为
int
objects实现了常量时间成员身份测试。您所说的范围在Python 3中绝对不正确。我可以在范围(0,10**20,2)内执行
5*10**19操作,并立即得到答案-不可能迭代那么多值。(在Python2中,您所说的是正确的,但问题明确地说是Python3。)也就是说,显然我同意您的测试更好,因为OP对范围的使用对数字必须落下的范围施加了任意限制(或者它既不是
偶数
也不是
奇数
)。但是你关于费用的陈述应该被删除。@alani是的,你是对的,有一个特殊的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我会更新我的答案。@filbranden没有列表<代码>范围
对象具有int对象的恒定时间成员身份测试。它们也是恒定的空间,但你的总体建议是好的。这种方法确实在大量使用中。谢谢。请澄清问题。你认为问题出在哪里?你是怎么对付那个问题的?